package com.example.test;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.view.MotionEvent;
import android.view.SurfaceHolder;
import android.view.SurfaceHolder.Callback;
import android.view.SurfaceView;
/**
* 繼承SurfaceView
* 實現SurfaceHolder.Callback,給SurfaceHolder用的
* 創建SurfaceHolder,並addCallback,SurfaceView的一切都有SurfaceHolder控制
*/
public class MySurfaceView extends SurfaceView
implements Callback, Runnable {
//SurfaceView基本
private SurfaceHolder sfh;//操控SurfaceView
private Paint p;
private Canvas c;
//線程
private Thread t;
private boolean flag;
//數據
private int screenW, screenH;
private int xx = 100, yy = 100;
public MySurfaceView(Context context) {
super(context);
sfh = this.getHolder();
sfh.addCallback(this);
p = new Paint();
p.setColor(Color.RED);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
xx = (int) event.getX();
yy = (int) event.getY();
return true;
}
public void myDraw() {
try {
//當SurfaceView不可編輯或尚未創建,會返回null
c = sfh.lockCanvas();
if(c != null) {
c.drawColor(Color.GREEN);//刷屏
c.drawText("me", xx, yy, p);//畫
}
} catch(Exception e) {
} finally {
if(c != null) {
sfh.unlockCanvasAndPost(c);
}
}
}
//遊戲邏輯
public void logic() {
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
screenW = this.getWidth();
screenH = this.getHeight();
//線程的初始化和啓動都寫在create裏面
flag = true;
t = new Thread(this);
t.start();
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width,
int height) {
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
flag = false;
}
@Override
public void run() {
while (flag) {
//刷屏時間保持一致
//一般會在10~20幀左右
//每秒20幀:1000ms/20=50ms每幀
long start = System.currentTimeMillis();
myDraw();
logic();
long end = System.currentTimeMillis();
try {
if(end - start < 50) {
Thread.sleep(50 - (end-start));
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
SurfaceView的生命週期: