2010-01-31 19 views
18

C'è un altro modo per disegnare un oggetto su una tela in Android?disegnare oggetto/immagine su tela

Questo codice all'interno draw() non funziona:

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

Beh in realtà, sta lavorando sul mio primo codice, ma quando ho trasferito questa a un'altra classe chiamata MarkOverlay, non funziona più.

Quale parametro devo passare a MarkerOverlay per far funzionare questo codice? L'errore è da qualche parte in getResources().

FYI, canvas.drawOval funziona perfettamente ma desidero davvero disegnare un'immagine non un ovale. :)

risposta

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

Bisogna liberare i dati bitmap con Bitmap.recycle(), altrimenti si ottiene una perdita di memoria brutto: creando una nuova bitmap in ogni ciclo di disegno. –

+5

Non decodificare l'immagine in onDraw - eseguire gran parte del sollevamento pesante all'esterno del ciclo di rendering. – slott

14

preferisco fare questo in quanto genera solo l'immagine una volta:

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 per non effettuare allocazioni o decomprimere un'immagine in onDraw – user1532390

+1

mi dà questo avviso eclissi: Evita allocazioni oggetto durante le operazioni di disegno: Usa Canvas.getClipBounds (Rect) invece di Canvas.getClipBounds() che alloca un Rect temporaneo – oat

+1

Questo può essere reso ancora migliore se si seguono i semplici risultati dell'ottimizzatore forniti da Eclipse. Vale a dire. \t \t canvas.getClipBounds (imageBounds); \t \t mCustomImage.setBounds (imageBounds); Avere un super veloce suDraw è molto importante. – slott

Problemi correlati