用SurfaceView实现上篇View框架一样的例子
讲解写在注释里
复制代码
1 package com.example.gamesurfaceview2;
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.MotionEvent;
8 import android.view.SurfaceHolder;
9 import android.view.SurfaceHolder.Callback;
10 import android.view.SurfaceView;
11
12 //SurfaceView 还要继承CallBack接口
13 public class MySurfaceView extends SurfaceView implements Callback,Runnable{
14
15private SurfaceHolder sfh;
16private Paint paint;
17private int x,y;
18private Thread thread;
19private boolean flag;
20private Canvas canvas;
21private int w,h;
22
23public MySurfaceView(Context context) {
24super(context);
25// TODO Auto-generated constructor stub
26//通过SurfaceHolder来和Can打交道
27sfh = this.getHolder();
28//添加监听
29sfh.addCallback(this);
30x =20;
31y =20;
32paint = new Paint();
33paint.setColor(Color.WHITE);
34setFocusable(true);
35}
36
37@Override
38/**
39* surfaceView发生改变时执行的方法
40*/
41public void surfaceChanged(SurfaceHolder holder, int format, int width,
42int height) {
43// TODO Auto-generated method stub
44
45}
46
47@Override
48/**
49* surfaceView创建时执行的方法
50*/
51public void surfaceCreated(SurfaceHolder holder) {
52// TODO Auto-generated method stub
53h = this.getHeight();
54w = this.getWidth();
55flag = true;
56thread = new Thread(this);
57thread.start();
58}
59
60/**
61* 自己定义的绘画调用方法
62*/
63private void Mydraw() {
64try {
65// 获取一个加锁的画布,防止被其他修改
66canvas = sfh.lockCanvas();
67if (canvas != null) {
68//-----------利用填充矩形的方式,刷屏
69////绘制矩形
70//canvas.drawRect(0,0,this.getWidth(),
71//this.getHeight(), paint);
72//-----------利用填充画布,刷屏
73//canvas.drawColor(Color.BLACK);
74//-----------利用填充画布指定的颜色分量,刷屏
75// 没重画图像会叠在一起
76canvas.drawRGB(0, 0, 0);
77canvas.drawText("Game", x, y, paint);
78}
79} catch (Exception e) {
80// TODO: handle exception
81} finally {
82if (canvas != null)
83// 解锁和提交画布
84sfh.unlockCanvasAndPost(canvas);
85}
86}
87
88@Override
89/**
90* surfaceView被销毁时执行的方法
91*/
92public void surfaceDestroyed(SurfaceHolder holder) {
93// TODO Auto-generated method stub
94
95}
96
97
98@Override
99/**
100* 触摸屏幕事件
101*/
102public boolean onTouchEvent(MotionEvent event) {
103// TODO Auto-generated method stub
104x= (int) event.getX();
105y= (int) event.getY();
106return true;
107}
108
109
110/**
111* 游戏逻辑
112*/
113private void logic() {
114
115}
116@Override
117public void run() {
118while (flag) {
119long start = System.currentTimeMillis();
120Mydraw();
121logic();
122long end = System.currentTimeMillis();
123try {
124// 50毫秒刷新一次
125if (end - start < 50) {
126Thread.sleep(50 - (end - start));
127}
128} catch (InterruptedException e) {
129e.printStackTrace();
130}
131}
132}
133
134
135 }