使用ARGB_8888,Android canvas.drawBitmap非常慢

时间:2016-11-17 20:01:12

标签: java android canvas bitmap draw

我是Android编码的新手,但我想制作一款带笔的平板电脑应用程序,以便能够手写(我知道那里已经有很多,但我想要自己的)

我收集了来自互联网的一些代码,现在我想要添加一个橡皮擦模式。为此,我正在创建一个Bitmap,然后将其添加到Canvas上。 一切正常,但Bitmap有Bitmap.Configuration.ARGB_8888,绘制时速度慢,所以它落后了。我尝试了Bitmap.Configuration.RGB_565并没有遇到任何性能问题,但其他问题还有擦除。

我也发现,它显然与Bitmap的大小有关。我的平板电脑的屏幕分辨率为1920x1200。当我仅使用1557x1000创建位图时,我没有遇到任何性能问题,但当我将其增加到1558x1000或更高时,它会再次开始滞后。

以下是我的代码的一部分:

类DrawView:

public class DrawView extends SurfaceView implements View.OnTouchListener{
    private Paint paint;
    private Paint bitmapPaint;
    private Path path;
    private Canvas canvas;
    private Bitmap mBitmap;

    private int currentColor;
    private float currentStrokeWidth;
    private boolean eraserMode = false;

    public DrawView(Context context, AttributeSet attr) {
        super(context, attr);

        path = new Path();
        paint = new Paint();
        bitmapPaint = new Paint(Paint.DITHER_FLAG);

        this.setOnTouchListener(this);

        paint.setAntiAlias(true);
        paint.setDither(true);
        paint.setFilterBitmap(false);
        // ... setting Color and StorkeWidth to paint
    }

    @Override
    protected void onSizeChanged(int w, int h, int oldw, int oldh) {
        super.onSizeChanged(w, h, oldw, oldh);
        mBitmap = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);
        canvas = new Canvas(mBitmap);
    }

    @Override
    protected void onDraw(Canvas c){
        c.drawBitmap(mBitmap, 0, 0, bitmapPaint);
        c.drawPath(path, paint);
    }

    @Override
    public boolean onTouch(View v, MotionEvent event) {
            float eventX = event.getX();
            float eventY = event.getY();

            switch (event.getAction()) {
                case MotionEvent.ACTION_DOWN:
                    touch_start(eventX, eventY);
                    break;
                case MotionEvent.ACTION_MOVE:
                    touch_move(eventX, eventY);
                    break;
                case MotionEvent.ACTION_UP:
                    touch_up();
                    break;
                default:
                    return false;
            }
            invalidate();
       }
       return true;
    }

    private float mX, mY;

    private void touch_start(float x, float y) {
        path.moveTo(x, y);
        mX = x;
        mY = y;
    }

    private void touch_move(float x, float y) {
        path.quadTo(mX, mY, (x + mX) / 2, (y + mY) / 2);
        canvas.drawPath(path, paint);
        mX = x;
        mY = y;
    }

    private void touch_up() {
        canvas.drawPath(path, paint);
        path.reset();
    }
}

如果有人能帮我解决这个问题,我感到非常高兴。

1 个答案:

答案 0 :(得分:1)

我自己修理了它。 我意识到我用setBackgroundResource(R.drawable.background)设置的背景图像的分辨率太高了,我把它降低了,现在它起作用了。我不知道为什么这会影响绘画表现,但这也解释了为什么我没有在互联网上找到任何答案