這兩三天一直在研究這個問題,今天終於成功了。我最終要實現的效果是,類似於照相機照相時,第一次按下按鍵,會出現矩形框框住人臉,這時我不想照相,再次按下會再次框出人臉,重新畫個新的矩形框。 就這麼簡單。
誤區一:我設定了一個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); }
然後每次按下按鍵進行識別物體的演算法前,先進行清屏。得到的效果是,確實清屏了,但第二次畫出矩形框時,第一次的矩形框就會蹦出來了。依次類推,的確會出現短暫的清屏效果,只是最終還是不能清屏。
誤區二:
參考這裡,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); }
清屏:
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
需要討論的,請加android每日一講qq群:248217350 歡迎大家加進來