首页 > 解决方案 > 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);
    }
}

标签: androidandroid-studio

解决方案


您添加将SurfaceView其放置在视图层次结构末尾的 by 代码。这意味着它将覆盖自身下方的所有其他视图。

把它放在第一位,你的所有视图SurfaceView,仍然可以绘制它们的界面。

通过使用addView方法重载,您可以设置索引,您可以将您的索引放在首位SurfaceView

因此,将您的代码更改为:

viewGroup.addView(previewDisplayView);

到:

viewGroup.addView(previewDisplayView, 0); // -> 0 means add the view at the first position

推荐阅读