【问题标题】:Drawing arbitrary jpeg to Canvas将任意 jpeg 绘制到 Canvas
【发布时间】:2013-12-10 06:06:56
【问题描述】:

我试图在 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();
}

【问题讨论】:

  • 有点搞砸了,我会对我的问题投反对票。有人可以帮我理解这个问题有什么问题吗?

标签: android android-canvas android-ui


【解决方案1】:

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

至于实际绘制位图,调用Canvas.drawBitmap()方法即可轻松绘制位图。

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

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

【讨论】:

  • 啊,你知道我有这个,但翻译仍然在那里,它不能正常工作。谢谢
【解决方案2】:

我会更改暴露于以下内容的错误实现:

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

}

【讨论】:

  • 如果只使用位图,为什么需要整个BitmapDrawable 类?
  • 完全同意你的看法。无需包装位图。
猜你喜欢
  • 2015-07-19
  • 1970-01-01
  • 2012-08-11
  • 2015-06-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-16
  • 1970-01-01
相关资源
最近更新 更多