gpt4 book ai didi

java - 如何绘制线条并删除我在 ImageView Android Xamarin 上绘制的线条

转载 作者:太空宇宙 更新时间:2023-11-04 13:54:37 25 4
gpt4 key购买 nike

我想让用户在图像上画线,并且用户可以删除他们画的线。到目前为止,我可以在创建的自定义 ImageView 上绘制线条,如下所示。然而,我尝试了很多方法,当我选择删除模式时,它们都画黑线。我希望耳朵后面的部分仍然是我设置的图像,并像画线一样实现删除。我怎样才能做到这一点?

public class PaintView : ImageView
{
private Paint _Paint = new Paint();
private Paint ErasePaint= new Paint();
public Bitmap _Bmp;
private Canvas _Canvas = null;

private PointF _StartPt = new PointF();
private PointF _EndPt = new PointF();

public int status=1; //1 draw, 0 erase

public PaintView(Context context, IAttributeSet attrs)
: base(context, attrs)
{

}

public void Initialize()
{
_Paint = new Paint ();
_Paint.Color = new Color (255, 255, 255);
_Paint.StrokeWidth = 5;
_Paint.StrokeCap = Paint.Cap.Round;

int alpha = 3;

_Bmp = Bitmap.CreateScaledBitmap(_Bmp,_Bmp.Width*alpha, _Bmp.Height*alpha, false);
_Canvas = new Canvas(_Bmp);

this.SetImageBitmap(_Bmp);
}



override public bool OnTouchEvent(MotionEvent e)
{
if (status == 1) {
switch (e.Action)
{
case MotionEventActions.Down:
_StartPt.Set(e.GetX() - 1, e.GetY() - 1);// for just a tapping
DrawLine(e);
break;
case MotionEventActions.Move:
DrawLine(e);
break;
case MotionEventActions.Up:
DrawLine(e);
break;
}
}
if (status == 0) {

switch (e.Action)
{
case MotionEventActions.Down:
_StartPt.Set(e.GetX() - 1, e.GetY() - 1);// for just a tapping
eraseCanvas(e);
break;
case MotionEventActions.Move:
eraseCanvas(e);
break;
case MotionEventActions.Up:
eraseCanvas(e);
break;
}

}

return true;

}

private void DrawLine(MotionEvent e)
{
_EndPt.Set(e.GetX(), e.GetY());

_Canvas.DrawLine(_StartPt.X, _StartPt.Y, _EndPt.X, _EndPt.Y, _Paint);

_StartPt.Set(_EndPt);
Invalidate();
}

private void eraseCanvas(MotionEvent e)
{
_EndPt.Set(e.GetX(), e.GetY());

ErasePaint.Color = Color.Transparent;
ErasePaint.StrokeWidth = 5;
ErasePaint.SetXfermode (new PorterDuffXfermode (PorterDuff.Mode.Clear));
_Canvas.DrawLine(_StartPt.X, _StartPt.Y, _EndPt.X, _EndPt.Y, ErasePaint);

_StartPt.Set(_EndPt);
Invalidate();
}

}

最佳答案

那么,我在应用程序中执行此操作的方法是在初始化时将我绘制的位图设置为 Canvas View 的背景 - 这应该使线条在绘制操作完成后变得透明。我不太熟悉 Xamarin,但在 Android Java 中我只是这样做:

BitmapDrawable bd = new BitmapDrawable(bmp);
canvas.setBitmapDrawable(bd); //or this.setBitmapDrawable(bd);

实例化Canvas后。这是因为 xfer 模式清除会刮掉 Canvas 下方显示 View 的所有内容,因此线条保持黑色。我相信您应该相当容易地将其适应您的代码。

如果它按照我所描述的那样工作(在绘制过程中线条是黑色的,然后噗 - 变成透明的),那么为了立即使其透明,我的方法是在使用 Mode.Clear 绘制时关闭硬件加速,同样,Android Java:

boolean bool = "rubber".equals(tool);
if (bool) {
this.setLayerType(LAYER_TYPE_SOFTWARE, canvasPaint); //or canvas.setLayer...
}
//drawing stuff
if (bool) {
this.setLayerType(LAYER_TYPE_HARDWARE, canvasPaint);
}

祝你好运,请告诉我进展如何,或者您是否需要一些说明或其他内容。 :)

关于java - 如何绘制线条并删除我在 ImageView Android Xamarin 上绘制的线条,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29960567/

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