Java 如何画线和删除我在ImageView Android Xamarin上画的线

Java 如何画线和删除我在ImageView Android Xamarin上画的线,java,android,canvas,xamarin,imageview,Java,Android,Canvas,Xamarin,Imageview,我想让用户在图像上画线,用户可以删除他们画的线。到目前为止,我可以在如下创建的自定义ImageView上绘制线条。然而,我尝试了很多方法,当我选择擦除模式时,他们都画了黑线。我希望earse后的部分仍然是我设置的图像,并像画线一样执行擦除。我该怎么做 public class PaintView : ImageView { private Paint _Paint = new Paint(); private Paint ErasePaint= new Paint();

我想让用户在图像上画线,用户可以删除他们画的线。到目前为止,我可以在如下创建的自定义ImageView上绘制线条。然而,我尝试了很多方法,当我选择擦除模式时,他们都画了黑线。我希望earse后的部分仍然是我设置的图像,并像画线一样执行擦除。我该怎么做

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

}

那么,我在我的应用程序中的做法是在初始化时将我绘制的位图设置为画布视图的背景-这将使绘制操作完成后线条变得透明。我对Xamarin不是很熟悉,但在Android Java中,我只会说:

BitmapDrawable bd = new BitmapDrawable(bmp);
canvas.setBitmapDrawable(bd);  //or this.setBitmapDrawable(bd);
实例化
画布后
。这是因为xfer模式清除了
画布下显示的
视图
,因此线条保持黑色。我认为您应该很容易地将其适应于您的代码

如果它如我所描述的那样工作(绘制时线条为黑色,然后poof-变为透明),那么要立即使其透明,我的方法是在使用
模式绘制时关闭硬件加速。再次清除
,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);
}

祝你好运,让我知道事情进展如何,或者你是否需要澄清或做些什么。:)

用户抬起手指后-显示图片的黑线是否消失或保持黑色?谢谢!已通过使用framelayout覆盖两个此PaintView并在顶部启用绘图来修复此问题。所以我既可以画画也可以擦除(这就是画黑线)。这解决了我的问题。我稍后会试试你的方法。谢谢