- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
主 Activity
public class MainActivity extends Activity implements TextureView.SurfaceTextureListener{
private Camera mCamera;
private TextureView mTextureView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mTextureView = new TextureView(this);
mTextureView.setSurfaceTextureListener(this);
setContentView(mTextureView);
}
@Override
public void onSurfaceTextureAvailable(SurfaceTexture surface, int width, int height)
{
mCamera = Camera.open(0);
try {
mCamera.setPreviewTexture(surface);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
mCamera.startPreview();
}
@Override
public boolean onSurfaceTextureDestroyed(SurfaceTexture arg0) {
mCamera.stopPreview();
mCamera.release();
return true;
}
@Override
public void onSurfaceTextureSizeChanged(SurfaceTexture arg0, int arg1,
int arg2) {
// TODO Auto-generated method stub
}
@Override
public void onSurfaceTextureUpdated(SurfaceTexture arg0) {
// TODO Auto-generated method stub
}
}
实时预览翻转到左侧。在搜索时我发现 setTransform
是一个解决方案,但我不确定如何使用它。谁能给我一个代码示例?
注意:是翻转实时预览,不是图片。
最佳答案
下面是一个使用 SurfaceTexture 显示前置摄像头而不进行镜像的最小示例。请注意,为简洁起见,错误检查大部分都被删除了。此外,在此示例中,我没有遵循在后台线程中打开相机的建议(在某些设备上,这可能会卡住 UI 的时间过长)。
import java.io.IOException;
import android.app.Activity;
import android.graphics.Matrix;
import android.graphics.SurfaceTexture;
import android.hardware.Camera;
import android.os.Bundle;
import android.util.Log;
import android.view.Gravity;
import android.view.Surface;
import android.view.TextureView;
import android.widget.FrameLayout;
public class SurfaceTextureActivity extends Activity implements TextureView.SurfaceTextureListener{
private Camera mCamera;
private TextureView mTextureView;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mTextureView = new TextureView(this);
mTextureView.setSurfaceTextureListener(this);
setContentView(mTextureView);
}
@Override
public void onSurfaceTextureAvailable(SurfaceTexture surface, int width, int height) {
int cameraId = 0;
Camera.CameraInfo info = new Camera.CameraInfo();
for (cameraId = 0; cameraId < Camera.getNumberOfCameras(); cameraId++) {
Camera.getCameraInfo(1, info);
if (info.facing == Camera.CameraInfo.CAMERA_FACING_FRONT)
break;
}
mCamera = Camera.open(cameraId);
Matrix transform = new Matrix();
Camera.Size previewSize = mCamera.getParameters().getPreviewSize();
int rotation = getWindowManager().getDefaultDisplay()
.getRotation();
Log.i("onSurfaceTextureAvailable", " CameraOrientation(" + cameraId + ")" + info.orientation + " " + previewSize.width + "x" + previewSize.height + " Rotation=" + rotation);
switch (rotation) {
case Surface.ROTATION_0:
mCamera.setDisplayOrientation(90);
mTextureView.setLayoutParams(new FrameLayout.LayoutParams(
previewSize.height, previewSize.width, Gravity.CENTER));
transform.setScale(-1, 1, previewSize.height/2, 0);
break;
case Surface.ROTATION_90:
mCamera.setDisplayOrientation(0);
mTextureView.setLayoutParams(new FrameLayout.LayoutParams(
previewSize.width, previewSize.height, Gravity.CENTER));
transform.setScale(-1, 1, previewSize.width/2, 0);
break;
case Surface.ROTATION_180:
mCamera.setDisplayOrientation(270);
mTextureView.setLayoutParams(new FrameLayout.LayoutParams(
previewSize.height, previewSize.width, Gravity.CENTER));
transform.setScale(-1, 1, previewSize.height/2, 0);
break;
case Surface.ROTATION_270:
mCamera.setDisplayOrientation(180);
mTextureView.setLayoutParams(new FrameLayout.LayoutParams(
previewSize.width, previewSize.height, Gravity.CENTER));
transform.setScale(-1, 1, previewSize.width/2, 0);
break;
}
try {
mCamera.setPreviewTexture(surface);
} catch (IOException t) {
}
mTextureView.setTransform(transform);
Log.i("onSurfaceTextureAvailable", "Transform: " + transform.toString());
mCamera.startPreview();
}
@Override
public void onSurfaceTextureSizeChanged(SurfaceTexture surface, int width, int height) {
// Ignored, the Camera does all the work for us
}
@Override
public boolean onSurfaceTextureDestroyed(SurfaceTexture surface) {
mCamera.stopPreview();
mCamera.release();
return true;
}
@Override
public void onSurfaceTextureUpdated(SurfaceTexture surface) {
// Update your view here!
}
}
关于Android:使用 setTransform 翻转实时 TextureView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20878232/
我在 TextureView 中显示 CameraView 并使用 TextureView.getBitmap() 从 TextureView 获取位图>。 每次我调用 TextureView.get
我有一个附加了 mediaPlayer 的 TextureView,所以我可以使用它的表面来显示视频,到目前为止它运行良好。现在我尝试创建淡入淡出动画来显示视频,但我不知道该怎么做。 我尝试使用 se
我想使用 TextureView 在其中显示相机预览。最后我想使用 TextureView 为相机预览设置不透明度。但我有问题: 10-22 12:21:14.773: W/TextureView(5
是否有可能拥有一个具有透明度的 TextureView,以便其下方的 View (z 顺序)可见? TextureView 的 IOW 部分是透明的,TextureView 位于其上的 View 会透
我正在尝试实现 this page 上显示的示例.我已经尝试了三种运行 android 4 及更高版本的不同设备,在所有情况下我都会遇到黑屏并显示此警告: 01-27 20:01:22.683: W/
我尝试使用 SurfaceView 和 TextureView 播放相同的视频,并注意到使用 TextureView 渲染的图像更混叠(不如 SurfaceView 更“流畅”。 这是什么原因?有什么
我有一个具有固定宽度和高度的 TextureView,我想在其中显示一个相机预览。我需要裁剪相机预览,使其在我的 TextureView 中看起来不会被拉伸(stretch)。如何进行种植?如果我需要
我正在查看 Android 的 Camera2 API。在 https://github.com/googlesamples/android-Camera2Basic/blob/master/Appl
我正在查看 Android 的 Camera2 API。在 https://github.com/googlesamples/android-Camera2Basic/blob/master/Appl
我正在使用 android vlc (LibVLC) 和 TextureView 以便在我的 android 应用程序中播放实时 rtsp 流。一切工作正常,但是我需要为某些对象检测任务尽可能获取当前
我有一个 TextureView。我可以从我的 TextureView 中的评估文件夹播放视频。现在我想检查视频是否完成。我写了 setOnCompletionListener 但没有工作。这是我的来
我目前正在开发一个使用 Camera2 的应用程序。我在缩放和平移的 TextureView 上显示预览(我只需要显示图像的一部分)。我的问题是我需要分析整个图像。 我的 CameraDevice.S
我正在使用来自 Android Developers Samples 的相机代码在预览时获取图像的一部分并对其进行一些处理。 我想获取预览中从 [0,0] 到 [99,99] 的正方形图像,对其进行处
我正在制作一个自定义的安卓相机应用。到目前为止,我遇到的唯一问题是让 textureView 在横向模式下进行调整(将相机旋转 90 度)。 View 出来扭曲,而不是在正确的方向。肖像模式工作正常。
SurfaceTexture 预览被拉伸(stretch)了!我正在开发一个 camera2 应用程序。每个设备都工作不好。视频和照片的预览被拉伸(stretch)。 public class Cam
我有两个具有 TextureView 的 fragment 来显示相机预览或播放视频。 在使用应用程序一段时间后,玩弄屏幕,我在 logcat 中收到此错误 OpenGLRenderer﹕ GL_IN
我正在尝试将 TextureView 上的绘制过程复制到其他 TextureView 中。主要目标是能够创建一个相同视频的“墙”,该视频正在从附加到 TextureView 的 MediaPlayer
我正在尝试在 TextureView 上使用 ExoPlaye 播放视频。为了缩放和裁剪视频以适合 View ,我使用矩阵。我的自定义 View 扩展了“TextureView”这是我的代码: @Ov
我有一个 WpxHp 预览,我想拍摄 HxW 照片,因此我希望用户看到一个预览窗口,它与我要拍摄的照片具有相同的纵横比,而不是预览窗口。如何使用 TextureView 裁剪预览? -- 编辑 我的想
当我的 Android 应用程序启动时,我尝试播放启动 Activity 的视频,但我遇到了永远不会调用 onSurfaceTextureAvailable 接口(interface)方法的问题。 代
我是一名优秀的程序员,十分优秀!