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?
- Animación de botón pulsante android
- HorizontalScrollView o Carrousel?
- ¿Cuándo (si es que) debería usar Bitmap.recycle ()?
- 'Falta el atributo contentDescription en la imagen' en XML
- Cómo obtener la imagen de url sitio web en imageview en android
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?
- Outofmemeoryerror (viewpager + visiones de imagen)
- Cuando haga clic en un botón, gire la imagen en sentido horario en android
- ¿Cómo crear un diseño doblado personalizado con imageview y texto android?
- Cómo hacer las imágenes más grandes (en altura) en la lista perezosa
- Añadir degradado a la vista de imagen
- ¿Colocar un ImageView en el centro con el ancho y la altura para ser la mitad del ancho de los padres?
- Cómo crear una imageView con parámetros id y src?
- Cómo establecer un texto sobre una imagen?
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: Hacer la conexión de la aplicación en segundo plano en el arranque
- Ubicación por dirección IP en interiores