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