导航

Android学习之简单实现SurfaceView

Posted on 2011-10-01 12:37  Qamefay  阅读(1550)  评论(7编辑  收藏  举报

下面就贴上一个小程序代码,主要运用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)方法来,详细的在代码里已注释。