将任意jpeg绘制到Canvas

时间:2013-12-09 18:02:48

标签: android android-canvas android-ui

我试图在onDraw()中绘制一个jpg到画布,但是Bitmap类型似乎不是可绘制的(没有.draw方法)。我的目标是让一个可以在屏幕上移动的jpeg触摸/拖动。我该如何画这个?

这是我的构造函数(我将图像路径传递给视图)

    public TouchViewClass(Context context, AttributeSet attrs, int defStyle, String picPath) {
    super(context, attrs, defStyle);
    this.picPath=picPath;
}

这是我的onDraw

    @Override
public void onDraw(Canvas canvas) {
    super.onDraw(canvas);
    Bitmap myImg = BitmapFactory.decodeFile(picPath);
    canvas.save();
    canvas.translate(mPosX, mPosY);
    //Here is where the bitmap should be drawn

    canvas.restore();
}

2 个答案:

答案 0 :(得分:4)

首先,我不建议将文件解码为onDraw()中的位图。每个帧都会调用此方法,因此绘制过程将非常缓慢。您需要预先解码文件(在您的构造函数中),并在onDraw中重用此位图。

对于实际的绘图位图,您可以通过调用Canvas.drawBitmap()方法轻松绘制位图。

所以基本上你甚至不需要翻译画布 - 你可以直接指定目的地:

canvas.drawBitmap(bmp, mPosX, mPosY, null);

答案 1 :(得分:0)

我会改变暴露于类似的错误实现:

public class TouchViewClass extends View{

    private Bitmap myImg;
    private float mPosX = 0;
    private float mPosY = 0;
    private Paint paint = new Paint();

    public float getmPosX() {
        return mPosX;
    }

    public void setmPosX(float mPosX) {
        this.mPosX = mPosX;
    }

    public float getmPosY() {
        return mPosY;
    }

    public void setmPosY(float mPosY) {
        this.mPosY = mPosY;
    }

    /**
     * So you can inflate from XML
     * @param context
     * @param attrs
     */
    public TouchViewClass(Context context, AttributeSet attrs) {
        super(context, attrs);

    }

    /**
     * So you can create in code
     * @param context
     * @param attrs
     * @param picPath
     */
    public TouchViewClass(Context context, AttributeSet attrs, String picPath) {
        super(context, attrs);

        setPicPath(context, picPath);
    }

    public void setPicPath(Context context, String picPath){
        if(!TextUtils.isEmpty(picPath)){
            myImg =  BitmapFactory.decodeFile(picPath);
        }else{
            Resources resources = context.getResources();
            myImg = BitmapFactory.decodeResource(resources, R.drawable.ic_launcher);
        }

    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);

        canvas.drawBitmap(myImg, mPosX, mPosY, paint);
    }

}