Android画布清屏,Android 如何清空 Canvas 清屏只需三句话

这两三天一直在研究这个问题,今天终于成功了。我最终要实现的效果是,类似于照相机照相时,第一次按下按键,会出现矩形框框住人脸,这时我不想照相,再次按下会再次框出人脸,重新画个新的矩形框。 就这么简单。

误区一:我设置了一个clearDraw()的子函数,在子函数里设置:

void clearDraw()

{

/*对画布进行清屏*/

Canvas canvas = sh.lockCanvas();

if(canvas!=null){

Paint paint = new Paint();

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

canvas.drawPaint(paint);

//canvas.drawColor(Color.BLUE);

}

sh.unlockCanvasAndPost(canvas);

}

void clearDraw()

{

/*对画布进行清屏*/

Canvas canvas = sh.lockCanvas();

if(canvas!=null){

Paint paint = new Paint();

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

canvas.drawPaint(paint);

//canvas.drawColor(Color.BLUE);

}

sh.unlockCanvasAndPost(canvas);

}

然后每次按下按键进行识别物体的算法前,先进行清屏。得到的效果是,确实清屏了,但第二次画出矩形框时,第一次的矩形框就会蹦出来了。依次类推,的确会出现短暂的清屏效果,只是最终还是不能清屏。

误区二:

参考这里,http://www.eoeandroid.com/thread-79664-1-1.html,我用canvas.drawLine(),也就是说将paint设置为清屏模式的paint,把所有画的图形用这个画笔重新画一次,但遗憾的是这种效果也和第一种一样。

误区三:

有人提议用canvas的save和restore来解决,但很遗憾根本不是这么回事。参考:http://www.devdiv.com/article-1948-1.html

正确的方法是这样的,在SurfaceView里定义一个画图的方法,在这个画图方法的开始部分执行清屏,重点就三句话:

public void drawLine(Point p1, Point p2, Point p3)

{

Canvas canvas = sh.lockCanvas();

canvas.drawColor(Color.TRANSPARENT);

Paint p = new Paint();

//清屏

p.setXfermode(new PorterDuffXfermode(Mode.CLEAR));

canvas.drawPaint(p);

p.setXfermode(new PorterDuffXfermode(Mode.SRC));

p.setAntiAlias(true);

p.setColor(Color.RED);

p.setStyle(Paint.Style.FILL);

canvas.drawLine(0,0, 500, 500, p);

sh.unlockCanvasAndPost(canvas);

}

public void drawLine(Point p1, Point p2, Point p3)

{

Canvas canvas = sh.lockCanvas();

canvas.drawColor(Color.TRANSPARENT);

Paint p = new Paint();

//清屏

p.setXfermode(new PorterDuffXfermode(Mode.CLEAR));

canvas.drawPaint(p);

p.setXfermode(new PorterDuffXfermode(Mode.SRC));

p.setAntiAlias(true);

p.setColor(Color.RED);

p.setStyle(Paint.Style.FILL);

canvas.drawLine(0,0, 500, 500, p);

sh.unlockCanvasAndPost(canvas);

}

清屏:

Paint p = new Paint();

//清屏

p.setXfermode(new PorterDuffXfermode(Mode.CLEAR));

canvas.drawPaint(p);

p.setXfermode(new PorterDuffXfermode(Mode.SRC));

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值