2012-01-12 40 views
6

Tôi đang cố gắng phát triển một ứng dụng bản đồ đơn giản, sẽ hiển thị bản đồ trên màn hình.Làm cách nào để vẽ các đường trên ImageView trên Android?

Khi người dùng di chuyển con trỏ trên màn hình, tôi muốn hiển thị 2 đường vuông góc trên bản đồ của tôi. Tôi đã thử nhiều ví dụ để có được một ý tưởng cho điều đó, nhưng thật không may, đã không thành công. Tôi làm cách nào để thực hiện việc này?

Và như một câu hỏi trước here Tôi đã thử. nhưng không nhận được câu trả lời. Bất cứ ai có thể hướng dẫn tôi?

main.xml của tôi là như sau:

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

Và tập tin hoạt động của tôi (tôi đã chỉ mới bắt đầu nó ..)

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

    } 
} 

Và như trong liên kết đó, tôi cũng đã thêm 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); 
    } 
} 

Làm cách nào để thêm MyImageView này vào ứng dụng của tôi?

+0

tại sao bạn không sử dụng MapView và lớp? hãy xem hướng dẫn này http://codemagician.wordpress.com/2010/05/06/android-google-mapview-tutorial-done-right/ – MikeIsrael

+0

không thân yêu của tôi .. tôi chỉ là một con ong mới trong andriod .. tôi sáng chỉ cần thêm một hình ảnh từ drawables. tôi chỉ muốn nghiên cứu làm thế nào để vẽ dòng trên một hình ảnh .. giống như trong điện thoại blackberry cũ –

+0

ok cũng kiểm tra câu trả lời của tôi nó sẽ giúp bạn có được kết quả mà bạn muốn. – MikeIsrael

Trả lời

4

Cuối cùng tôi đã tìm ra một giải pháp. Đó là một chương trình đơn giản vẽ một đường thẳng trên một hình ảnh.

Đây là tập tin main.xml tôi (com.ImageDraw.MyImageView là quan điểm của tôi tùy chỉnh, mã dưới đây):

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

Và đây là hoạt động chính:

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

và đây là chế độ xem hình ảnh tùy chỉnh của tôi (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 
      } 
     } 
    } 
} 

Và cuối cùng đây là CanvasThread của tôi:

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

Bạn có thể tìm thêm chi tiết trong này tutorial

+2

một lời cảm ơn đặc biệt để MikeIsrael, người đã giúp tôi rất nhiều .... Và đến trang web đó cũng có. .. –

+1

có vẻ tốt. Nếu sau này bạn thấy rằng bạn sẽ muốn giữ lại hình ảnh gốc, bạn luôn có thể có một số lần xem ảnh chồng lên nhau bởi một myimageview. Chúc may mắn! – MikeIsrael

+0

bạn có thể chồng chéo trong xml với một relativelayout và sắp xếp các thuộc tính, chỉ cần tìm kiếm mà bạn sẽ tìm thấy tấn thông tin. Sau đó, bạn chỉ có thể vẽ trên các lần xem hình ảnh trên cùng và rời khỏi phần dưới cùng để xóa nếu bạn muốn. – MikeIsrael

1

Lỗi bạn đang gặp phải vì bạn đang cố gắng truyền đối tượng ImageView vào đối tượng MyImageView.

+0

sau đó làm thế nào tôi cần phải implenent MyImageView đó là trong liên kết mà tôi đã đưa ra trong câu hỏi? Hoặc bạn có thể cho tôi biết tôi có thể vẽ đường phía trên một lần xem hình không? –

+0

Vui lòng dán nhật ký đầy đủ. – jeet

+0

thân yêu tôi đã cập nhật câu hỏi của mình. hy vọng u sẽ có được ý tưởng những gì tôi đã hỏi. một lần nữa tôi sẽ mô tả nó, tôi muốn một ứng dụng hiển thị một hình ảnh làm nền. Và cũng có thể vẽ đường lên đó. Tất cả những mã đó là thí nghiệm của tôi. Không chắc chắn về những mã đó hoạt động .. –

1

Chỉ cần sửa chữa xml để bao gồm đối tượng của bạn thay vì một ImageView như vậy (lưu ý rằng com.your.package.MyImageView nên là tên trọn gói của gói chứa lớp học của bạn và sau đó tên lớp)

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

tôi có gói của tôi như gói com.mymap; và do đó tôi sửa đổi xml của tôi là

+0

bạn có thể đăng logcat cho lỗi? – MikeIsrael

+0

không thực sự hữu ích, bạn cần dán toàn bộ stacktrace để tìm ra lỗi của bạn ở đâu. – MikeIsrael

Các vấn đề liên quan