Android攻城狮SurfaceView
SurfaceView:
? ?它的特性是:可以在主線(xiàn)程之外的線(xiàn)程中向屏幕繪圖上。這樣可以避免畫(huà)圖任務(wù)繁重的時(shí)候造成主線(xiàn)程阻塞,從而提高了程序的反應(yīng)速度。在游戲開(kāi)發(fā)中多用到 ? ? SurfaceView,游戲中的背景、人物、動(dòng)畫(huà)等等盡量在畫(huà)布canvas中畫(huà)出。
2、實(shí)現(xiàn)
? ? 首先繼承SurfaceView并實(shí)現(xiàn)SurfaceHolder.Callback接口
使用接口的原因:因?yàn)槭褂肧urfaceView 有一個(gè)原則,所有的繪圖工作必須得在Surface 被創(chuàng)建之后才能開(kāi)始(Surface—表面,這個(gè)概念在?圖形編程中常常被提到。基本上我們可以把它當(dāng)作顯存的一個(gè)映射,寫(xiě)入到Surface 的內(nèi)容
??????????????????? ? 可以被直接復(fù)制到顯存從而顯示出來(lái),這使得顯示速度會(huì)非常快),而在Surface 被銷(xiāo)毀之前必須結(jié)束。所以Callback 中的surfaceCreated 和surfaceDestroyed 就成了繪圖處理代碼的邊界。
需要重寫(xiě)的方法
(1)public?void?surfaceChanged(SurfaceHolder?holder,int?format,int?width,int?height){}
????//在surface的大小發(fā)生改變時(shí)激發(fā)
(2)public?void?surfaceCreated(SurfaceHolder?holder){}
????//在創(chuàng)建時(shí)激發(fā),一般在這里調(diào)用畫(huà)圖的線(xiàn)程。
(3)public?void?surfaceDestroyed(SurfaceHolder?holder)?{}
????//銷(xiāo)毀時(shí)激發(fā),一般在這里將畫(huà)圖的線(xiàn)程停止、釋放。
整個(gè)過(guò)程:繼承SurfaceView并實(shí)現(xiàn)SurfaceHolder.Callback接口 ----> SurfaceView.getHolder()獲得SurfaceHolder對(duì)象 ---->SurfaceHolder.addCallback(callback)添加回調(diào)函數(shù)---->SurfaceHolder.lockCanvas()獲得Canvas對(duì)象并鎖定畫(huà)布----> Canvas繪畫(huà) ---->SurfaceHolder.unlockCanvasAndPost(Canvas canvas)結(jié)束鎖定畫(huà)圖,并提交改變,將圖形顯示。
3、SurfaceHolder
這里用到了一個(gè)類(lèi)SurfaceHolder,可以把它當(dāng)成surface的控制器,用來(lái)操縱surface。處理它的Canvas上畫(huà)的效果和動(dòng)畫(huà),控制表面,大小,像素等。
幾個(gè)需要注意的方法:
(1)、abstract void addCallback(SurfaceHolder.Callback callback);
// 給SurfaceView當(dāng)前的持有者一個(gè)回調(diào)對(duì)象。
(2)、abstract Canvas lockCanvas();
// 鎖定畫(huà)布,一般在鎖定后就可以通過(guò)其返回的畫(huà)布對(duì)象Canvas,在其上面畫(huà)圖等操作了。
(3)、abstract Canvas lockCanvas(Rect dirty);
// 鎖定畫(huà)布的某個(gè)區(qū)域進(jìn)行畫(huà)圖等..因?yàn)楫?huà)完圖后,會(huì)調(diào)用下面的unlockCanvasAndPost來(lái)改變顯示內(nèi)容。
// 相對(duì)部分內(nèi)存要求比較高的游戲來(lái)說(shuō),可以不用重畫(huà)dirty外的其它區(qū)域的像素,可以提高速度。
(4)、abstract void unlockCanvasAndPost(Canvas canvas);
// 結(jié)束鎖定畫(huà)圖,并提交改變。
?
1 public class GameView extends SurfaceView implements Callback { 2 private Contanier contanier; 3 private Rect rect; 4 private Circle circle; 5 6 public GameView(Context context) { 7 super(context); 8 contanier = new Contanier(); 9 rect = new Rect(); 10 circle = new Circle(); 11 rect.addChildrenView(circle); 12 contanier.addChildrenView(rect); 13 getHolder().addCallback(this); 14 } 15 16 public void draw() { 17 Canvas canvas = getHolder().lockCanvas(); 18 canvas.drawColor(Color.WHITE); 19 contanier.draw(canvas); 20 21 getHolder().unlockCanvasAndPost(canvas); 22 23 } 24 25 private Timer timer = null; 26 private TimerTask task = null; 27 28 public void startTimer() { 29 timer = new Timer(); 30 task = new TimerTask() { 31 32 @Override 33 public void run() { 34 // TODO Auto-generated method stub 35 draw(); 36 } 37 }; 38 timer.schedule(task, 100, 100); 39 } 40 41 public void stopTimer() { 42 if (timer != null) { 43 timer.cancel(); 44 timer = null; 45 } 46 } 47 48 @Override 49 public void surfaceCreated(SurfaceHolder holder) { 50 // TODO Auto-generated method stub 51 startTimer(); 52 } 53 54 @Override 55 public void surfaceChanged(SurfaceHolder holder, int format, int width, 56 int height) { 57 // TODO Auto-generated method stub 58 59 } 60 61 @Override 62 public void surfaceDestroyed(SurfaceHolder holder) { 63 // TODO Auto-generated method stub 64 stopTimer(); 65 } 66 67 }?
1 public class Contanier { 2 private List<Contanier> children = null; 3 private float x = 0, y = 0; 4 5 public Contanier() { 6 // TODO Auto-generated constructor stub 7 children = new ArrayList<Contanier>(); 8 } 9 10 public void draw(Canvas canvas) { 11 canvas.save(); 12 canvas.translate(getX(), getY()); 13 childrenView(canvas); 14 for (Contanier c : children) { 15 c.draw(canvas); 16 17 } 18 canvas.restore(); 19 } 20 21 public void childrenView(Canvas canvas) { 22 23 } 24 25 public void addChildrenView(Contanier child) { 26 children.add(child); 27 } 28 29 public void removeChildrenView(Contanier child) { 30 children.remove(child); 31 } 32 33 public float getX() { 34 return x; 35 } 36 37 public void setX(float x) { 38 this.x = x; 39 } 40 41 public float getY() { 42 return y; 43 } 44 45 public void setY(float y) { 46 this.y = y; 47 } 48 49 } 1 public class Rect extends Contanier { 2 private Paint paint = null; 3 4 public Rect() { 5 // TODO Auto-generated constructor stub 6 paint = new Paint(); 7 paint.setColor(Color.GREEN); 8 } 9 10 @Override 11 public void childrenView(Canvas canvas) { 12 // TODO Auto-generated method stub 13 super.childrenView(canvas); 14 canvas.drawRect(0, 0, 100, 100, paint); 15 this.setY(this.getY()+1); 16 } 17 } 1 public class Circle extends Contanier { 2 private Paint paint = null; 3 4 public Circle() { 5 // TODO Auto-generated constructor stub 6 paint = new Paint(); 7 paint.setColor(Color.BLUE); 8 9 } 10 11 @Override 12 public void childrenView(Canvas canvas) { 13 // TODO Auto-generated method stub 14 super.childrenView(canvas); 15 canvas.drawCircle(50, 50, 50, paint); 16 } 17 }
?
轉(zhuǎn)載于:https://www.cnblogs.com/my334420/p/6899832.html
總結(jié)
以上是生活随笔為你收集整理的Android攻城狮SurfaceView的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Relation(NOIP模拟赛)(二分
- 下一篇: III USP Freshmen Con