android - SurfaceView 上不显示 TextView
问题描述
我将 SurfaceView 设置为显示相机。最重要的是,我喜欢显示一个 TextView。我的xml如下。
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent">
<FrameLayout
android:id="@+id/preview_display_layout"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_weight="1">
<TextView
android:id="@+id/gestureView"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_marginTop="80dp"
android:layout_centerHorizontal="true"
android:text="hello"/>
</FrameLayout>
</androidx.constraintlayout.widget.ConstraintLayout>
SurfaceView 设置为在其上显示相机。然后在 SurfaceView 之后添加 TextView。显示相机但 TextView 未显示在其顶部。我的代码如下。
public class MainActivity extends AppCompatActivity {
private static final boolean FLIP_FRAMES_VERTICALLY = true;
private SurfaceTexture previewFrameTexture;
private SurfaceView previewDisplayView;
private EglManager eglManager;
private TextView gestureView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
previewDisplayView = new SurfaceView(this);
setupPreviewDisplayView();
}
private void setupPreviewDisplayView() {
previewDisplayView.setVisibility(View.GONE);
ViewGroup viewGroup = findViewById(R.id.preview_display_layout);
viewGroup.addView(previewDisplayView);
gestureView = (TextView) findViewById(R.id.gestureView);
previewDisplayView
.getHolder()
.addCallback(
new SurfaceHolder.Callback() {
@Override
public void surfaceCreated(SurfaceHolder holder) {
processor.getVideoSurfaceOutput().setSurface(holder.getSurface());
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
Size viewSize = new Size(width, height);
Size displaySize = cameraHelper.computeDisplaySizeFromViewSize(viewSize);
converter.setSurfaceTextureAndAttachToGLContext(previewFrameTexture, displaySize.getWidth(), displaySize.getHeight());
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
processor.getVideoSurfaceOutput().setSurface(null);
}
});
}
private void startCamera() {
cameraHelper = new CameraXPreviewHelper();
cameraHelper.setOnCameraStartedListener(
surfaceTexture -> {
previewFrameTexture = surfaceTexture;
// Make the display view visible to start showing the preview. This triggers the
// SurfaceHolder.Callback added to (the holder of) previewDisplayView.
previewDisplayView.setVisibility(View.VISIBLE);
});
cameraHelper.startCamera(this, CAMERA_FACING, /*surfaceTexture=*/ null);
}
}
解决方案
您添加将SurfaceView
其放置在视图层次结构末尾的 by 代码。这意味着它将覆盖自身下方的所有其他视图。
把它放在第一位,你的所有视图SurfaceView
,仍然可以绘制它们的界面。
通过使用addView
方法重载,您可以设置索引,您可以将您的索引放在首位SurfaceView
。
因此,将您的代码更改为:
viewGroup.addView(previewDisplayView);
到:
viewGroup.addView(previewDisplayView, 0); // -> 0 means add the view at the first position
推荐阅读
- python - PYPDF2:为奇数pdf文档附加一个空白页给出空白页
- octave - 八度梯度下降的奇怪错误(已知命令的语法错误)
- vuejs2 - 如何使用 vue-head 插件设置从数据库读取的元数据?
- python - 从函数参数中获取 random.choice
- php - 我无法打印要发送到数据库的数组 - Laravel
- php - 即使没有明显的冲突,Composer 也不会安装
- javascript - Google Maps API:创建加载标记的函数,以便可以使用 setInterval 调用它来更新 XML 的位置
- javascript - 在字符串的单词之间添加文本
- python - 从 2 个相同长度的列表中返回列表对(打印输出)
- c - 为内部目录创建目标文件时makefile失败