android开发--Canvas清屏只需三句话

分类: Android开发 4269人阅读 评论(19)收藏 举报

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

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

[java] view plaincopyprint?
  1. <SPANstyle="FONT-SIZE:18px">voidclearDraw()
  2. {
  3. /*对画布进行清屏*/
  4. Canvascanvas=sh.lockCanvas();
  5. if(canvas!=null){
  6. Paintpaint=newPaint();
  7. paint.setXfermode(newPorterDuffXfermode(PorterDuff.Mode.CLEAR));
  8. canvas.drawPaint(paint);
  9. //canvas.drawColor(Color.BLUE);
  10. }
  11. sh.unlockCanvasAndPost(canvas);
  12. }</SPAN>


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

误区二:

参考这里,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里定义一个画图的方法,在这个画图方法的开始部分执行清屏,重点就三句话:

[java] view plaincopyprint?
  1. <SPANstyle="FONT-SIZE:18px">publicvoiddrawLine(Pointp1,Pointp2,Pointp3)
  2. {
  3. Canvascanvas=sh.lockCanvas();
  4. canvas.drawColor(Color.TRANSPARENT);
  5. Paintp=newPaint();
  6. //清屏
  7. p.setXfermode(newPorterDuffXfermode(Mode.CLEAR));
  8. canvas.drawPaint(p);
  9. p.setXfermode(newPorterDuffXfermode(Mode.SRC));
  10. p.setAntiAlias(true);
  11. p.setColor(Color.RED);
  12. p.setStyle(Paint.Style.FILL);
  13. canvas.drawLine(0,0,500,500,p);
  14. sh.unlockCanvasAndPost(canvas);
  15. }</SPAN>


清屏:

Paint p = new Paint();
//清屏
p.setXfermode(new PorterDuffXfermode(Mode.CLEAR));
canvas.drawPaint(p);
p.setXfermode(new PorterDuffXfermode(Mode.SRC));

。。。。。。。。这里设置paint并开始自己的画图。。。。。。。。。

参考:http://stackoverflow.com/questions/4650755/clearing-canvas-with-canvas-drawcolor

http://blog.csdn.net/yuanlong_zheng/article/details/7592457

更多相关文章

  1. Android从零开搞系列:自定义View(15)仿天天美剧拖动卡片的效果(下)
  2. javascript实现拖动层效果代码(许愿墙)
  3. spring data RedisTemplate无效果
  4. java 画图注意 改变窗口大小不会消失

随机推荐

  1. Python下numpy不成功的解决办法(wheel方法
  2. python应用之socket编程
  3. [Python]—Linux Server 系统监控程序
  4. 对照java和spring理解python中单例模式的
  5. pycharm调试器中的python3.4 AssertionEr
  6. 剑指offer python版 数组中只出现一次的
  7. python自动化开发
  8. Python正则表达式在分隔符之间查找特殊字
  9. python -- 0/1背包问题(动态规划-dict)
  10. 一个有意思的学习python的方式