2010-01-31 15 views
18

Czy istnieje inny sposób narysowania obiektu na płótnie w systemie Android?Rysuj obiekt/obraz na płótnie

Ten kod wewnątrz draw() nie działa:

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

No faktycznie, że to działa na moim 1 kodu, ale kiedy już to przeniesione do innej klasy zwanej MarkOverlay, nie działa już.

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

Jaki parametr należy przekazać do MarkerOverlay, aby ten kod zadziałał? Błąd znajduje się gdzieś w getResources().

FYI, canvas.drawOval działa doskonale, ale naprawdę chcę narysować obrazek, a nie owal. :)

Odpowiedz

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

Musisz zwolnić danych bitmapy z Bitmap.recycle() albo można dostać paskudny wyciek pamięci: tworzenie nowej bitmapy w każdym cyklu rysowania. –

+5

Nie dekoduj obrazu w onDraw - wykonaj tak wiele operacji podnoszenia poza pętlą renderowania. – slott

14

Wolę to zrobić, jak to tylko generuje obraz jednorazowo:

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 za nieprzydzielanie przydziałów lub rozpakowywanie obrazu w onDraw – user1532390

+1

daje mi to ostrzeżenie zaćmienia: Unikaj przydziałów obiektów podczas operacji rysowania: użyj Canvas.getClipBounds (Rect) zamiast Canvas.getClipBounds(), który przydziela tymczasowy Rect – oat

+1

To może być zrobione jeszcze lepiej, jeśli podążysz za prostymi wynikami optymalizatora dostarczonymi przez Eclipse. To znaczy. \t \t canvas.getClipBounds (imageBounds); \t \t mCustomImage.setBounds (imageBounds); Posiadanie super szybkiego onDraw jest bardzo ważne. – slott