日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

SurfaceView使用日记(二)--实例:绘画板

發(fā)布時間:2024/1/8 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。