1.概念canvas
SurfaceView是View類的子類,能夠直接從內存或者DMA等硬件接口取得圖像數據,是個很是重要的繪圖視圖。它的特性是:能夠在主線程以外的 線程中向屏幕繪圖上。這樣能夠避免畫圖任務繁重的時候形成主線程阻塞,從而提升了程序的反應速度。在遊戲開發中多用到SurfaceView,遊戲中的背 景、人物、動畫等等儘可能在畫布canvas中畫出。ide
2.實現方法函數
1)實現步驟動畫
a.繼承SurfaceViewspa
b.實現SurfaceHolder.Callback接口線程
2)須要重寫的方法code
(1) surfaceChanged(SurfaceHolder holder, format, width, height){} (2) surfaceCreated(SurfaceHolder holder){} (3) surfaceDestroyed(SurfaceHolder holder) {}
3)SurfaceHolderorm
SurfaceHolder,surface的控制器,用來操縱surface。處理它的Canvas上畫的效果和動畫,控制表面,大小,像素等。
幾個須要注意的方法:對象
(1)、 addCallback(SurfaceHolder.Callback callback); (2)、 Canvas lockCanvas(); (3)、 Canvas lockCanvas(Rect dirty); (4)、 unlockCanvasAndPost(Canvas canvas);
4)總結整個過程繼承
繼承SurfaceView並實現SurfaceHolder.Callback接口 ----> SurfaceView.getHolder()得到SurfaceHolder對象 ---->SurfaceHolder.addCallback(callback)添加回調函數---->SurfaceHolder.lockCanvas()得到Canvas對象並鎖定畫布----> Canvas繪畫 ---->SurfaceHolder.unlockCanvasAndPost(Canvas canvas)結束鎖定畫圖,並提交改變,將圖形顯示。
下面是一個完整的案例:
public class ViewTest extends Activity {
@Override onCreate(Bundle savedInstanceState) { .onCreate(savedInstanceState); setContentView( MyView()); }
MyView SurfaceView SurfaceHolder.Callback { SurfaceHolder holder; MyThread myThread; MyView(Context context) { (context); holder = .getHolder(); holder.addCallback(); myThread = MyThread(holder); } @Override surfaceChanged(SurfaceHolder holder, format, width, height) { } @Override surfaceCreated(SurfaceHolder holder) { myThread.isRun = ; myThread.start(); } @Override surfaceDestroyed(SurfaceHolder holder) { myThread.isRun = ; } } MyThread Thread { SurfaceHolder holder; isRun ; MyThread(SurfaceHolder holder) { .holder =holder; isRun = ; } @Override run() { count = 0; (isRun) { Canvas c = ; { (holder){ c = holder.lockCanvas(); c.drawColor(Color.BLACK); Paint p = Paint(); p.setColor(Color.WHITE); Rect r = Rect(100, 50, 300, 250); c.drawRect(r, p); c.drawText("這是第"+(count++)+"秒", 100, 310, p); Thread.sleep(1000); } } (Exception e) { e.printStackTrace(); } { (c!= ) { holder.unlockCanvasAndPost(c); } } } } } }