Как убрать последний путь с холста? - PullRequest
0 голосов
/ 30 марта 2019

Я делаю приложение каракули в Android.Я хотел бы удалить последний путь с холста при нажатии кнопки отмены.Я создал функцию под названием "undoPrevPath ()".Последний путь был удален из массива, называемого «путями», но он все еще показывает удаленный путь.Я думаю, что invalidate () метод не работает.Есть ли способ удалить последний путь?Благодарим Вас за чтение.

Android Studio 3.3

Мой код указан ниже.

PaintView.java

public class PaintView extends View {
    public static int BLUSH_SIZE = 12;
    public static final int DEFAULT_COLOR = Color.BLACK;
    private static final float TOUCH_TOLERANCE = 4;

    public static int ALPHA = 150;
    public static int RED = 0x99;
    public static int GREEN = 0xCC;
    public static int BLUE = 0xFF;

    private float mX, mY;
    private Path mPath;
    private Paint mPaint;
    private ArrayList<FingerPath> paths = new ArrayList<>();

    private int currentColor;
    private int strokeWidth;

    private Canvas mCanvas;
    private Bitmap mBitmap;
    private Paint mBitmapPoint = new Paint(Paint.DITHER_FLAG);

    public PaintView(Context context) { super(context); }

    public PaintView(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
        mPaint = new Paint();
        mPaint.setAntiAlias(true);
        mPaint.setDither(true);
        mPaint.setColor(DEFAULT_COLOR);
        mPaint.setStyle(Paint.Style.STROKE);
        mPaint.setStrokeJoin(Paint.Join.ROUND);
        mPaint.setStrokeCap(Paint.Cap.ROUND);
        mPaint.setXfermode(null);
    }

    public void init(Bitmap bmp, int r, int g, int b) {
        this.RED = r;
        this.GREEN = g;
        this.BLUE = b;
        mBitmap = bmp;
        mCanvas = new Canvas(mBitmap);

        currentColor = DEFAULT_COLOR;
        strokeWidth = BLUSH_SIZE;

        mPaint.setShader(new LinearGradient(0,0,100,100,Color.argb(ALPHA,RED,GREEN,BLUE),
                Color.argb(ALPHA,RED,GREEN,BLUE), Shader.TileMode.REPEAT));
    }


    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);

        for (FingerPath fp: paths) {
            mPaint.setColor(fp.color);
            mPaint.setStrokeWidth(fp.strokeWidth);
            mPaint.setMaskFilter(null);
            mCanvas.drawPath(fp.mPath, mPaint);
        }

        canvas.drawBitmap(mBitmap, 0, 0, mBitmapPoint);
    }

    private void touchStart(float x, float y) {
        mPath = new Path();
        FingerPath fp = new FingerPath(currentColor, strokeWidth, mPath);
        paths.add(fp);
        mPath.reset();
        mPath.moveTo(x, y);
        mX = x;
        mY = y;
    }

    private void touchMove(float x, float y) {
        float dx = Math.abs(x - mX);
        float dy = Math.abs(y - mY);

        if (dx >= TOUCH_TOLERANCE || dy >= TOUCH_TOLERANCE) {
            mPath.quadTo(mX, mY, (x + mX) / 2, (y + mY) / 2);
            mX = x;
            mY = y;
        }
    }

    private void touchUp() {
        mPath.lineTo(mX, mY);
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        float x = event.getX();
        float y = event.getY();

        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                touchStart(x, y);
                invalidate();
                break;
            case MotionEvent.ACTION_MOVE:
                touchMove(x, y);
                invalidate();
                break;
            case MotionEvent.ACTION_UP:
                touchUp();
                invalidate();
                this.mPath.reset();
                break;
        }

        return true;
    }

    public void undoPrevPath() {
        if(!paths.isEmpty()) {
            int size = paths.size();
            Log.d("TAG", "undoPrevPath1: "+size);
            paths.remove(paths.size()-1);
            Log.d("TAG", "undoPrevPath2: "+paths.size());
        }
        invalidate();

    }
}

Iя вызываю этот класс из другого класса, как показано ниже.

switch (pos) {
            case 0:
                // black
                mPaintView.init(paintBitmap, 0x16, 0x16, 0x16);
                break;
            case 1:
                // deep_koamaru
                mPaintView.init(paintBitmap, 35, 54, 104);
                break;
            case 2:
                // pastel_blue
                mPaintView.init(paintBitmap, 160, 195, 210);
                break;
            case 3:
                // lavender_gray
                mPaintView.init(paintBitmap, 190, 190, 209);
                break;
            case 4:
                // queen_pink
                mPaintView.init(paintBitmap, 248, 205, 210);
                break;
            case 5:
                // orange_yellow
                mPaintView.init(paintBitmap, 249, 200, 99);
                break;
            case 6:
                // white
                mPaintView.init(paintBitmap, 255, 255, 255);
                break;
            default:
                return;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...