Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to draw lines over ImageView on Android?

I am trying to develop a simple map application, which will display a map in the screen.

When the user moves the cursor on screen, I want to display 2 perpendicular lines over my map. I had tried many examples to get an idea for that, but unfortunately, didn't succeed. How can I make this?

And as one previous questionhere I had tried. but didn't get the answer. Can anyone guide me?

My main.xml is as following:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <LinearLayout android:layout_width="wrap_content"
        android:layout_height="wrap_content">
    <ImageView android:id="@+id/main_imagemap"
        android:src="@drawable/worldmap"
        android:clickable="true"
        android:layout_width="fill_parent" 
        android:layout_height="wrap_content"/>
    </LinearLayout>

</LinearLayout>

And my activity file(i had just started it..)

import android.app.Activity;
import android.os.Bundle;
import android.widget.ImageView;

public class LineMapActivity extends Activity 
{


    public void onCreate(Bundle savedInstanceState) 
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        ImageView map_image = (ImageView)findViewById(R.id.main_imagemap);

    }
}

And as in that link, i had also added MyImageView.

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.widget.ImageView;

public class MyImageView extends ImageView
{

    public MyImageView(Context context) {
        super(context);
        // TODO Auto-generated constructor stub
    }

    @Override
    protected void onDraw(Canvas canvas) {
        // TODO Auto-generated method stub
        Paint p = new Paint(Paint.ANTI_ALIAS_FLAG);
        canvas.drawLine(0, 0, 20, 20, p);
        super.onDraw(canvas);
    }
}

Now how can i add this MyImageView to my app?

like image 923
Dil Se... Avatar asked Jan 12 '12 07:01

Dil Se...


2 Answers

Finally I figured out a solution. It's a simple program which draws a line over an Image.

Here is my main.xml file (com.ImageDraw.MyImageView is my custom view, code below):

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <LinearLayout android:layout_width="wrap_content"
        android:layout_height="wrap_content">
    <com.ImageDraw.MyImageView android:id="@+id/main_imagemap"
        android:layout_width="fill_parent" 
        android:layout_height="wrap_content"/>
    </LinearLayout>
</LinearLayout>

And here is the main activity:

import android.app.Activity;
import android.os.Bundle;

public class MyActivity extends Activity 
{
    public void onCreate(Bundle savedInstanceState) 
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
    }
}

and this is my custom image view (MyImageView):

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.util.AttributeSet;
import android.util.Log;
import android.view.SurfaceHolder;
import android.view.SurfaceView;

public class MyImageView extends SurfaceView implements SurfaceHolder.Callback
{
    private CanvasThread canvasthread;

    public MyImageView(Context context) {
        super(context);
        getHolder().addCallback(this);
        canvasthread = new CanvasThread(getHolder(), this);
        setFocusable(true);
    }

    public MyImageView(Context context, AttributeSet attrs)
    {
        super(context,attrs);
        getHolder().addCallback(this);
        canvasthread = new CanvasThread(getHolder(), this);
        setFocusable(true);
    }

    protected void onDraw(Canvas canvas) {
        Log.d("ondraw", "ondraw");
        Paint p = new Paint();
        Bitmap mapImg = BitmapFactory.decodeResource(getResources(), R.drawable.mybitmap);
        canvas.drawColor(Color.BLACK);
        canvas.drawBitmap(mapImg, 0, 0, null);
        p.setColor(Color.RED);
        canvas.drawLine(0, 0, 100, 100, p);
    }

    public void surfaceChanged(SurfaceHolder holder, int format, int width,
            int height) {
    }

    public void surfaceCreated(SurfaceHolder holder) {
        canvasthread.setRunning(true);
        canvasthread.start();
    }

    public void surfaceDestroyed(SurfaceHolder holder) {
        boolean retry = true;
        canvasthread.setRunning(false);
        while (retry)
        {
            try
            {
                canvasthread.join();
                retry = false;
            }
            catch (InterruptedException e) {
                // TODO: handle exception
            }
        }
    }
}

And finally here is my CanvasThread:

import android.graphics.Canvas;
import android.view.SurfaceHolder;

public class CanvasThread extends Thread
{
    private SurfaceHolder surfaceHolder;
    private MyImageView myImageView;
    private boolean run = false;

    public CanvasThread(SurfaceHolder s, MyImageView m)
    {
        surfaceHolder = s;
        myImageView = m;
    }

    public void setRunning(boolean r)
    {
        run = r;
    }

    public void run()
    {
        Canvas c;
        while(run)
        {
            c=null;
            try
            {
                c= surfaceHolder.lockCanvas(null);
                synchronized (surfaceHolder) {
                    myImageView.onDraw(c);
                }
            }
            finally
            {
                if(c!=null)
                {
                    surfaceHolder.unlockCanvasAndPost(c);
                }
            }
        }
    }
}

You can find more details in this tutorial

like image 191
Dil Se... Avatar answered Oct 03 '22 08:10

Dil Se...


Error you are getting because you are trying to casting ImageView object to MyImageView object.

like image 40
jeet Avatar answered Oct 03 '22 07:10

jeet