android 去锯齿
引用:http://www.linuxidc.com/Linux/2011-11/48318.htm
// 设置Paint为无锯齿
32 mPaint.setAntiAlias(true);
全文
症状:游戏过程中,按下Home键返回手机主菜单,再点击游戏图标试图返回游戏的时候屏幕黑的一片!
以前一直没在意只有结束线程在运行游戏,今天觉得改仔细琢磨一下这个问题了!
首先第一件事:打印Logo看看按下Home键后会调用哪些方法,结果如下:
游戏过程中按下Home后:
11-29 20:42:07.090: I/System.out(18835): Activity onPause...
11-29 20:42:14.190: I/System.out(18835): Activity onStop...
11-29 20:42:14.260: I/System.out(18835): SurfaceView surfaceDestroyed...
可见SurfaceView 在返回手机主菜单的时候被销毁了,而我的SurfaceView 主线程是在构造方法里创建的
那么我们返回游戏的时候会调哪些方法呢?接着看Log:
11-29 20:48:06.940: I/System.out(18835): Activity onRestart...
11-29 20:48:06.950: I/System.out(18835): Activity onResume...
11-29 20:48:07.230: I/System.out(18835): SurfaceView surfaceCreated...
11-29 20:48:07.240: I/System.out(18835): SurfaceView surfaceChanged...
surfaceDestroyed 的时候线程已经退出了运行,这时再返回到游戏刷屏的线程就没了,任何绘制方法都没调用,所以你看到的只有黑漆漆的屏幕啦!
明白了运行原理我们就知道改怎么做啦!
首先创建线程放在surfaceCreated ,并启动线程,
当surfaceDestroyed 调用的时候,线程已经无效了,我们把线程对象设为null释放他,
然后不管怎么返回线程都会继续运行你的游戏也就不会中断了,来段简单的代码更具表达力度!
- packagecom.game.view;
- importAndroid.content.Context;
- importAndroid.graphics.Canvas;
- importAndroid.graphics.Paint;
- importAndroid.graphics.Paint.Style;
- importAndroid.graphics.Rect;
- importAndroid.view.SurfaceHolder;
- importAndroid.view.SurfaceHolder.Callback;
- importAndroid.view.SurfaceView;
- publicclassTestViewextendsSurfaceViewimplementsCallback,Runnable{
- publicstaticfinalintGAME_HEART=1000/30;//每秒刷新30次
- publicstaticintscreenW,screenH;
- privateThreadthread;
- privateSurfaceHolderholder;
- privatePaintpaint;
- publicTestView(Contextcontext){
- super(context);
- //TODOAuto-generatedconstructorstub
- holder=getHolder();
- holder.addCallback(this);
- paint=newPaint(Paint.ANTI_ALIAS_FLAG);//无锯齿
- paint.setStyle(Style.FILL);//填充样式
- paint.setTextSize(16);//字体大小
- }
- /**
- *执行游戏逻辑方法
- */
- privatevoidupdate(){
- }
- /**
- *执行游戏绘制
- */
- privateRectrect=newRect();
- privatevoiddraw(){
- Canvascanvas=holder.lockCanvas();
- Stringtext="天使之翼的示例Demo";
- //获取文本宽高
- paint.getTextBounds(text,0,text.length(),rect);
- //在屏幕中央位置显示文本
- paint.setColor(0xfff000f0);//注意最高两位ff代表画笔透明度,不设置的画就是完全透明了,看不到任何效果
- canvas.drawText(text,
- (screenW-rect.width())/2,
- screenH/2+rect.height()/2,
- paint);
- holder.unlockCanvasAndPost(canvas);
- }
- @Override
- publicvoidsurfaceCreated(SurfaceHolderholder){
- //TODOAuto-generatedmethodstub
- screenW=getWidth();
- screenH=getHeight();
- thread=newThread(this);
- isRun=true;
- thread.start();
- }
- @Override
- publicvoidsurfaceChanged(SurfaceHolderholder,intformat,intwidth,intheight){
- //TODOAuto-generatedmethodstub
- //当屏幕旋转的时候重新获取屏幕宽高
- screenW=getWidth();
- screenH=getHeight();
- }
- @Override
- publicvoidsurfaceDestroyed(SurfaceHolderholder){
- //TODOAuto-generatedmethodstub
- isRun=false;
- thread=null;
- }
- privatebooleanisRun;//线程运行标志
- privateintuseTime;//记录每次刷屏使用的时间
- @Override
- publicvoidrun(){
- //TODOAuto-generatedmethodstub
- longstart,end;
- while(isRun){
- start=System.currentTimeMillis();
- update();//刷新界面上所有元素
- draw();//绘制界面元素
- end=System.currentTimeMillis();
- useTime=(int)(end-start);
- if(useTime<GAME_HEART){//保证每次刷屏时间间隔相同
- try{
- Thread.sleep(GAME_HEART-useTime);
- }catch(InterruptedExceptione){
- //TODOAuto-generatedcatchblock
- e.printStackTrace();
- }
- }
- }
- }
- }
更多相关文章
- SpringBoot 2.0 中 HikariCP 数据库连接池原理解析
- Android(安卓)JNI 之 JNIEnv 解析
- android_UIThread 主线程 AsynTask Handler View.post
- android service 广播 更新 activity
- Android(安卓)- 第二章 Activity 探究
- Android开发经验之获取画在画布上的字符串长度、宽度(所占像素宽
- 【读书笔记-《Android游戏编程之从零开始》】5.Android(安卓)游
- android 屏幕触摸事件的分发与处理
- Android的handler和callback机制