下面就貼上一個小程式代碼,主要運用SurfaceView來實現在螢幕上畫一個圓,你可以通過按方向鍵和觸控螢幕幕來改變圓的位置。
MainActivity
1 package com.view;
2
3 import android.app.Activity;
4 import android.os.Bundle;
5 import android.view.Window;
6 import android.view.WindowManager;
7
8 public class MainActivity extends Activity {
9 /** Called when the activity is first created. */
10 @Override
11 public void onCreate(Bundle savedInstanceState) {
12 super.onCreate(savedInstanceState);
13
14 // 隱藏狀態列
15 this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
16 WindowManager.LayoutParams.FLAG_FULLSCREEN);
17
18 // 把Activity的標題去掉
19 requestWindowFeature(Window.FEATURE_NO_TITLE);
20
21 // 設定布局
22 this.setContentView(new MySurfaceView(this));
23 }
24 }
MainActivity主要就設定螢幕全屏。
MySurfaceView
1 package com.view;
2
3 import android.content.Context;
4 import android.graphics.Canvas;
5 import android.graphics.Color;
6 import android.graphics.Paint;
7 import android.view.KeyEvent;
8 import android.view.MotionEvent;
9 import android.view.SurfaceHolder;
10 import android.view.SurfaceHolder.Callback;
11 import android.view.SurfaceView;
12
13 public class MySurfaceView extends SurfaceView implements Runnable, Callback {
14
15 private SurfaceHolder mHolder; // 用於控制SurfaceView
16
17 private Thread t; // 聲明一條線程
18
19 private boolean flag; // 線程啟動並執行標識,用於控制線程
20
21 private Canvas mCanvas; // 聲明一張畫布
22
23 private Paint p; // 聲明一支畫筆
24
25 private int x = 50, y = 50, r = 10; // 圓的座標和半徑
26
27 public MySurfaceView(Context context) {
28 super(context);
29
30 mHolder = getHolder(); // 獲得SurfaceHolder對象
31 mHolder.addCallback(this); // 為SurfaceView添加狀態監聽
32 p = new Paint(); // 建立一個畫筆對象
33 p.setColor(Color.WHITE); // 設定畫筆的顏色為白色
34 setFocusable(true); // 設定焦點
35 }
36
37 /**
38 * 自訂一個方法,在畫布上畫一個圓
39 */
40 public void Draw() {
41 mCanvas = mHolder.lockCanvas(); // 獲得畫布對象,開始對畫布畫畫
42 mCanvas.drawRGB(0, 0, 0); // 把畫布填充為黑色
43 mCanvas.drawCircle(x, y, r, p); // 畫一個圓
44 mHolder.unlockCanvasAndPost(mCanvas); // 完成畫畫,把畫布顯示在螢幕上
45 }
46
47 /**
48 * 當SurfaceView建立的時候,調用此函數
49 */
50 @Override
51 public void surfaceCreated(SurfaceHolder holder) {
52 t = new Thread(this); // 建立一個線程對象
53 flag = true; // 把線程啟動並執行標識設定成true
54 t.start(); // 啟動線程
55 }
56
57 /**
58 * 當SurfaceView的視圖發生改變的時候,調用此函數
59 */
60 @Override
61 public void surfaceChanged(SurfaceHolder holder, int format, int width,
62 int height) {
63 }
64
65 /**
66 * 當SurfaceView銷毀的時候,調用此函數
67 */
68 @Override
69 public void surfaceDestroyed(SurfaceHolder holder) {
70 flag = false; // 把線程啟動並執行標識設定成false
71 }
72
73 /**
74 * 當螢幕被觸摸時調用
75 */
76 @Override
77 public boolean onTouchEvent(MotionEvent event) {
78 x = (int) event.getX(); // 獲得螢幕被觸摸時對應的X軸座標
79 y = (int) event.getY(); // 獲得螢幕被觸摸時對應的Y軸座標
80 return true;
81 }
82
83 /**
84 * 當使用者按鍵時調用
85 */
86 @Override
87 public boolean onKeyDown(int keyCode, KeyEvent event) {
88 if(keyCode == KeyEvent.KEYCODE_DPAD_UP){ //當使用者點擊↑鍵時
89 y--; //設定Y軸座標減1
90 }
91 return super.onKeyDown(keyCode, event);
92 }
93
94 @Override
95 public void run() {
96 while (flag) {
97 Draw(); // 調用自訂畫畫方法
98 try {
99 Thread.sleep(50); // 讓線程休息50毫秒
100 } catch (InterruptedException e) {
101 e.printStackTrace();
102 }
103 }
104 }
105
106 }
MySurfaceView首先繼承SurfaceView,然後實現Runnable和Callback介面,重寫了Runnable的run方法和Callback的surfaceCreated(SurfaceHolder holder),surfaceChanged(SurfaceHolder holder, int format, int width,int height),surfaceDestroyed(SurfaceHolder holder)方法,還實現了onTouchEvent(MotionEvent event),onKeyDown(int keyCode, KeyEvent event)方法來,詳細的在代碼裡已注釋。