SurfaceView使用日记(二)--实例:绘画板
生活随笔
收集整理的這篇文章主要介紹了
SurfaceView使用日记(二)--实例:绘画板
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
前言:
在知道了SurfaceView的使用方法,以后實踐,只最好的學(xué)習(xí)方法,所以在基本掌握了SurfaceView的用法后,我們通過一個實例的編寫來更加深入的去掌握SurfaceView.由于它具有獨立的子線程進(jìn)行,圖形繪制的同時,不會堵塞主線程,所以SurfaceView常用再游戲開發(fā)和一些需要經(jīng)常刷新屏幕或者試進(jìn)行數(shù)據(jù)處理的應(yīng)用當(dāng)中,接下來我們要編寫的一個項目試?yán)L畫板,展現(xiàn)了如何使用SurfaceView來實現(xiàn)這一功能.
分析:
繪畫板就是,通過記錄用戶接觸屏幕的路徑,然后繪制下來,所以可以通過使用Path對象來記錄手指滑動的路徑,然后進(jìn)行繪制.
編寫:
整個代碼是基于上一篇博客的樣例代碼之上的,所以我就只把關(guān)鍵部分的代碼貼出來了,有興趣的朋友,可以自己回去試試.
在SurfaceView的onTouchEvent()中來記錄Path的路徑
public boolean onTouchEvent(MotionEvent event){int x = (int)event.getX();int y = (int)event.getY();switch (event.getAction()){case MotionEvent.ACTION_DOWN:mPath.moveTo(x,y);break;case MotionEvent.ACTION_MOVE:mPath.lineTo(x,y);break;case MotionEvent.ACTION_UP:break;}return true;}再draw()方法中進(jìn)行繪制,代碼如下
private void draw(){try {mCanvas = mHolder.lockCanvas();//draw somethingmCanvas.drawColor(Color.WHITE);mCanvas.drawPath(mPath , mPaint);}catch (Exception e){}finally {if(mCanvas != null){mHolder.unlockCanvasAndPost(mCanvas);//確保子線程將畫布提交}}}優(yōu)化:再前面的模版中,我們在子線程中不斷的調(diào)用draw()方法進(jìn)行繪制,但有時候繪制也不用那么頻繁, 因此我們可以在子線程中,進(jìn)行sleep操作,盡可能的節(jié)省系統(tǒng)資源,代碼如下:
public void run(){long start = System.currentTimeMillis();while(isDrawing){draw();}long end = System.currentTimeMillis();//50-100if(end - start < 100){try {Thread.sleep(100 - (end - start));}catch (InterruptedException e){e.printStackTrace();}}}通過判斷draw()方法所使用邏輯的時長來確定sleep的時長, 這是一個非常通用的解決方案,代碼中的100ms是一個大致的經(jīng)驗值,這個值一般在50ms到100ms之間.
繪圖效果如下
模擬器上面畫的有帶你丑請見諒~
總結(jié)
以上是生活随笔為你收集整理的SurfaceView使用日记(二)--实例:绘画板的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 版本错误:@annotation poi
- 下一篇: 加载3d模型