Android canvas.drawBitmap 非常慢 ARGB_8888

Android canvas.drawBitmap very slow with ARGB_8888

我是 Android 编码的新手,但我想为平板电脑制作一个可以手写的应用程序(我知道已经有很多了,但我想要自己的一个) )

我从整个 Internet 上收集了一些代码,现在我想添加橡皮擦模式。为此,我正在创建一个位图,然后将其添加到 Canvas 上。 一切正常,但是 Bitmap 有 Bitmap.Configuration.ARGB_8888 并且在绘制时速度很慢,所以它落后了。我试过 Bitmap.Configuration.RGB_565 没有性能问题,但有其他擦除问题。

我也发现了,这显然与Bitmap的大小有关。我的平板电脑的屏幕分辨率为 1920x1200。当我只用 1557x1000 创建位图时,我没有性能问题,但是当我将它增加到 1558x1000 或更高时,它又开始滞后了。

这是我的部分代码:

class 绘图视图:

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

如果有人能帮我解决这个问题,我很高兴。

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