2010-01-31 5 views
18

Existe-t-il une autre façon de dessiner un objet sur une toile dans Android?Dessiner un objet/une image sur une toile

Ce code à l'intérieur draw() ne fonctionne pas:

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

Eh bien en fait, il travaille sur mon 1er code, mais quand je l'ai transféré ce à une autre classe appelée MarkOverlay, il ne fonctionne plus.

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

Quel paramètre devrais-je transmettre à MarkerOverlay pour que ce code fonctionne? L'erreur est quelque part dans getResources().

FYI, canvas.drawOval fonctionne parfaitement, mais je veux vraiment dessiner une image pas un ovale. :)

Répondre

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

Vous devez libérer des données bitmap avec Bitmap.recycle() ou bien vous avez une fuite de mémoire méchant: créer un nouveau bitmap dans chaque cycle de dessin. –

+5

Ne pas décoder l'image dans onDraw - faire le plus de gros travaux en dehors de la boucle de rendu. – slott

14

Je préfère le faire car il ne génère que l'image une fois:

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 pour ne pas faire d'allocation ou déballer une image dans onDraw – user1532390

+1

me donne cet avertissement d'éclipse: Éviter les allocations d'objets pendant les opérations de dessin: Utiliser Canvas.getClipBounds (Rect) au lieu de Canvas.getClipBounds() qui alloue un Rect temporaire – oat

+1

Cela peut être fait encore mieux si vous suivez les coups d'optimiseur simples donnés par Eclipse. C'est à dire. \t \t canvas.getClipBounds (imageBounds); \t \t mCustomImage.setBounds (imageBounds); Avoir un onDraw super rapide est très important. – slott

Questions connexes