2010-01-31 15 views
18

¿Hay alguna otra forma de dibujar un objeto en un lienzo en Android?dibujar objeto/imagen en lienzo

Este código dentro de draw() no funciona:

Bitmap bmp = BitmapFactory.decodeResource(getResources(), R.drawable.pushpin);
canvas.drawBitmap(bmp, screenPts.x, screenPts.y-50, null);

Bueno, en realidad, que está trabajando en mi primera código, pero cuando he transferidos esta a otra clase llamada MarkOverlay, que no funciona más.

markerOverlay = new MarkerOverlay(getApplicationContext(), p); 
         listOfOverlays.add(markerOverlay);

¿Qué parámetro debo pasar a MarkerOverlay para que este código funcione? El error está en algún lugar en getResources().

FYI, canvas.drawOval está funcionando perfectamente, pero realmente quiero dibujar una imagen, no un óvalo. :)

Respuesta

22
package com.canvas; 

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.view.View; 

public class Keypaint extends View { 
    Paint p; 

    @Override 
    protected void onDraw(Canvas canvas) { 
     super.onDraw(canvas); 
     p=new Paint(); 
     Bitmap b=BitmapFactory.decodeResource(getResources(), R.drawable.icon); 
     p.setColor(Color.RED); 
     canvas.drawBitmap(b, 0, 0, p); 
    } 

    public Keypaint(Context context) { 
     super(context); 
    } 
} 
+7

Usted tiene que liberar los datos de mapa de bits con Bitmap.recycle() o de lo contrario se obtiene una pérdida de memoria desagradable: creando un nuevo mapa de bits en cada ciclo de dibujo. –

+5

No decodifique la imagen en onDraw: haga la mayor parte del trabajo pesado fuera del bucle de renderizado. – slott

14

Prefiero hacer esto, ya que sólo genera la imagen una vez:

public class CustomView extends View { 

    private Drawable mCustomImage; 

    public CustomView(Context context, AttributeSet attrs) { 
     super(context, attrs); 
     mCustomImage = context.getResources().getDrawable(R.drawable.my_image); 
    } 

    ... 

    protected void onDraw(Canvas canvas) { 
     Rect imageBounds = canvas.getClipBounds(); // Adjust this for where you want it 

     mCustomImage.setBounds(imageBounds); 
     mCustomImage.draw(canvas); 
    } 
} 
+5

+1 para no realizar asignaciones o desempaquetar una imagen en onDraw – user1532390

+1

me da esta advertencia de eclipse: Evite las asignaciones de objetos durante las operaciones de dibujo: Use Canvas.getClipBounds (Rect) en lugar de Canvas.getClipBounds() que asigna un Rect temporal – oat

+1

Esto puede ser hecho incluso mejor si sigues los éxitos simples del optimizador dados por Eclipse. Es decir. \t \t canvas.getClipBounds (imageBounds); \t \t mCustomImage.setBounds (imageBounds); Tener un OnDraw súper rápido es muy importante. – slott

Cuestiones relacionadas