part_b_深入android架构从线程到aidlb03_b_应用android的ui框架_ok_W_第1页
part_b_深入android架构从线程到aidlb03_b_应用android的ui框架_ok_W_第2页
part_b_深入android架构从线程到aidlb03_b_应用android的ui框架_ok_W_第3页
part_b_深入android架构从线程到aidlb03_b_应用android的ui框架_ok_W_第4页
part_b_深入android架构从线程到aidlb03_b_应用android的ui框架_ok_W_第5页
已阅读5页,还剩17页未读 继续免费阅读

下载本文档

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

文档简介

1、B03_b基於軟硬整合觀點应用Android的UI框架(b)- 以设计游戏循环(GameLoop)为例By 高煥堂基於軟硬整合觀點3、使用UI线程的MQ(Message Queue)/ myView.java/ public class myView extends View / Override protected void onDraw(Canvas canvas) super.onDraw(canvas);/ / canvas.drawRect(.);invalidate(); 我们可以透过Message方式来触发UI线程去調用invalidate()函数,而达到重新执行onDraw()

2、来进行重复绘图和刷新画面的动作。/ myView.java/.public class myView extends View private Paint paint= new Paint();private int line_x = 100, int line_y = 100; private float count = 0;private myHandler h;myView(Context ctx)super(ctx);h = new myHandler();Override protected void onDraw(Canvas canvas) super.onDraw(canvas

3、);if( count 12) count = 0;int x = (int) (75.0 * Math.cos(2*Math.PI * count/12.0); int y = (int) (75.0 * Math.sin(2*Math.PI * count/12.0); count+;canvas.drawColor(Color.WHITE); paint.setColor(Color.RED); paint.setStrokeWidth(3);canvas.drawLine(line_x, line_y, line_x+x, line_y+y, paint);paint.setStrok

4、eWidth(2); paint.setColor(Color.BLUE);canvas.drawRect(line_x-5, line_y - 5, line_x+5, line_y + 5, paint); paint.setColor(Color.YELLOW);canvas.drawRect(line_x-3, line_y - 3, line_x+3, line_y + 3, paint);h.removeMessages(0);Message msg = h.obtainMessage(0); h.sendMessageDelayed(msg, 1000);class myHand

5、ler extends Handler Overridepublic void handleMessage(Message msg) invalidate(); 使用sendMessageDelayed()函数来暂停一下,延迟数秒钟才传递 Message给UI线程。基於軟硬整合觀點4、诞生一个小线程, 担任游戏线程 刚才是由UI线程来丢Message到自己的 MQ里;也就是UI线程丢Message给自己。同 一 样 地 , 也 可 以 由 其 它 线 程 来 丢 Message到UI线程的MQ里,来触发UI线程去調用invalidate()函数。/ myView.java/ .public c

6、lass myView extends View private Paint paint= new Paint(); private int line_x = 100, line_y = 100; private float count = 0;private myHandler h;myView(Context ctx) super(ctx); h = new myHandler(); Override protected void onDraw(Canvas canvas) super.onDraw(canvas); if( count 12) count = 0;int x = (int

7、) (75.0 * Math.cos(2*Math.PI * count/12.0); int y = (int) (75.0 * Math.sin(2*Math.PI * count/12.0); count+;canvas.drawColor(Color.WHITE); paint.setColor(Color.RED); paint.setStrokeWidth(3);canvas.drawLine(line_x, line_y, line_x+x, line_y+y, paint); paint.setStrokeWidth(2);paint.setColor(Color.BLUE);

8、canvas.drawRect(line_x-5, line_y - 5, line_x+5, line_y + 5, paint); paint.setColor(Color.MAGENTA);canvas.drawRect(line_x-3, line_y - 3, line_x+3, line_y + 3, paint);/ myThread t = new myThread(); t.start();/ 诞生一个小线程,担任游戏线程,负责回圈控制class myThread extends Threadpublic void run() h.removeMessages(0);Mess

9、age msg = h.obtainMessage(0); h.sendMessageDelayed(msg, 1000);class myHandler extends Handler Override public void handleMessage(Message msg) invalidate(); / call onDraw(); UI线程诞生一个小线程,并且由该小线程去执行myThread类别里的run()函数。接着,这新线程执行到指令:h.r emoveMessages(0);Message msg = h.obtainMessage(0);h.s endMessageDela

10、yed(msg, 1000); 延迟数秒钟才传递 Message给UI线程(丢入UI线程的MQ里)。 当UI线程发现MQ有个Message,就去执行myHandler类别里的handleMessage()函数。就触发UI线程去調用invalidate()函数了。基於軟硬整合觀點5、小线程(非UI线程)調用postInvalidate() 刚才的小线程传递Message给UI线程(丢入UI线程的MQ里),触发UI线程去調用invalidate()函数。Android提供一个postInvalidate()函数来替代上述的动作。 由小线程直接去調用postInvalidate()函数, 就能间接触发UI线程去調用invalidate()函 数了。/ myView.java/public class myView extends View /.Override protected void onDraw(Canvas canvas) /.myThread t = new myThread(); t.start();

温馨提示

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

评论

0/150

提交评论