打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
Android 如何清空 Canvas 清屏只需三句话

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

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

  1. <SPAN style="FONT-SIZE: 18px">void clearDraw()  
  2.     {  
  3.         /*对画布进行清屏*/  
  4.         Canvas canvas = sh.lockCanvas();  
  5.         if(canvas!=null){  
  6.             Paint paint = new Paint();  
  7.             paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR));  
  8.             canvas.drawPaint(paint);  
  9.             //canvas.drawColor(Color.BLUE);  
  10.         }          
  11.         sh.unlockCanvasAndPost(canvas);  
  12.     }</SPAN>  
  1. <span style="font-size:18px;">void clearDraw()  
  2.     {  
  3.         /*对画布进行清屏*/  
  4.         Canvas canvas = sh.lockCanvas();  
  5.         if(canvas!=null){  
  6.             Paint paint = new Paint();  
  7.             paint.setXfermode(new PorterDuffXfermode(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里定义一个画图的方法,在这个画图方法的开始部分执行清屏,重点就三句话:

  1. <SPAN style="FONT-SIZE: 18px">public void drawLine(Point p1, Point p2, Point p3)  
  2.     {  
  3.               
  4.         Canvas canvas = sh.lockCanvas();  
  5.         canvas.drawColor(Color.TRANSPARENT);  
  6.         Paint p = new Paint();  
  7.         //清屏   
  8.          p.setXfermode(new PorterDuffXfermode(Mode.CLEAR));  
  9.         canvas.drawPaint(p);  
  10.         p.setXfermode(new PorterDuffXfermode(Mode.SRC));  
  11.           
  12.         p.setAntiAlias(true);  
  13.         p.setColor(Color.RED);  
  14.         p.setStyle(Paint.Style.FILL);  
  15.         canvas.drawLine(0,0, 500, 500, p);  
  16.         sh.unlockCanvasAndPost(canvas);  
  17.           
  18.     }</SPAN>  
  1. <span style="font-size:18px;">public void drawLine(Point p1, Point p2, Point p3)  
  2.     {  
  3.               
  4.         Canvas canvas = sh.lockCanvas();  
  5.         canvas.drawColor(Color.TRANSPARENT);  
  6.         Paint p = new Paint();  
  7.         //清屏  
  8.          p.setXfermode(new PorterDuffXfermode(Mode.CLEAR));  
  9.         canvas.drawPaint(p);  
  10.         p.setXfermode(new PorterDuffXfermode(Mode.SRC));  
  11.           
  12.         p.setAntiAlias(true);  
  13.         p.setColor(Color.RED);  
  14.         p.setStyle(Paint.Style.FILL);  
  15.         canvas.drawLine(0,0, 500, 500, p);  
  16.         sh.unlockCanvasAndPost(canvas);  
  17.           
  18.     }</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

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
android 绘图之Paint的效果研究
详解Paint的setXfermode(Xfermode xfermode)
自定义View——PorterDuffXfermode
Android APIDemos 研读之二:android.graphics.Camera...
iPhone与Android自绘自定义控件比较
Android 完美实现图片圆角和圆形(对实现进行分析)
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服