part_b_深入android架构从线程到aidlb04_b_surfaceview的ui多线程_ok_W_第1页
part_b_深入android架构从线程到aidlb04_b_surfaceview的ui多线程_ok_W_第2页
part_b_深入android架构从线程到aidlb04_b_surfaceview的ui多线程_ok_W_第3页
part_b_深入android架构从线程到aidlb04_b_surfaceview的ui多线程_ok_W_第4页
part_b_深入android架构从线程到aidlb04_b_surfaceview的ui多线程_ok_W_第5页
已阅读5页,还剩25页未读 继续免费阅读

下载本文档

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

文档简介

1、B04_b基於軟硬整合觀點SurfaceView的UI多线程( b)By 高煥堂基於軟硬整合觀點2、使用SurfaceView画2D图 范例一 以SurfaceView绘出Bitmap图像 设计SpriteView类别来实作SurfaceHolder.Callback接口 首先来看个简单的程序,显示出一个Bitmap图像。这个图像就构成Sprite动画的基本图形。这个图像如下:此图像是取自网页的范例: /index.php/sprite-animation-with-android/此范例执行时呈现的画面:ActivityViewSurfaceView+ get

2、HolderQ . , SurfaceHolder+ addCallbackQ-一一一一一一 天)1千 il,嘈匾myActivitySpriteViewCallback 二 + sutfaceCreatedQ+ sutfaceDestroyedQ+ sutfaceChangedQ+ onDrawQActivityViewt ge r myActivity- - - - - - - - - - - - - - - - -.,;:i +SpriteView+ getHolderQ , .+ addCallbackQ? 气丞I 千 .il,倡sutface Created O 生 new今1 +

3、sutfaceDestroyed0+ sutfaceChangedQ+ onDrawQ/ SpriteView.java/ public class SpriteView implements SurfaceHolder.Callbackprivate SpriteThread sThread;private Paint paint;private Bitmap bm;public SpriteView(Bitmap bmp) bm = bmp;Override public void surfaceCreated(SurfaceHolder holder) sThread = new Spr

4、iteThread(holder, this); sThread.start();Override public void surfaceDestroyed(SurfaceHolder holder) Overridepublic void surfaceChanged(SurfaceHolder holder, int format,int width, int height) protected void onDraw(Canvas canvas) paint= new Paint(); canvas.drawColor(Color.WHITE); canvas.drawBitmap(bm

5、, 10, 10, paint);public class SpriteThread extends Threadprivate SpriteView mView; private SurfaceHolder mHolder; private Canvas c;SpriteThread(SurfaceHolder h, SpriteView v) mHolder = h mView = v;public void run()tryc = mHolder.lockCanvas(null);synchronized(mHolder) mView.o nDraw(c);finallyif(c!=nu

6、ll)mHolder.unlockCanvasAndPost(c);吁设计GameLoop大惘 l线程乔多如来)ActMty+ getHolderQ芒iViewiSurfaceHolder+ addCallbackQsu tfacj 忒Created QCallbackmyActMtySpriteView.,. 占 、 J片,-=: -:new:=-:=-+ sutfaceCreatedQ+ sutfaceDestroyedQ+ sutfaceChangedQ+ onDrawQ SpriteThread ,Ga me掠程 / SpriteView.java/ .public class Spr

7、iteView implements SurfaceHolder.Callbackprivate SpriteThread sThread;private Paint paint;private Bitmap bm;public SpriteView(Bitmap bmp) bm = bmp; Overridepublic void surfaceCreated(SurfaceHolder holder) sThread = new SpriteThread(holder, this); sThread.start();Overridepublic void surfaceDestroyed(

8、SurfaceHolder holder) Overridepublic void surfaceChanged(SurfaceHolder holder, int format, int width,int height) protected void onDraw(Canvas canvas) paint= new Paint(); canvas.drawColor(Color.WHITE); canvas.drawBitmap(bm, 10, 10, paint);/ SpriteThread.java/.public class SpriteThread extends Thread

9、private SpriteView mView; private SurfaceHolder mHolder; private Canvas c;SpriteThread(SurfaceHolder h, SpriteView v) mHolder = h;mView = v;public void run()tryc = mHolder.lockCanvas(null);synchronized (mHolder)mView.onDraw(c);finallyif(c!=null) mHolder.unlockCanvasAndPost(c); eit/ myActivity.java/

10、.public class myActivity extends Activityimplements OnClickListener private SurfaceView sv = null; private Button ibtn;private Bitmap bm;private SpriteView spView;Override protected void onCreate(Bundle icicle) super.onCreate(icicle);LinearLayout layout = new LinearLayout(this); layout.setOrientatio

11、n(LinearLayout.VERTICAL); sv = new SurfaceView(this);bm =BitmapFactory.decodeResource( getResour ces(), R.drawable.walk_elaine);spView = new SpriteView(bm); sv.getHolder().addCallback(spView);LinearLayout.LayoutParams param =new LinearLayout.LayoutParams(200, 200);param.topMargin = 10;param.leftMarg

12、in = 10; layout.addView(sv, param);/ ibtn = new Button(this); ibtn.setOnClickListener(this); ibtn.setText(Exit); ibtn.setBackgroundResource(R.drawable.gray); LinearLayout.LayoutParams param1 =new LinearLayout.LayoutParams(200, 65);param1.topMargin = 10;param1.leftMargin = 10; layout.addView(ibtn, pa

13、ram1); setContentView(layout);public void onClick(View v) finish();講罔:那一倏综程埶行Sp li t eView捚的onDraw ()函数呢? 范例二 让图像在SurfaceView里旋转复习:SurfaceViewSurfaceHolderThread+ runo-older.CallbackM沁urfaceViewstartODrawThread+ runo- I绘圉勹 在MySurfaceView里定义一个DrawThread类,它诞生一个单独的线程来执行画图的任务。 当主线程侦测到绘图画面(Surface)被开启时,就

14、会诞生DrawThread对象,启动新线程去画图。 一直到主要线程侦测到绘图画面被关闭时, 就停此正在绘图的线程。class MySurfaceView extends SurfaceViewimplements SurfaceHolder.Callback private SurfaceHolder mHolder;private DrawThread mThread;MySurfaceView(Context context) super(context); getHolder().addCallback(this);public void surfaceCreated(SurfaceHo

15、lder holder) mHolder = holder;mThread = new DrawThread(); mThread.start();public void surfaceDestroyed(SurfaceHolder holder) mThread.finish();mThread = null;public void surfaceChanged(SurfaceHolder holder, int format,int w, int h) class DrawThread extends Thread int degree = 36;boolean mFinished = f

16、alse;DrawThread() super(); Override public void run() Bitmap bmp= BitmapFactory.decodeResource(getResources(), R.drawable.x_xxx);Matrix matrix; degree = 0;while(!mFinished)Paint paint = new Paint();paint.setColor(Color.CYAN); Canvas cavans = mHolder.lockCanvas(); cavans.drawCircle(80, 80, 45, paint)

17、;/ rotate matrix = new Matrix();matrix.postScale(1.5f, 1.5f); matrix.postRotate(degree);Bitmap newBmp= Bitmap.createBitmap(bmp, 0, 0, bmp.getWidth(), bmp.getHeight(), matrix, true);cavans.drawBitmap(newBmp, 50, 50, paint); mHolder.unlockCanvasAndPost(cavans); degree += 15;try Thread.sleep(100); catch (Exception e) void finish() mFinished = true; SurfaceViewThread+ runo-一一一一一一一一天 Surf ac 叫 Ider.CallbackM 贷 urfaceViewstarto,I鳍 DrawThread+ runop 勹一/ ac01.java-/.public class ac01 extends Activity Override protected void onCreate(Bundle icicle) super.onCreate(icicle);MySurf

温馨提示

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

评论

0/150

提交评论