android中surfaceview的引入原因及使用步骤_第1页
android中surfaceview的引入原因及使用步骤_第2页
android中surfaceview的引入原因及使用步骤_第3页
android中surfaceview的引入原因及使用步骤_第4页
android中surfaceview的引入原因及使用步骤_第5页
已阅读5页,还剩8页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、北京信息职业技术学院 | 范美英Android中SurfaceView的引入原因及使用步骤2实例代码SurfaceView的引入原因及使用步骤|举例public class AnimateViewActivity extends Activity Override protected void onCreate(Bundle savedInstanceState) super.onCreate(savedInstanceState); setContentView(new AnimateView(this); class AnimateView extends View float radiu

2、s = 10; Paint paint; public AnimateView(Context context) super(context); paint = new Paint(); paint.setColor(Color.YELLOW); paint.setStyle(Paint.Style.STROKE); Override protected void onDraw(Canvas canvas) canvas.translate(200, 200); canvas.drawCircle(0, 0, radius+, paint); if(radius 100) radius = 1

3、0; invalidate(); 3实例分析SurfaceView的引入原因及使用步骤| 举例运行上面的Activity,可以看到一个圆圈,它原始半径是10,然后不断的变大,直到达到100后又恢复到10,循环显示这样的方法只能实现简单的动画效果,具有一些局限性局限性。例如:无法控制动画的显示速度,View可以理解为一个经过系统优化的,用来高效的执行一些帧数比较低动画的对象,它具有特定的使用场景,比如有一些帧数较低的游戏就可以使用它来完成:贪吃蛇、俄罗斯方块、棋牌类等游戏,因为这些游戏执行的帧数都很低。如果是一些实时类的游戏,如射击游戏、塔防游戏、RPG游戏等就没办法使用View来做,因为它的帧

4、数太低了,会导致动画执行不顺畅。所以我们需要一个能自己控制执行帧数的对象,SurfaceView因此诞生了。4什么是SurfaceViewSurfaceView的引入原因及使用步骤|什么是SurfaceViewSurface的意思是表层,表面的意思SurfaceView就是指一个在表层的View对象。为什么是在表层呢?其他View是绘制在表层外,而它就是充当表层对象。假设你要在一个球上画画,那么球的表层就当做你的画布对象,你画的东西会挡住它的表层,我们默认没使用SurfaceView,那么球的表层就是空白的,如果我们使用了SurfaceView,就可以理解为我们拿来的球本身表面就具有纹路,你是

5、画在纹路之上的如果画的是半透明的,那么就可以透过你画的东西看到球面本身的纹路。SDK的文档中提到“SurfaceView就是在Window上挖一个洞,它就是显示在这个洞里,其他的View是显示在Window上”,所以View可以显式在 SurfaceView之上,你也可以添加一些层在SurfaceView之上。5什么是SurfaceViewSurfaceView的引入原因及使用步骤|什么是SurfaceViewSurfaceView的重要特性:可以控制帧控制帧数数。一般在很多游戏设计中,都要开辟一个后台线程计算游戏相关的数据,然后根据这些计算完的新数据再刷新视图对象由于对View执行绘制操作只

6、能在UI线程上, 所以在另外一个线程计算完数据后,需要调用View.invalidate方法通知系统刷新View对象,所以游戏相关的数据也需要让UI线程能访 问到,这样的设计架构比较复杂SurfaceView可以让后台计算的线程能直接访问数据,允许其他线程(不是UI线程)绘制图形(使用Canvas),根据它这个特性,就可以控制它的帧数如果让这个线程1秒执行50次绘制,那么最后显示的就是50帧。6如何使用SurfaceViewSurfaceView的引入原因及使用步骤|如何使用SurfaceView首先SurfaceView也是一个View,它也有自己的生命周期。因为它需要另外一个线程来执行绘制

7、操作,所以我们可以在它生命周期的初始化阶段开辟一个新线程,然后开始执行绘制当生命周期的结束阶段我们插入结束绘制线程的操作。这些是由其内部一个SurfaceHolder对象完成的。SurfaceHolder,顾名思义,它里面保存了一个队Surface对象的引用,而执行绘制方法就是操作这个 Surface,SurfaceHolder因为保存了对Surface的引用,所以使用它来处理Surface的生命周期SurfaceView的生命周期其实就是Surface的生命周期,因为SurfaceHolder保存对Surface的引用,所以使用 SurfaceHolder来处理生命周期的初始化。7如何使用S

8、urfaceViewSurfaceView的引入原因及使用步骤|如何使用SurfaceView右面代码的SurfaceView构造方法中执行了init初始化方法,先先获取SurfaceView里的 SurfaceHolder对象,然后然后通过它设置Surface的生命周期回调方法,使用DemoSurfaceView类本身作为回调方法代理类。 surfaceCreated方法,是当SurfaceView被显示时会调用的方法,所以需要在这里开启绘制的线程,surfaceDestroyed方法是当SurfaceView被隐藏或销毁时调用的方法,在这里可以关闭绘制的线程。8如何使用SurfaceVie

9、wSurfaceView的引入原因及使用步骤|如何使用SurfaceView9SurfaceView的引入原因及使用步骤|如何使用SurfaceViewclassLoopThreadextendsThreadSurfaceHoldersurfaceHolder;Contextcontext;booleanisRunning;floatradius=10f;Paintpaint;publicLoopThread(SurfaceHoldersurfaceHolder,Contextcontext)this.surfaceHolder=surfaceHolder;this.context=conte

10、xt;isRunning=false;paint=newPaint();paint.setColor(Color.YELLOW);paint.setStyle(Paint.Style.STROKE);Overridepublicvoidrun()Canvasc=null;while(isRunning)trysynchronized(surfaceHolder)c=surfaceHolder.lockCanvas(null);doDraw(c);Thread.sleep(50);catch(InterruptedExceptione)e.printStackTrace();finallysur

11、faceHolder.unlockCanvasAndPost(c);publicvoiddoDraw(Canvasc) c.drawColor(Color.BLACK);c.translate(200,200);c.drawCircle(0,0,radius+,paint);if(radius100)radius=10f;10实例分析SurfaceView的引入原因及使用步骤| 举例以上三页代码编写了一个使用SurfaceView制作的动画效果,它的效果跟上面自定义View的一样,但是SurfaceView可以控制动画的帧数。在SurfaceView中内置一个LoopThread线程,这个线程

12、的作用就是用来绘制图形在SurfaceView中实例化一个 LoopThread实例,一般这个操作会放在SurfaceView的构造方法中。在SurfaceView中的SurfaceHolder的生命周期回调方法中插入一些操作当Surface被创建时(即SurfaceView显示在屏幕中时),开启LoopThread执行绘制LoopThread会一直刷新SurfaceView对象当SurfaceView被隐藏时就停止改线程释放资源。11注意SurfaceView的引入原因及使用步骤| 注意事项因为SurfaceView允许自定义的线程操作Surface对象执行绘制方法,实际开发中就有可能同时定

13、义多个线程执行绘制,所以当获取 SurfaceHolder中的Canvas对象时要记得加同步操作,避免两个不同的线程同时操作同一个Canvas对象,当操作完成后记得调用 SurfaceHolder.unlockCanvasAndPost方法释放掉Canvas锁。在调用doDraw执行绘制时,因为SurfaceView的特点,它会保留之前绘制的图形,所以需要先清空掉上一次绘制时留下的图形。记得在回调方法onSurfaceDestroyed里将后台执行绘制的LoopThread关闭这里是使用join方法。也可以通过一个标志位isRunning来判断线程是否该停止运行,如果想关闭线程只需要将isRunning改成false即可,线程会自动执行完run方法后退出。12SurfaceView与View的区别SurfaceView的引入原因及使用步骤| 小结SurfaceView允许其他线程更新视图对象(执行绘制方法)而View不允许这么做,它只允

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论