在画布上绘制对象/图像

28
有没有其他方法在Android中的画布上绘制一个对象?
在draw()函数内部的以下代码不起作用:
Bitmap bmp = BitmapFactory.decodeResource(getResources(), R.drawable.pushpin);<br>
         canvas.drawBitmap(bmp, screenPts.x, screenPts.y-50, null);  

实际上,在我的第一份代码中它能够工作,但当我将其转移到另一个名为MarkOverlay的类时,它就不再工作了。

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

我应该向MarkerOverlay传递什么参数才能使这段代码起作用?错误可能出现在getResources()中。

顺便说一下,canvas.drawOval完全可以工作,但我真的想画一个图像而不是椭圆形。 :)

2个回答

41

我更喜欢这样做,因为它只会生成一次图像:

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);
    }
}

10
+1 表示不要在 onDraw 中进行分配或解压图像。 - user1532390
1
这是Eclipse的警告信息:避免在绘制操作期间进行对象分配:使用Canvas.getClipBounds(Rect)而不是Canvas.getClipBounds(),后者会分配临时矩形。 - bhaskarc
1
如果您遵循Eclipse提供的简单优化器提示,这将变得更加完美。即: canvas.getClipBounds(imageBounds); mCustomImage.setBounds(imageBounds);拥有超快的onDraw非常重要。 - slott
getResources().getDrawable() 已在 API 22 中被弃用。请改用 ResourcesCompat.getDrawable(getResources(), R.drawable.name, null); - Izaak Cornelis

26
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);
    }
}

8
你必须使用Bitmap.recycle()释放位图数据,否则会造成严重的内存泄漏:在每个绘制周期中创建新的位图。 - Andras Balázs Lajtha
20
不要在onDraw方法中解码图片,尽可能多地将繁重的工作放到渲染循环之外。 - slott
能否在画布上设置视频视图? - Vivek Thummar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接