全屏视频播放器 - 导航栏后面的媒体控制器
Posted
技术标签:
【中文标题】全屏视频播放器 - 导航栏后面的媒体控制器【英文标题】:Fullscreen video player - mediacontroller behind navigation bar 【发布时间】:2012-11-05 17:49:52 【问题描述】:我遇到了隐藏在导航栏后面的媒体控制器问题(ICS 上的软导航键)。起初是好的(第一张图片),但是当导航栏第一次隐藏时,媒体控制器调整大小以适应屏幕(正确),但当导航栏再次出现时(第二张图片)没有调整大小。广告也被移到后面(屏幕截图隐藏)。
如果我理解文档正确,fitsSystemWindows 应该负责调整大小。但它不起作用。
我该怎么做?感谢您的帮助。
我正在 Galaxy Nexus 上进行测试。
XML 布局:
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/playerLayout"
android:layout_
android:layout_
android:animateLayoutChanges="true"
android:background="@color/black" >
<mynamespace.BKDVideoView
android:id="@+id/videoview"
android:layout_
android:layout_
android:layout_gravity="center"/>
<mynamespace.SubtitleTextView
android:id="@+id/subtitleText"
style="@style/SubtitleOverlayText"
android:layout_
android:layout_
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_
android:layout_
android:layout_gravity="top|right"
android:fitsSystemWindows="true"
android:animateLayoutChanges="true"/>
<FrameLayout
android:id="@+id/videoMediaControllerHolder"
android:layout_
android:layout_
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);
更新:如果您有同样的问题,请在接受的答案中查看评论。对于需要全屏显示的视图,请使用 sammyboy 代码。感谢双方。抱歉,我需要太多时间来解决这个问题,无法给你积分:(
【问题讨论】:
你是如何准备像上面这样的视频屏幕的。你能指导我构建一个像上面这样的媒体控制器吗? 正如我上面所说,它是一个自定义的 VideoView 和 MediaController。然后我有一个 FrameLayout,它是透明的和全屏的,并且包含另外两个视图,顶部和底部,它们具有固定大小并位于顶部(layout_gravity=top)和底部。没什么特别的:) 你能发布你的源代码吗?这对我很有帮助。 底部控件:pastie.org/private/t2p0xkppk34ipl3in4888q 你是如何管理切换屏幕的。 【参考方案1】:这是系统栏问题。某些设备的 fill_parent 或 match_parent 实体具有完整的屏幕尺寸,并且无法识别系统栏的宽度和高度。 我建议:以编程方式为视图赋予一个整数值。 (计算系统栏的宽度和高度)。并从屏幕尺寸中删除某人的宽度或高度(横向或纵向模式) 并将此值设置为视图。
here回答如何获取屏幕尺寸等
【讨论】:
通过这种方法,我可以通过导航栏 (1184x720) 获得大小。要获得真实尺寸(1280x720),我需要调用 rawWidth(在 Samyboy89 帖子中)。但是,如果我将控件宽度设置为显示宽度,那么对于右侧的导航栏就可以了。但是如果它们在底部(平板电脑),那么它们就隐藏在后面 :( Mediacontroller 应该以某种方式知道导航栏,但我不知道如何解决这个问题 :( 我对此进行了更多调查。 android:fitsSystemWindows 仅在活动不是全屏时才有效;在这里我遇到了一个问题。在这种情况下,唯一的解决方案是以编程方式设置宽度和高度并设置重力 top|left (就像你说的那样)。对不起,我不能再给你积分了:(【参考方案2】:看看这个: 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);
【讨论】:
谢谢,我已经有了。首先我隐藏了一个导航栏(好吧,有点不同 - developer.android.com/reference/android/view/…),然后我调整视频大小以匹配全屏。但是我有一个问题,控件也匹配全屏,但它们不应该那么宽(应该尊重导航栏)。在平板电脑上,它们太低也是一个问题,并且被导航栏覆盖。我认为 fitSystemWindows 应该以某种方式解决这个问题,但我不知道如何:(【参考方案3】:使用bringToFront()
使视图位于顶部
【讨论】:
它没有帮助:(我已经用图片更新了第一个帖子,以便更好地了解问题所在。【参考方案4】:由于VideoView
s 是SurfaceView
s,它们的行为与普通View
不同。您需要通过指定以下内容来确保它保留在后台:
videoview.setZOrderMediaOverlay(false);
【讨论】:
我也试过这个,但没有帮助......也许我做错了什么。如果我是正确的,这是用于 z 排序表面视图。我只有一个(VideoView),我认为这不是 z 顺序的问题,而是控件大小的问题(查看评论 @Samyboy89)。【参考方案5】:在包含表面视图的框架布局中添加 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);
【讨论】:
以上是关于全屏视频播放器 - 导航栏后面的媒体控制器的主要内容,如果未能解决你的问题,请参考以下文章
退出电影播放器全屏会导致 navigationController 导航栏移到状态栏后面
IOS 开发人员,正在开发一个基本的 MoviePlayer 应用程序。无法使用导航栏停止播放视频
h5页面自动播放视频音频_关于媒体文件自动全屏播放的实现方式