java - Android canvas.drawBitmap 使用 ARGB_8888 非常慢

标签 java android canvas bitmap draw

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

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

我还发现,这显然与位图的大小有关。我的平板电脑的屏幕分辨率为 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();
    }
}

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

最佳答案

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

关于java - Android canvas.drawBitmap 使用 ARGB_8888 非常慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40664015/

相关文章:

javascript - canvas.toDataURL 使用数组和循环返回空数据 :, 字符串

c# - Socket.io - 每 34 毫秒接收一次数据

java - 如果天数包含另一年的天数,如何获得剩余天数?

java - 如何使用 Logback 更改 JSON 输出中的键名?

java - Spring NTLM NtlmProcessingFilter 做缓存

android - Firestore 如何在回收站 View 中从 firestore 检索数据

java - JPA CriteriaQuery OneToMany

java - 物体之间的距离超过给定值

android - DialogFragment 未显示在监听器中

javascript - HTML5 canvas 正在调整我的图片大小