2012-01-12 69 views
6

我正在尝试开发一个简单的地图应用程序,它将在屏幕上显示地图。如何在Android上通过ImageView绘制线条?

当用户在屏幕上移动光标时,我想在我的地图上显示2条垂直线。我曾尝试过很多例子来获得这个想法,但不幸的是,它并没有成功。 我该如何做到这一点?

作为前一个问题here我曾试过。但没有得到答案。任何人都可以引导我?

我的main.xml是如下:

<?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> 

而且我的活动文件(我刚刚开始吧..)

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); 

    } 
} 

而且在该链接时,我也有加入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); 
    } 
} 

现在我该如何将MyImageView添加到我的应用程序?

+0

更多的细节?看看这个教程http://codemagician.wordpress.com/2010/05/06/android-google-mapview-tutorial-done-right/ – MikeIsrael 2012-01-12 07:50:21

+0

没有我亲爱的..我只是一个新的蜜蜂在andriod ..我是只需添加drawable的图像即可。我只是想研究如何在图像上方画线。就像在旧的黑莓手机 – 2012-01-12 07:58:35

+0

好吧,检查我的答案,它应该得到你想要的结果。 – MikeIsrael 2012-01-12 08:21:06

回答

4

最后我想出了一个解决方案。这是一个简单的程序,它在图像上绘制一条线。

这里是我的main.xml文件(com.ImageDraw.MyImageView是我的自定义视图,下面的代码):

<?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> 

这里是主要活动:

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); 
    } 
} 

,这是我的自定义图像视图(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 
      } 
     } 
    } 
} 

最后这里是我的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); 
       } 
      } 
     } 
    } 
} 

您可你为什么不使用的MapView和覆盖发现这tutorial

+2

特别感谢MikeIsrael,他帮了我很多...... 并且还去那个网站。 .. – 2012-01-13 10:00:20

+1

看起来不错。如果稍后发现您希望保留原始图像,则始终可以使图像视图与myimageview重叠。祝你好运! – MikeIsrael 2012-01-15 08:54:05

+0

你可以在xml中重叠一个relativelayout和align属性,只要搜索一下你就会发现很多信息。然后,只能在顶部的图像视图上绘制,并且如果需要,可以将底部留作擦除。 – MikeIsrael 2012-01-16 09:59:29

1

您正在尝试将ImageView对象转换为MyImageView对象时出现错误。

+0

然后我需要如何实现MyImageView,这是我在问题中给出的链接? 或者你可以显示我可以在imageview上方画线吗? – 2012-01-12 08:11:35

+0

请贴上完整的日志。 – jeet 2012-01-12 08:38:52

+0

亲爱的我已经更新了我的问题。希望你能明白我的要求。我再一次描述它,我想要一个显示图像作为背景的应用程序。也可以画线。所有这些代码都是我的实验。不确定这些代码的工作.. – 2012-01-12 08:45:56

1

只是修正XML,包括代替,像这样一个ImageView的你的对象(注意,com.your.package.MyImageView应该包含您的类的包全包名称,然后在类名)

<?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.your.package.MyImageView android:id="@+id/main_imagemap" 
     android:src="@drawable/worldmap" 
     android:clickable="true" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content"/> 
    </LinearLayout> 

</LinearLayout> 
+0

我有我的包作为包com.mymap; 因此我修改我的XML为 2012-01-12 08:26:34

+0

你可以发布logcat的错误? – MikeIsrael 2012-01-12 08:54:21

+0

这并没有什么帮助,你需要粘贴整个堆栈跟踪来找出错误的位置。 – MikeIsrael 2012-01-12 09:05:42