您的位置:首页 > 其它

Camera 预览之SurfaceView、TextureView、GLSurfaceView(二)

2016-07-30 13:44 405 查看


随着项目一步步往前推进SurfaceView无法满足要求了,因为需要对预览视图进行变换处理,TextureView就被呼唤出来了,看下官网对TextureView的解释:

A TextureView can be used to display a content stream. Such a content stream can for instance be a video or an OpenGL scene. The content stream can come from the application's process as well as a remote process.

TextureView can only be used in a hardware accelerated window.

简单理解:

TextureView可以用来显示内容流。这样一个内容流可以视频或者OpenGL的场景。内容流可以来自本应用程序以及远程进程。

Textureview必须在硬件加速开启的窗口中。

与SurfaceView相比,TextureView不会创建一个单独的窗口,这使得它像普通的View可以执行一些变换操作,比如移动、动画等。

使用TextureView很简单,你需要使用的一个SurfaceTexture,SurfaceTexture可以用于呈现内容。SurfaceTexture可以理解为一个画布,Textureview是画布里真正渲染的内容。我将之前的SurfaceView代码改造了一下。

public class CameraTexturePreview extends TextureView implements TextureView.SurfaceTextureListener {

    private final String TAG = "CameraTexturePreview";

    Context mContext;  

    SurfaceTexture mSurface;

    public CameraTexturePreview(Context context, AttributeSet attrs) {

        super(context, attrs);

        this.mContext = context;  

        this.setSurfaceTextureListener(this);  

    }

    @Override

    public void onSurfaceTextureAvailable(SurfaceTexture surface, int width,

            int height) {

        Log.i(TAG, "onSurfaceTextureAvailable()");

        this.mSurface = surface;  

    }

    @Override

    public void onSurfaceTextureSizeChanged(SurfaceTexture surface, int width,

            int height) {

        Log.i(TAG, "onSurfaceTextureSizeChanged()");  

    }

    @Override

    public boolean onSurfaceTextureDestroyed(SurfaceTexture surface) {

        Log.i(TAG, "onSurfaceTextureDestroyed()");  

        CameraWrapper.getInstance().doStopCamera();

        retu
4000
rn false;

    }

    @Override

    public void onSurfaceTextureUpdated(SurfaceTexture surface) {

 

    }

    public SurfaceTexture getSurfaceTexture() {

        return this.mSurface;

    }

}

CameraTexturePreview继承制TextureView,TextureView实现TextureView.SurfaceTextureListener接口,获取用于渲染内容的SurfaceTexture。当SurfaceTexture准备好了的时候会调用onSurfaceTextureAvailable。

接下来看下如何渲染,和上一篇代码差不多,就不全贴了,贴出差异部分。

设置一些参数信息

private void initViewParams() {

        LayoutParams params = mCameraTexturePreview.getLayoutParams();

        DisplayMetrics displayMetrics = this.getResources().getDisplayMetrics();  

        int screenWidth = displayMetrics.widthPixels;  

        int screenHeight = displayMetrics.heightPixels;

        params.width = screenWidth;  

        params.height = screenHeight;  

        Log.i(TAG, "screenWidth: " + screenWidth);

        Log.i(TAG, "screenHeight: " + screenHeight);

        this.mPreviewRate = (float)screenHeight / (float)screenWidth;

        mCameraTexturePreview.setLayoutParams(params);

    }

    @Override

    public void cameraHasOpened() {

        SurfaceTexture surface = this.mCameraTexturePreview.getSurfaceTexture();

        CameraWrapper.getInstance().doStartPreview(surface, mPreviewRate);

        

    }

重点看下doStartPreview函数:

    public void doStartPreview(SurfaceTexture surface, float previewRate) {

        Log.i(TAG, "doStartPreview()");

        if (mIsPreviewing) {

            this.mCamera.stopPreview();

            return;

        }

        try {

            this.mCamera.setPreviewTexture(surface);

        } catch (IOException e) {

            e.printStackTrace();

        }

        ........省略部分代码

         this.mCamera.startPreview();

    }

将准备好的SurfaceTexture设置给setPreviewTexture,进行数据预览。你可以在预览的时候对CameraTexturePreview进行一些变换处理,可以调用setAlpha,setRotation等接口。

原创不易,如果您觉得好,可以分享此公众号给你更多的人。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐