android - GlSurfaceView setZMediaOrder 导致视频在其 parent 之外播放

标签 android glsurfaceview z-order

案例一:

GLSurfaceView
|
FrameLayout
|
TextureView
|
VideoRecording

所以这里我有一个 GLSurfaceView,根据用户输入,我在它上面添加了一个正方形 FrameLayout(使用布局参数设置尺寸),然后添加 TextureView 在这个新添加的 FrameLayout 之上,然后录制视频,正如预期的那样,无论选择什么相机,我都会得到一个方形预览。

案例 2:

GLSurfaceView
|
FrameLayout
|
GLSurfaceView
|
VideoPlayback

在案例 1 中,我在录制视频后添加了另一个 GLSurfaceView,方法是从已添加的 FrameLayout 中删除之前的 TextureView。早些时候,我只能听到播放的声音而没有任何视频,但后来我遇到了使用
setZOrderMediaOverlay(true);
的示例 或者
setZOrderOnTop(true)
现在播放视频,但不是在其父级中播放,而是以 9/16 宽高比播放。如前所述,预期行为是方形视频(FrameLayout 的尺寸)。

我怎样才能让新添加的视频位于背景视频之上而又不超出其 parent 的范围。

最佳答案

我认为您需要检查媒体播放器的宽高比并根据它进行设置,使用相对布局而不是框架布局并设置重心,并实现此代码:

MediaPlayer.OnVideoSizeChangedListener mOnVideoSizeChangedListener = new MediaPlayer.OnVideoSizeChangedListener() {

        @Override
        public void onVideoSizeChanged(MediaPlayer mp, int width, int height) {

            setAspectRatio(mp, width, height);

        }
    };

并创建一个方法并根据此设置视频布局参数:

  private void setAspectRatio(MediaPlayer mediaPlayer, int videoWidth, int videoHeight)
{
    if(mediaPlayer != null)
    {

        DisplayMetrics displayMetrics = new DisplayMetrics();
        getActivity().getWindowManager().getDefaultDisplay().getMetrics(displayMetrics);
        int height = displayMetrics.heightPixels;
        int width = displayMetrics.widthPixels;

        ViewGroup.LayoutParams videoParams = getLayoutParams();


        if (videoWidth > videoHeight)
        {
            videoParams.width = width;
            videoParams.height = width * videoHeight / videoWidth;
        }
        else
        {
            videoParams.width = height * videoWidth / videoHeight;
            videoParams.height = height;
        }

        // Commit params
        surfaceView.setLayoutParams(videoParams);
    }
}

关于android - GlSurfaceView setZMediaOrder 导致视频在其 parent 之外播放,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44084927/

相关文章:

android - 如何将 View 发送到后面?如何以编程方式控制 z 顺序?

Android tabhost改变文字颜色样式

android - eglPresentationTimeANDROID() : Can I use microedition. khronos 而不是 android.opengl?

android - 如何初始化依赖于 View 属性的东西

java - 在 GLSurfaceView 上设置 AlphaAnimation

mfc - win32 CTabctrl : Drawing "child" windows in the active tab

android - 在 IONIC 项目中更改 buildToolsVersion 的位置

java - 我想在选择安全性并在 Android Studio 中输入密码后为给定的 Wifi SSID 生成二维码

android - 使用 ImageView 和矩阵在图像上绘制形状

java - JavaFX 中的 Z 顺序