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

时间:2015-04-30 06:31:08

标签: java android canvas xamarin imageview

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

}

1 个答案:

答案 0 :(得分:0)

那么,我在我的应用程序中执行此操作的方法是将我绘制的位图设置为画布上的背景初始化视图 - 这应该使绘制操作完成后该行变为透明。我对Xamarin并不熟悉,但在Android Java中,我只是喜欢:

BitmapDrawable bd = new BitmapDrawable(bmp);
canvas.setBitmapDrawable(bd);  //or this.setBitmapDrawable(bd);
实例化Canvas

。这是因为xfer模式清除了在View下面显示Canvas的所有内容,因此该线保持黑色。我相信你应该相当容易地适应你的代码。

如果它像我描述的那样工作(绘图期间线条是黑色的,然后是poof - 变得透明),那么为了让它立即变得透明,我选择的方法是在使用{{绘图时“关闭硬件加速1}},再次,Android Java:

Mode.Clear
祝你好运,让我知道它是怎么回事,或者你是否需要澄清一些事情。 :)