Android开发 函数作图,【Android开发】SurfaceView绘图

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼

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;//标识为假,停止线程

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值