1.TextureView和SurfaceTexture
(1)定义以及使用
public class TextureView extends View.
public class SurfaceTexture.
从android源码类的定义可以看出TextureView是一个view.当TextureView执行完onAttachedToWindow时,它的SurfaceTexture才是有效可用的.
所以SurfaceTextureListener接口用于让TextureView的使用着知道SurfaceTexture已经ready,这样可以把SurfaceTexture交给对应的内容源.
(2)形象功能
曾经在网上看到这样说:如果说TextureView是一幅画的话,那SurfaceTexture就是画布,真正渲染的载体是SurfaceTexture。
那么我的理解是view是一个显示,是否可以说成,TextureView是一个呈现,可比作为黑板,SurfaceTexture就是黑板的表层用来承载流显示的一个载体.
2.代码演示
package com.example.textureviewactivity; import java.io.IOException; import android.graphics.SurfaceTexture; import android.hardware.Camera; import android.os.Bundle; import android.app.Activity; import android.util.Log; import android.view.Menu; import android.view.TextureView; public class TextureViewActivity extends Activity implements TextureView.SurfaceTextureListener{ private TextureView mTextureView; private Camera mCamara; private String tag = "TextureViewActivity"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mTextureView = new TextureView(this); Log.d(tag,"after new TextureView,before set listener"); mTextureView.setSurfaceTextureListener(this);//设置监听 Log.d(tag,"after set listener"); setContentView(mTextureView); } public void onSurfaceTextureAvailable(SurfaceTexture surface, int width, int height){ Log.d(tag,"onSurfaceTextureAvailable surface: "+surface); mCamara = Camera.open(); try{ mCamara.setPreviewTexture(surface); mCamara.startPreview(); }catch(IOException ioe){ } } public void onSurfaceTextureSizeChanged(SurfaceTexture surface, int width, int height){ } public boolean onSurfaceTextureDestroyed(SurfaceTexture surface){ Log.d(tag,"onSurfaceTextureDestroyed"); mCamara.stopPreview(); mCamara.release(); returntrue; } public void onSurfaceTextureUpdated(SurfaceTexture surface){ } @Override public void onPause(){ super.onPause(); Log.d(tag,"onPause"); } @Override public void onDestroy(){ super.onDestroy(); Log.d(tag,"onDestroy"); } @Override publicboolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.activity_main, menu); returntrue; }
测试结果:
07-16 10:07:30.145 4672 4672 D TextureViewActivity: after new TextureView,before set listener
07-16 10:07:30.145 4672 4672 D TextureViewActivity: after set listener
//此处可以得出设置完监听后,且onAttachedToWindow后此处将会回调表明SurfaceTexture ready 有效.
07-16 10:07:30.250 4672 4672 D TextureViewActivity: onSurfaceTextureAvailable surface:android.graphics.SurfaceTexture@9f2b3ff
07-16 10:07:36.415 4672 4672 D TextureViewActivity: onPause
07-16 10:07:36.545 4672 4672 D TextureViewActivity: onSurfaceTextureDestroyed
07-16 10:07:36.897 4672 4672 D TextureViewActivity: onDestroy
对应camera的使用权限可以在配置文件添加进去,此处不做过多说明.