如何在不分配大量RAM的情况下正确实现绘图应用程序



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

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

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

我目前正在尝试以下内容,但它没有将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"活动的标准方法吗?为什么下面的代码无法设置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;
    }
}

相关内容

最新更新