最近,在修改Android4.4的原生相机Camera2,很习惯的去寻找SurfaceView,结果任凭我使用grep还是ack,都无法搜索到SurfaceView,最后还是通过代码CameraActivity-->CameraModule-->PhotoUI-->R.layout.photo_module找到,原来是使用了TextureView。不是很了解此控件,百度之,在官方API文档中找到此控件:
官方文档大概的意思是:
TextureView可以用来显示内容流。这样一个内容流例如可以视频或者OpenGL的场景。内容流可以来自本应用程序以及其他进程。
Textureview必须在硬件加速开启的窗口中。
与SurfaceView相比,TextureView不会创建一个单独的窗口,这使得它可以像一般的View一样执行一些变换操作,比如移动、动画等等,例如,你可以通过调用myView.setAlpha(0.5f)将TextureView设置成半透明。
使用TextureView很简单:你需要使用的就是SurfaceTexture,SurfaceTexture可以用于呈现内容。
下面是我写一个小例子来演示如何渲染相机预览到TextureView,在官方文档例子的基础上稍微改动了一下:
main.xml:
1
2
3
4
|
<!--?xml version=
1.0
encoding=utf-
8
?-->
<linearlayout android:layout_height=
"fill_parent"
android:layout_width=
"fill_parent"
android:orientation=
"horizontal"
xmlns:android=
"http://schemas.android.com/apk/res/android"
>
<framelayout android:id=
"@+id/camera_preview"
android:layout_height=
"fill_parent"
android:layout_weight=
"1"
android:layout_width=
"fill_parent"
><button android:id=
"@+id/button_capture"
android:layout_gravity=
"center"
android:layout_height=
"wrap_content"
android:layout_width=
"wrap_content"
android:text=
"Capture"
></button></framelayout></linearlayout>
|
CameraPreview.java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
|
import
java.io.IOException;
import
android.annotation.SuppressLint;
import
android.content.Context;
import
android.graphics.SurfaceTexture;
import
android.hardware.Camera;
import
android.view.TextureView;
@SuppressLint
(NewApi)
public
class
CameraPreview
extends
TextureView
implements
TextureView.SurfaceTextureListener {
private
Camera mCamera;
private
TextureView mTextureView;
public
CameraPreview(Context context , Camera camera) {
super
(context);
mCamera = camera;
// TODO Auto-generated constructor stub
}
public
void
onSurfaceTextureAvailable(SurfaceTexture surface,
int
width,
int
height) {
// mCamera = Camera.open();
try
{
mCamera.setPreviewTexture(surface);
mCamera.startPreview();
}
catch
(IOException ioe) {
// Something bad happened
}
}
|