繁体   English   中英

如何在我的ImageView Android Xamarin上绘制线条并消除线条

[英]How to draw line and erase the line I draw on ImageView Android Xamarin

我想让用户在图像上绘制线条,并且用户可以删除他们绘制的线条。 到目前为止,我可以在如下创建的自定义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();
    }

}

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

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

实例化Canvas 这是因为xfer模式清除清除了所有显示在Canvas下面的View的内容,因此该行保持黑色。 我相信您应该很容易地使其适应您的代码。

如果它按我描述的方式工作(在绘制过程中线条为黑色,然后poof-变为透明),则立即使其变为透明,对我Mode.Clear ,方法是再次使用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);
}

祝您好运,让我知道如何进行,或者您是否需要澄清。 :)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM