Android - 如何在 FrameLayout 中心添加一个 Large GLSurfaceView?

Android - How add a Large GLSurfaceView in a FrameLayout center?

我正在使用两个 GLSUrfaceView 来渲染我自己的摄像机的视频和从服务器接收的视频。它们是视频通话数据。一大一小。大GLSurfaceView有两种模式,一种是普通屏幕模式,通过填充屏幕宽度并计算屏幕高度(DISPLAY_WIDTH * ASPECT_RATIO_OF_IMAGE),第二种模式是全屏通过填充屏幕高度并将屏幕宽度计算为 (DISPLAY_HEIGHT * ASPECT_RATIO_OF_IMAGE) 来完成的模式。我双击使屏幕变大,再次双击使屏幕恢复正常。但问题是在大模式下,图像只在右侧被切割。我希望我的图像被切割成适合 FrameLayout 中心在 GLSurfaceView 中心的所有边。我也在添加我的代码部分。另见下图,它描述了我的需要。

    <RelativeLayout
    android:id="@+id/video_call_views_container_outgoing"
    android:layout_width="match_parent"
    android:visibility="gone"
    android:layout_height="match_parent">

    <FrameLayout
        android:id="@+id/largeGLSurfaceViewContainer"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"
        android:orientation="vertical"/>


    <FrameLayout
        android:id="@+id/smallGLSurfaceViewContainer"
        android:layout_width="120dp"
        android:layout_height="170dp"
        android:orientation="vertical"
        android:visibility="gone"/>
</RelativeLayout>

这是我的编码部分:

    GLSurfaceView frontCameraGLView = new GLSurfaceView (this);
    GLSurfaceView opponentCameraGLView = new GLSurfaceView (this);


    largeVideoRenderLayoutOutgoing.addView(opponentCameraGLView );
    largeVideoRenderLayoutOutgoing.setOnClickListener(this);
    opponentCameraGLView.setZOrderMediaOverlay(false);

    smallVideoRenderLayoutOutgoing.addView(frontCameraGLView );
    smallVideoRenderLayoutOutgoing.setOnClickListener(this);

largeVideoRenderLayoutOutgoing 是 ID 为 largeGLSurfaceViewContainerFrameLayout 的引用,smallVideoRenderLayoutOutgoing 也引用 ID 为 smallGLSurfaceViewContainerFrameLayout。在 ActivityonCreate 期间,GLSurfaceView 被添加到 FrameLayout's。问题在下图的

中指定

此图像是 Upeer 端处于正常模式的图像。下面的图像处于全屏模式。请参阅这些图像的左侧。它们是相同的,但右侧在全屏模式下被剪切,我的意思是最后一张图像。我希望图像应该居中对齐,以便图像在所有侧边被切割,聚焦我传入视频的中心

如果 GLSurfaceView 的宽度或高度大于设备屏幕,它将表现如下: 1. 对于宽度大于设备宽度但高度与设备高度相同的情况:GLSurfaceView 将从坐标为 (0,0) 的左上角开始绘制,额外的图像将超出屏幕右侧。所以图像中心不会在布局的中心。为了解决这个问题,我们需要将图像左移为 leftMargin,其值将是 (imageWidth-deviceWidth) 的一半。代码就像

ViewGroup.MarginLayoutParams marginLayoutParams = (ViewGroup.MarginLayoutParams) glSurfaceView.getLayoutParams();
int margin = (-1 * (int) ((glSurfaceView.getWidth() - displayWidth) / 2));
marginLayoutParams.setMargins(margin, 0, 0, 0);
setLayoutParams(marginLayoutParams);

如果 glsurfaceview 的高度大于设备高度,请编写类似的代码。在顶部添加边距,使图像适合设备的中心