import android.content.Context;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Rect;
import android.graphics.Region;
import android.view.KeyEvent;
import android.view.MotionEvent;
import android.view.SurfaceHolder;
import android.view.SurfaceHolder.Callback;
import android.view.SurfaceView;
/**
*
* @author David
*
*/
public class MySurfaceView extends SurfaceView implements Callback, Runnable {
// 用于控制SurfaceView 的大小、格式等,并且主要用于监听SurfaceView 的状态
private SurfaceHolder sfh;
// 声明一个画笔
private Paint paint;
// 声明一个画布
private Canvas canvas;
// 声明一个线程
private Thread th;
// 线程消亡的标识符
private boolean flag;
// 声明屏幕的宽高
private int screenW, screenH;
// 定义碰撞矩形
private Rect rect = new Rect(0, 0, 50, 50);
// 定义Region类实例
private Region r = new Region(rect);
// 表示是否发生碰撞的标识位
private boolean isInclude;
/**
* SurfaceView 初始化函数
*
* @param context
*/
public MySurfaceView(Context context) {
super(context);
// 实例SurfaceView
sfh = this.getHolder();
// 为SurfaceView添加状态监听
sfh.addCallback(this);
// 实例一个画笔
paint = new Paint();
// 设置字体大小
paint.setTextSize(20);
// 设置画笔的颜色
paint.setColor(Color.WHITE);
// 设置画布无锯齿
paint.setAntiAlias(true);
// 设置焦点
setFocusable(true);
}
/**
* SurfaceView 视图状态发生改变时,响应此函数
*/
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width,
int height) {
}
/**
* SurfaceView 视图创建,响应此函数
*/
@Override
public void surfaceCreated(SurfaceHolder holder) {
screenW = this.getWidth();// 屏幕的宽
screenH = this.getHeight();// 屏幕的高
flag = true;
// 实例线程
th = new Thread(this);
// 启动线程
th.start();
}
/**
* SurfaceView 视图消亡时,响应此函数
*/
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
flag = false;
}
/**
* 游戏绘图
*/
private void myDraw() {
try {
// 获取SurfaceView 的Canvas 对象,
canvas = sfh.lockCanvas();
if (canvas != null) {
// 刷新画布,背景为黑色
canvas.drawColor(Color.BLACK);
// 标识位为真时,绘制icon图
if (isInclude) {
canvas.drawBitmap(BitmapFactory.decodeResource(
this.getResources(), R.drawable.ic_launcher), 100,
50, paint);
}
// 绘制矩形区域(便于观察)
canvas.drawRect(rect, paint);
}
} catch (Exception e) {
} finally {
if (canvas != null) {
// 解锁画布和提交
sfh.unlockCanvasAndPost(canvas);
}
}
}
/**
* 触屏事件监听
*/
@Override
public boolean onTouchEvent(MotionEvent event) {
// 判定用户触屏的坐标点是否在碰撞矩形内
if (r.contains((int) event.getX(), (int) event.getY())) {
isInclude = true;
} else {
isInclude = false;
}
return true;
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
return super.onKeyDown(keyCode, event);
}
/**
* 游戏逻辑
*/
private void logic() {
}
@Override
public void run() {
while (flag) {
long start = System.currentTimeMillis();
myDraw();
logic();
long end = System.currentTimeMillis();
try {
if (end - start < 50) {
Thread.sleep(50 - (end - start));
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
}