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等接口。
原创不易,如果您觉得好,可以分享此公众号给你更多的人。
相关文章推荐
- Android SurfaceTexture和GLSurfaceView做Camera预览
- Camera 预览之SurfaceView、TextureView、GLSurfaceView(三)
- Anroid TextureView、SurfaceView的Camera预览实现
- 基于Android TextureView与SurfaceTexture实现相机Camera拍照预览与保存照片
- 基于Android TextureView与SurfaceTexture实现相机Camera拍照预览与保存照片
- 玩转Android Camera开发(一):Surfaceview预览Camera,基础拍照功能完整demo
- 玩转Android Camera开发(一):Surfaceview预览Camera,基础拍照功能完整demo
- 玩转Android Camera开发(一):Surfaceview预览Camera,基础拍照功能完整demo
- Android 5.0(Lollipop)中的SurfaceTexture,TextureView, SurfaceView和GLSurfaceView
- 玩转Android Camera开发(一):Surfaceview预览Camera,基础拍照功能完整demo
- 解决SurfaceView预览Camera拉伸问题
- android--Camera完整版--Surfaceview预览Camera,基础拍照功能完整demo
- SurfaceView,GLSurfaceView,SurfaceTexture,VideoView及TextureView
- android 通过Camera和Surfaceview实现照相 图片预览 保存图片到本地 手动聚焦 FaceDetectionListener实现人脸识别
- Android Camera开发:使用GLSurfaceView预览Camera 基础拍照
- 玩转Android Camera开发(三):国内首发---使用GLSurfaceView预览Camera 基础拍照demo
- Android自定义Camera,用SurfaceView预览。
- SurfaceView获取Camera预览界面
- Android Dev Intro - SurfaceTexture,TextureView, SurfaceView and GLSurfaceView
- 通过Camera、SurfaceView、自己实现拍照及预览效果