Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/320.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在Android中用手指擦除图像_Java_Android_Canvas_Bitmap - Fatal编程技术网

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

Java 如何在Android中用手指擦除图像,java,android,canvas,bitmap,Java,Android,Canvas,Bitmap,我正在开发一个应用程序,需要对象中的功能 我有一个图像A覆盖图像B。我需要用手指擦除图像A以显示图像B。 擦除必须跟随您的手指流动图像A 我正在尝试一些代码,但仍然无法擦除图像A。这是我用来在图像上画线的代码(_imageToErase是图像A): 此代码仅生成一条跟随手指的线,但不会擦除图像 如何修改此代码以擦除图像?谢谢 编辑 评论中建议的链接没有解决我的问题。只需添加以下行: paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode

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

我有一个图像A覆盖图像B。我需要用手指擦除图像A以显示图像B。 擦除必须跟随您的手指流动图像A

我正在尝试一些代码,但仍然无法擦除图像A。这是我用来在图像上画线的代码(_imageToErase是图像A):

此代码仅生成一条跟随手指的线,但不会擦除图像

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

编辑

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

 paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_OUT));

不适合我。

最后我找到了一个适合我的库,实现起来非常简单

在项目中导入库,然后在
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"/>

谢谢大家

PaintView.java

MainActivity.java

public class MainActivity extends Activity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(new PaintView(this));
}}

你的油漆是白色的。至少你需要一个透明的油漆。可能是@njzk2的复制品是的,我知道,事实上我尝试过透明,但我看不到线条,但图像a总是在那里。。这个问题对我不适用你在哪里画你想抹掉的图像?您删除的图像似乎不在画布上?@njzk2在onWindowFocusChanged i build Bitmap中,使用该位图和图像上的setImageBitmap创建画布是否可以计算已删除图像的百分比?
_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);
            }
        }
    });
private void updatePercentage(float percentage) {

    mPercentage = percentage;
 //   System.out.println("percentage = "+percentage);
}
public class PaintView extends View implements View.OnTouchListener {

    private static final String TAG = "PaintView";
    Bitmap Bitmap1, Bitmap2;
    Bitmap Transparent;
    int X = -100;
    int Y = -100;
    Canvas c2;
    private boolean isTouched = false;

    Paint paint = new Paint();

    Path drawPath = new Path();

public PaintView(Context context) {
    super(context);
    setFocusable(true);
    setFocusableInTouchMode(true);
    this.setOnTouchListener(this);

    DisplayMetrics metrics = context.getResources().getDisplayMetrics();
    int width = metrics.widthPixels;
    int height = metrics.heightPixels;

    Transparent = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
    Bitmap1 = BitmapFactory.decodeResource(getResources(), R.drawable.cake1);
    Bitmap2 = BitmapFactory.decodeResource(getResources(), R.drawable.cake2);

    c2 = new Canvas();
    c2.setBitmap(Transparent);
    c2.drawBitmap(Bitmap2, 0, 0, paint);

    paint.setAlpha(0);
    paint.setStyle(Paint.Style.STROKE);
    paint.setStrokeJoin(Paint.Join.ROUND);
    paint.setStrokeCap(Paint.Cap.ROUND);
    paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR));
    paint.setAntiAlias(true);
}

private static Point getDisplaySize(final Display display) {
    final Point point = new Point();
    point.x = display.getWidth();
    point.y = display.getHeight();
    return point;
}

@Override
protected void onDraw(Canvas canvas) {
    System.out.println("onDraw");

    if(isTouched)
    {
        canvas.drawBitmap(Bitmap1, 0, 0, null);

    }
    canvas.drawBitmap(Transparent, 0, 0, null);
}

@Override
public boolean onTouch(View v, MotionEvent event) {
    isTouched = true;
    X = (int) event.getX();
    Y = (int) event.getY();

    paint.setStrokeWidth(60);

    switch (event.getAction()) {
        case MotionEvent.ACTION_DOWN:
            drawPath.moveTo(X, Y);
            c2.drawPath(drawPath, paint);
            break;
        case MotionEvent.ACTION_MOVE:
            drawPath.lineTo(X, Y);
            c2.drawPath(drawPath, paint);
            break;
        case MotionEvent.ACTION_UP:
            drawPath.lineTo(X, Y);
            c2.drawPath(drawPath, paint);
            drawPath.reset();
            count=0;
            break;
        default:
            return false;
    }

    invalidate();
    return true;}}class Point {
float x, y;

@Override
public String toString() {
    return x + ", " + y;
}}
public class MainActivity extends Activity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(new PaintView(this));
}}