gpt4 book ai didi

java - 如何在 Android 中用手指删除图像

转载 作者:塔克拉玛干 更新时间:2023-11-02 22:53:54 24 4
gpt4 key购买 nike

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

我有一个覆盖图像 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;
}

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

如何修改这段代码来删除图像?谢谢

编辑

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

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

不适合我。

最佳答案

PaintView.java

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;
}}

主 Activity .java

public class MainActivity extends Activity {

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

关于java - 如何在 Android 中用手指删除图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31517647/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com