Cómo dibujar líneas sobre ImageView en Android?

Estoy tratando de desarrollar una aplicación de mapa simple, que mostrará un mapa en la pantalla.

Cuando el usuario mueve el cursor en la pantalla, quiero mostrar 2 líneas perpendiculares sobre mi mapa. Yo había probado muchos ejemplos para tener una idea para eso, pero por desgracia, no tuvo éxito. ¿Cómo puedo hacer esto?

Y como una pregunta anterior aquí lo había intentado. Pero no obtuve la respuesta. ¿Puede alguien guiarme?

Mi main.xml es como sigue:

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

Y mi archivo de actividad (acababa de empezar ..)

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

Y como en ese enlace, también había añadido 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); } } 

Ahora, ¿cómo puedo añadir este MyImageView a mi aplicación?

Finalmente me imaginé una solución. Es un programa sencillo que dibuja una línea sobre una imagen.

Aquí está mi archivo main.xml (com.ImageDraw.MyImageView es mi vista personalizada, código abajo):

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

Y aquí está la actividad principal:

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

Y esta es mi vista de imagen personalizada (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 } } } } 

Y finalmente aquí está mi 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); } } } } } 

Puede encontrar más detalles en este tutorial

Error que está obteniendo porque está intentando convertir objeto de ImageView en el objeto MyImageView.

Sólo tienes que arreglar el xml para incluir tu objeto en lugar de una vista de imagen como tal (ten en cuenta que com.your.package.MyImageView debe ser el nombre completo del paquete del paquete que contiene tu clase y luego el nombre de la clase)

 <?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> 
  • Android Dash / edición de línea doted?
  • Cámara Android: la intención de los datos devuelve null
  • Cómo girar / voltear androide imageView?
  • ¿Ajustar la imagen grande en imagen pequeña con tan buena calidad como la imagen original?
  • Personalizable con ImageView
  • Android: imageView.getDrawable () devuelve null
  • Código de Android para rotar una vista de imagen al tocar o arrastrar evento
  • Animación de una imagen con ImageView
  • ¿Cuál es el significado de la palabra ImageView.ScaleType = "MATRIX"?
  • ¿Cómo puedo hacer bordes rizados en una vista de imagen en android?
  • La dimensión de la pantalla del dispositivo tiene un efecto extraño en las imágenes a escala
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.