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 为 largeGLSurfaceViewContainer
的 FrameLayout
的引用,smallVideoRenderLayoutOutgoing
也引用 ID 为 smallGLSurfaceViewContainer
的 FrameLayout
。在 Activity
的 onCreate
期间,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 的高度大于设备高度,请编写类似的代码。在顶部添加边距,使图像适合设备的中心
我正在使用两个 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 为 largeGLSurfaceViewContainer
的 FrameLayout
的引用,smallVideoRenderLayoutOutgoing
也引用 ID 为 smallGLSurfaceViewContainer
的 FrameLayout
。在 Activity
的 onCreate
期间,GLSurfaceView
被添加到 FrameLayout's
。问题在下图的
如果 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 的高度大于设备高度,请编写类似的代码。在顶部添加边距,使图像适合设备的中心