TextureView和SurfaceTexture之间的关系

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的使用权限可以在配置文件添加进去,此处不做过多说明.

原文地址:https://www.cnblogs.com/syyh2006/p/9318224.html