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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

SurfaceViewDemo

發(fā)布時間:2024/4/14 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 SurfaceViewDemo 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

SurfaceView是使用的雙緩沖機(jī)制,所以在性能上面是比view更優(yōu)越的類,在使用SurfaceView的時候其實并不是和SurfaceView直接打交道,而是通過SurfaceHolder的實例來控制SurfaceView的大小和格式等,并且主要用于監(jiān)聽surfaceview的狀態(tài),獲取canvas對象的方式即通過surfaceholder的lockcanvas()方法鎖定畫布,并且返回一個canvas,然后就可以在獲得的畫布上面大展手腳了!!!當(dāng)繪制完畢的時候通過surfaceholder的unloccanvasandpost();方法即可解鎖畫布,并且提交。

當(dāng)對surfaceview進(jìn)行監(jiān)聽的時候必須實現(xiàn)surfaceholder的callback接口即必須重寫三個函數(shù):surfacechanged、surfacecreated、surfacedestroyed最后通過surfaceholder類的addcallback(Callback callback);方法將其監(jiān)聽借口實例傳入,即可完成對surfaceView的監(jiān)聽。以下是一個小的demo:

MSurfaceView.java

public class MSurfaceView extends SurfaceView implements Callback{private Paint paint;private SurfaceHolder holder;private int x, y;private int radius;public MSurfaceView(Context context){super(context);// TODO Auto-generated constructor stubpaint = new Paint();holder = this.getHolder();holder.addCallback(this);paint.setColor(Color.RED);}@Overridepublic void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2, int arg3) {// TODO Auto-generated method stub//mDraw(); }@Overridepublic void surfaceCreated(SurfaceHolder arg0) {// TODO Auto-generated method stub }@Overridepublic void surfaceDestroyed(SurfaceHolder arg0) {// TODO Auto-generated method stub } public void mDraw(){Canvas canvas = holder.lockCanvas();canvas.drawText("HELLO SURFACEVIEW", x, y, paint);canvas.drawCircle(x, y, setRadius(), paint);holder.unlockCanvasAndPost(canvas);}private int setRadius(){radius = (int)(Math.random()*20);return radius;}@Overridepublic boolean onTouchEvent(MotionEvent event) {// TODO Auto-generated method stubx = (int)event.getX();y = (int)event.getY();mDraw();return true;}}

在Mainactivity.java文件里面將surfaceView作為當(dāng)前顯示的view:

public class MainActivity extends Activity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);requestWindowFeature(Window.FEATURE_NO_TITLE);setContentView(new MSurfaceView(this));}}

運(yùn)行效果如下:

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

現(xiàn)在實現(xiàn)通過自定義一個線程來繪制surfaceview,線程的定義通過implements Runnable接口來完成,代碼做如下修改:

public class MSurfaceView extends SurfaceView implements Callback, Runnable{private Paint paint;private SurfaceHolder holder;private int x, y;private int radius;private Thread mThread;private boolean threadstate;public MSurfaceView(Context context){super(context);// TODO Auto-generated constructor stubpaint = new Paint();holder = this.getHolder();holder.addCallback(this);paint.setColor(Color.RED);setFocusable(true);}@Overridepublic void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2, int arg3) {// TODO Auto-generated method stub//mDraw(); }@Overridepublic void surfaceCreated(SurfaceHolder arg0) {// TODO Auto-generated method stubthreadstate = true;mThread = new Thread(this);mThread.start();}@Overridepublic void surfaceDestroyed(SurfaceHolder arg0) {// TODO Auto-generated method stubthreadstate = false;} public void mDraw(){Canvas canvas = holder.lockCanvas();if (canvas != null) {canvas.drawRGB(0, 0, 0);canvas.drawText("HELLO SURFACEVIEW", x, y, paint);canvas.drawCircle(x, y, setRadius(), paint);}holder.unlockCanvasAndPost(canvas);}private int setRadius(){radius = (int)(Math.random()*20);return radius;}@Overridepublic boolean onTouchEvent(MotionEvent event) {// TODO Auto-generated method stubx = (int)event.getX();y = (int)event.getY(); // mDraw();return true;}@Overridepublic void run() {int X = 500;// TODO Auto-generated method stubwhile(threadstate){long start = System.currentTimeMillis();mDraw();long end = System.currentTimeMillis();try {if ((end - start) < X) {Thread.sleep(X - (end - start));}} catch (InterruptedException e) {// TODO Auto-generated catch block e.printStackTrace();}}}}

其中的setradius()方法是簡單的實現(xiàn)了為繪制的園隨機(jī)取半徑大小,而這句代碼:canvas.drawRGB(0,0,0);的作用即覆蓋畫布,意思就是在第一次畫的東西上面重新設(shè)置了畫布的顏色用以把第一次畫的東西覆蓋掉,這樣看起來就有了刷屏的效果了,還有其他幾種“刷屏”的方式:

1.每次回執(zhí)之前先繪制一個與屏幕大小相等的圖形覆蓋在屏幕上面;

2.每次繪制之前重新繪制屏幕的顏色,即繪制畫布的顏色;

3.~~~~~~指定RGB來填充canvas(本例的做法);

4.~~~~~繪制一張背景圖片,很多游戲場景就是這么做的;

其實實現(xiàn)原理都是一樣,即想辦法覆蓋掉原來的東西MainAcitivity.java的代碼沒有改變。
運(yùn)行效果如下:

?

轉(zhuǎn)載于:https://www.cnblogs.com/tiejiangweigaibianercunzai/p/3894404.html

總結(jié)

以上是生活随笔為你收集整理的SurfaceViewDemo的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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