该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
package flyMod.skill.SurfaceView;
import android.content.*;
import android.graphics.*;
import android.view.*;
import android.view.SurfaceHolder.*;
import android.view.animation.*;
//继承SurfaceView类并实现接口(注意Callback请导包:android.view.SurfaceHolder,不要导错了,否则无法surfaceCreated)
public class MySurfaceView extends SurfaceView implements Callback,Runnable
{
//声明
private SurfaceHolder sfh;//用于控制SurfaceView
private Paint paint;//画笔
private Canvas canvas;//画布
private long THREAD_SLEEP = 32;//刷新间隔(毫秒),即每32毫秒刷新一次
private Thread th;//线程
private boolean flag;//线程消亡的标识
private float screenW,screenH;//屏幕宽高
//构造函数
public MySurfaceView(Context context)
{
super(context);
sfh = this.getHolder();//实例化SurfaceHolder
sfh.addCallback(this);
paint = new Paint();//实例化画笔
setFocusable(true);//设置焦点
}
//视图创建函数(请在此函数中获取屏幕宽高)
@Override
public void surfaceCreated(SurfaceHolder holder)
{
//获取屏幕宽高
screenW = this.getWidth();
screenH = this.getHeight();
flag = true;//标识线程启动
th = new Thread(this);//实例化线程
th.start();//开启线程
}
//自定义逻辑函数
private void logic()
{
//避免不可预知的问题,逻辑函数用try...catch处理
try
{
/**在此处添加逻辑*/
}
catch(Exception e)
{}
}
//自定义绘图函数
public void MyDraw()
{
//避免不可预知的问题,绘图函数用try...catch处理
try
{
canvas = sfh.lockCanvas();//锁住画布
if(canvas != null)
{
/**在此处绘图*/
}
}
catch(Exception e)
{}
//防止绘图过程出错而导致直接跳过“提交画布并解锁”,所以在finally中提交画布并解锁
//如果不“提交画布并解锁”,下次锁住画布时会出现异常:画布未解锁
finally
{
if(canvas != null)
sfh.unlockCanvasAndPost(canvas);//解锁并提交画布
}
}
//触屏监听函数
@Override
public boolean onTouchEvent(MotionEvent event)
{
/**在此处处理触屏事件*/
return true;
}
//实体按键按下监听函数
@Override
public boolean onKeyDown(int keyCode, KeyEvent event)
{
/**在此处处理实体按键按下事件*/
return super.onKeyDown(keyCode, event);
}
//线程
@Override
public void run()
{
while(flag)//当标识为真时线程处理
{
//控制刷新速率(控制fps)
long start = System.currentTimeMillis();//获取系统时间戳
MyDraw();//执行绘图
logic();//执行逻辑
long end = System.currentTimeMillis();//再获取一个系统时间戳
try
{
//如果绘图和逻辑耗时低于预设刷新速度,则线程休眠(预设值-耗时)
//如果绘图和逻辑耗时高于预设刷新速度(可以理解为“卡了”),则线程不再休眠
if(end - start < THREAD_SLEEP)
{
Thread.sleep(THREAD_SLEEP - (end - start));
}
}
catch(InterruptedException e)
{
e.printStackTrace();
}
}
}
//视图状态发生改变
@Override
public void surfaceChanged(SurfaceHolder holder,int format,int width,int height)
{
}
//视图销毁时
@Override
public void surfaceDestroyed(SurfaceHolder holder)
{
flag = false;//标识为假,停止线程
}
}