如何在Android中用手指擦除图像

Ila*_*rio 5 java android canvas bitmap

我正在开发一个需要对象功能的应用程序.

我有一个覆盖图像B的图像A.用手指我需要擦除图像A以显示图像B.擦除必须按照手指流动的图像A

我正在尝试一些代码但仍然无法擦除图像A.这是我用于在图像上绘制一条线的代码(_imageToErase是图像A):

Canvas canvas;
Paint paint;
float downx = 0, downy = 0, upx = 0, upy = 0;
ImageView _imageToErase;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(R.layout.g_layout);

    _imageToErase = (ImageView) findViewById(R.id.image_to_erase);

    _imageToErase.setOnTouchListener(this);
}

@Override
public void onWindowFocusChanged(boolean hasFocus){

    int width = _imageToErase.getWidth();
    int height = _imageToErase.getHeight();

    Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
    canvas = new Canvas(bitmap);
    paint = new Paint();
    paint.setColor(Color.WHITE);
    paint.setStrokeWidth(25);
    paint.setAntiAlias(true);
    _imageToErase.setImageBitmap(bitmap);
}

public boolean onTouch(View v, MotionEvent event) {
    int action = event.getAction();

    switch (action){
        case MotionEvent.ACTION_DOWN:
            downx = event.getX();
            downy = event.getY();
            break;
        case MotionEvent.ACTION_MOVE:
            upx = event.getX();
            upy = event.getY();
            canvas.drawLine(downx, downy, upx, upy, paint);
            _imageToErase.invalidate();
            downx = upx;
            downy = upy;
            break;
        case MotionEvent.ACTION_UP:
            break;
        case MotionEvent.ACTION_CANCEL:
            break;
        default:
            break;
    }

    return true;
}
Run Code Online (Sandbox Code Playgroud)

此代码仅产生跟随手指但不擦除图像的线.

如何修改此代码以删除图像?谢谢

编辑

评论中建议的链接没有解决我的问题.只需添加以下行:

 paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_OUT));
Run Code Online (Sandbox Code Playgroud)

不适合我.

Ila*_*rio 1

最后我找到了一个非常适合我并且实现非常简单的库

https://github.com/winsontan520/Android-WScratchView

在您的项目中导入库,然后在layout.xml

 <com.winsontan520.WScratchView
  android:layout_width="287dp"
  android:layout_height="212dp"
  android:layout_centerHorizontal="true"
  android:layout_marginTop="80dp"
  android:adjustViewBounds="true"
  android:scaleType="centerInside"
  android:id="@+id/image_to_erase"/>
Run Code Online (Sandbox Code Playgroud)

onCreate:

_imageToErase = (WScratchView) findViewById(R.id.image_to_erase);
Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.img_erase);

_imageToErase.setScratchBitmap(bitmap);


_imageToErase.setOnScratchCallback(new WScratchView.OnScratchCallback() {
        @Override
        public void onScratch(float percentage) {
            updatePercentage(percentage);
        }

        @Override
        public void onDetach(boolean fingerDetach) {
            if (mPercentage > 40) {
                _imageToErase.setScratchAll(true);
                updatePercentage(100);
            }
        }
    });
Run Code Online (Sandbox Code Playgroud)

private void updatePercentage(float percentage) {

    mPercentage = percentage;
 //   System.out.println("percentage = "+percentage);
}
Run Code Online (Sandbox Code Playgroud)

谢谢大家