canvas教程

SurfaceView 典型用法

字号+ 作者:H5之家 来源:H5之家 2017-08-30 10:03 我要评论( )

要创建一个新的SurfaceView,需要创建一个新的扩展了SurfaceView的类,并实现SurfaceHolder.Callback。 SurfaceHolder回调可以在底层的Surface被创建和销毁的时

要创建一个新的SurfaceView,需要创建一个新的扩展了SurfaceView的类,并实现SurfaceHolder.Callback。

SurfaceHolder回调可以在底层的Surface被创建和销毁的时候通知View,并传递给它对SurfaceHolder对象的引用,其中包含了当前有效的Surface。

一个典型的Surface View设计模型包括一个由Thread所派生的类,它可以接收对当前的SurfaceHolder的引用,并独立地更新它。

下面的框架代码展示了使用Canvas所绘制的Surface View的实现。在Surface View控件中创建了一个新的由Thread派生的类,并且所有的UI更新都是在这个新类中处理的。

import android.content.Context; import android.graphics.Canvas; import android.view.SurfaceHolder; import android.view.SurfaceView; public class MySurfaceView extends SurfaceView implements SurfaceHolder. Callback { private SurfaceHolder holder; private MySurfaceViewThread mySurfaceViewThread; private boolean hasSurface; MySurfaceView(Context context) { super(context); init(); } private void init() { //创建一个新的SurfaceHolder, 并分配这个类作为它的回调(callback) holder = getHolder (); holder.addCallback(this); hasSurface = false ; } public void resume() { ( mySurfaceViewThread == null) { mySurfaceViewThread = new MySurfaceViewThread(); if ( hasSurface == true) mySurfaceViewThread.start(); } } public void pause() { (mySurfaceViewThread != null) { mySurfaceViewThread.requestExitAndWait(); mySurfaceViewThread = null ; } } public void surfaceCreated(SurfaceHolder holder) { hasSurface = true ; if (mySurfaceViewThread != null) mySurfaceViewThread.start(); } public void surfaceDestroyed(SurfaceHolder holder) { hasSurface = false ; pause(); } public void surfaceChanged(SurfaceHolder holder,int format,int w,int h) { if (mySurfaceViewThread != null) mySurfaceViewThread.onWindowResize(w, h); } class MySurfaceViewThread extends Thread { private boolean done; MySurfaceViewThread() { super(); done = false ; } @Override public void run() { SurfaceHolder surfaceHolder = holder ; (!done) { // 锁定surface,并返回到要绘图的Canvas Canvas canvas = surfaceHolder .lockCanvas(); // 待实现:在Canvas上绘图 // 解锁Canvas,并渲染当前图像 surfaceHolder.unlockCanvasAndPost(canvas); } } public void requestExitAndWait() { // 把这个线程标记为完成,并合并到主程序线程 done = true ; try { join(); } catch (InterruptedException ex) { } } public void onWindowResize(int w, int h) { // 处理可用的屏幕尺寸的改变 } } }

 

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

相关文章
  • Canvas的常见用法

    Canvas的常见用法

    2017-08-28 15:00

  • HTML5 Canvas八大核心技术及其API用法

    HTML5 Canvas八大核心技术及其API用法

    2017-07-18 12:00

  • SurfaceView源码以及崩溃剖析

    SurfaceView源码以及崩溃剖析

    2017-07-14 16:01

  • HTML5--canvas之drawImage用法

    HTML5--canvas之drawImage用法

    2017-06-08 09:12

网友点评
-