SurfaceViewDemo
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)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Inna and Sequence
- 下一篇: 【编程题目】输入一个已经按升序排序过的数