2010-01-31 22 views
18

Gibt es eine andere Möglichkeit, ein Objekt auf einer Leinwand in Android zu zeichnen?Objekt/Bild auf Leinwand zeichnen

Dieser Code innerhalb draw() nicht funktioniert:

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

Naja, eigentlich, ist es auf meinem ersten Code funktioniert, aber wenn ich diese in einer anderen Klasse übertragen habe MarkOverlay genannt, ist es nicht mehr funktioniert.

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

Welchen Parameter sollte ich an MarkerOverlay übergeben, damit dieser Code funktioniert? Der Fehler ist irgendwo in getResources().

FYI, canvas.drawOval funktioniert perfekt, aber ich möchte wirklich ein Bild nicht ein Oval zeichnen. :)

Antwort

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

Sie müssen Bitmap-Daten mit Bitmap.recycle freizugeben() oder sonst bekommt man einen bösen Speicherleck: Erstellen einer neuen Bitmap in jedem Zeichnungszyklus. –

+5

Bild in onDraw nicht dekodieren - so viel von dem schweren Heben außerhalb der Renderschleife. – slott

14

Ich ziehe es, dies zu tun, wie es erzeugt nur das Bild einmal:

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 für keine Zuweisungen oder Entpacken eines Bildes in OnDraw – user1532390

+1

gibt mir diese Eclipse-Warnung: Vermeiden Sie Objektzuordnungen während Zeichnungsoperationen: Verwenden Sie Canvas.getClipBounds (Rect) anstelle von Canvas.getClipBounds(), die ein temporäres Rect – oat

+1

Dies kann sein noch besser, wenn Sie den einfachen Optimierer-Treffern von Eclipse folgen. Ie. \t \t canvas.getClipBounds (imageBounds); \t \t mCustomImage.setBounds (imageBounds); Eine super schnelle onDraw ist sehr wichtig. – slott

Verwandte Themen