如何在没有高分配 RAM 的情况下正确实现绘图应用程序

How to correctly implement drawing application without high allocation of RAM

我在 android 中创建了一个绘图应用程序,我想知道在 canvas 上绘图的正确方法是什么,同时又要简洁地分配 RAM。

我注意到当路径或路径中的点的数量变得太多时,onDraw(Canvas canvas) 中的延迟变得明显。很明显有一个解决方案,但我正在寻找解决这个问题的标准方法。

我没有在网上找到太多信息,但我目前正在尝试将当前的 canvas 保存到 Bitmap,然后将我的 View 设置为 canvas (LinearLayout)。

我目前正在尝试以下操作,但它没有将 LinearLayout 设置为 Background

public Bitmap saveTempCanvas() {
        Bitmap.Config conf = Bitmap.Config.ARGB_8888;
        this.setDrawingCacheEnabled(true);
        this.buildDrawingCache();
        this.setBackgroundColor(Color.WHITE);
        Bitmap bmp = Bitmap.createBitmap(this.getDrawingCache());
        this.setDrawingCacheEnabled(false);
        return bmp;
    }
//. . .
//. . .
Drawable ob = new BitmapDrawable(getResources(), pv.saveTempCanvas());
LinearLayoutCanvas.setBackgroundDrawable(ob);

这是创建 "Paint" activity 的标准方法吗? 为什么以下代码无法设置 BitmapDrawable

如果你每次都在 onDraw() 中调用这个函数,我并不奇怪为什么它越来越卡顿。这是我的方法,效果很好:

public class TouchEventView extends View {

    private Paint paint = new Paint();
    private Path path = new Path();
    Bitmap bitMap;
    Canvas myCanvas;
    Canvas defaultCanvas;

    public TouchEventView(Context context) {
        this(context, null);        
    }

    public TouchEventView(Context context, AttributeSet attrs) {
        super(context, attrs);

        WindowManager wm = (WindowManager) context
                .getSystemService(Context.WINDOW_SERVICE);
        Display display = wm.getDefaultDisplay();
        Point size = new Point();

        display.getSize(size);
        int width = size.x;
        int height = size.y;

        bitMap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);

        paint.setAntiAlias(true);
        paint.setStrokeWidth(6f);
        paint.setColor(Color.BLACK);
        paint.setStyle(Paint.Style.STROKE);
        paint.setStrokeJoin(Paint.Join.BEVEL);
    }

    @Override
    protected void onDraw(Canvas canvas) {
        myCanvas = new Canvas(bitMap);
        defaultCanvas = canvas;
        canvas.drawPath(path, paint);
        myCanvas.drawColor(Color.WHITE);
        myCanvas.setBitmap(bitMap);
        myCanvas.drawPath(path, paint);
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        super.onTouchEvent(event);

        float eventX = event.getX();
        float eventY = event.getY();

        switch (event.getAction()) {
        case MotionEvent.ACTION_DOWN:
            path.moveTo(eventX, eventY);
            return true;
        case MotionEvent.ACTION_MOVE:
            path.lineTo(eventX, eventY);
            break;
        case MotionEvent.ACTION_UP:
            performClick();
            break;
        default:
            return false;
        }
        invalidate();
        return true;
    }

    @Override
    public boolean performClick() {
        super.performClick();
        return true;
    }
}