全屏视频播放器 - 导航栏后面的mediacontroller

时间:2012-11-05 17:49:52

标签: android fullscreen android-videoview

我的mediacontroller有一个问题,它隐藏在导航栏后面(ICS上的软导航键)。首先是OK(第一张图片),但是当第一次隐藏导航栏时,mediacontroller被调整大小以适应屏幕(正确),但是当再次出现导航栏时(第二张图片)不会调整大小。广告也被移到后面(隐藏用于截屏)。

如果我理解文档正确 fitsSystemWindows 应负责调整大小。但它不起作用。

我该怎么做?谢谢你的帮助。

我在Galaxy Nexus上测试了这个。

XML布局:

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/playerLayout"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:animateLayoutChanges="true"
android:background="@color/black" >
<mynamespace.BKDVideoView
    android:id="@+id/videoview"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="center"/>
<mynamespace.SubtitleTextView
    android:id="@+id/subtitleText"
    style="@style/SubtitleOverlayText"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="bottom|center_horizontal"
    android:layout_marginBottom="30dp"
    android:gravity="center"
    android:visibility="gone"
    android:fitsSystemWindows="true"
    android:animateLayoutChanges="true"/>
<FrameLayout
    android:id="@+id/adLayout"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="top|right"
    android:fitsSystemWindows="true"
    android:animateLayoutChanges="true"/>
<FrameLayout
    android:id="@+id/videoMediaControllerHolder"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fitsSystemWindows="true"
    android:animateLayoutChanges="true"/>

BKDVideoView是来自VideoView的GrepCode的一些自定义副本。我为MediaController做了同样的事情。 在MediaController中,我正在呼叫这样的隐藏:

int newVis = SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION | SYSTEM_UI_FLAG_LAYOUT_STABLE;
    if (!visible)
    {
        newVis |= SYSTEM_UI_FLAG_LOW_PROFILE | SYSTEM_UI_FLAG_FULLSCREEN | SYSTEM_UI_FLAG_HIDE_NAVIGATION;
    }

    // mSystemUiHolder -> FrameLayout (playerLayout)
    mSystemUiHolder.setSystemUiVisibility(newVis);

When it's ok When it's overlayed

更新:如果您遇到同样的问题,请在接受的答案中查看评论。对于需要全屏使用sammyboy代码的视图。感谢两者。对不起,我需要太多时间来解决这个问题并且无法给你积分:(

5 个答案:

答案 0 :(得分:5)

这是系统问题。某些设备fill_parent或match_parent实体具有完全屏幕尺寸,并且无法识别系统宽度和高度。 我建议:以编程方式为视图提供一个整数值。 (计算系统条宽度和高度)。并从屏幕大小中删除sb的宽度或高度(横向或纵向模式) 并将此值设置为视图。

here答案如何获取屏幕尺寸等。

答案 1 :(得分:4)

看看这个: http://bin-liu.blogspot.no/2012/03/how-to-hide-and-display-navigation-bar.html

public void onLayoutClicked(View v) {
    view.setSystemUiVisibility(View.SYSTEM_UI_FLAG_HIDE_NAVIGATION);
}

Display display = getWindowManager().getDefaultDisplay();     
Method mGetRawH = Display.class.getMethod("getRawHeight");
Method mGetRawW = Display.class.getMethod("getRawWidth");
int rawWidth = (Integer) mGetRawW.invoke(display);
int rawHeight = (Integer) mGetRawH.invoke(display);

答案 2 :(得分:1)

使用bringToFront()将视图置于顶部

答案 3 :(得分:1)

由于VideoViewSurfaceView s,因此它们与普通View的行为不同。您需要通过指定:

确保它保留在后台
videoview.setZOrderMediaOverlay(false);

答案 4 :(得分:1)

在包含surfaceview的framelayout中添加android:fitsSystemWindows="false"

以及您活动中的此代码

your_framelayout_here.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE |View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN|View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION);