视频播放器使用appcompat-v7在Android中点亮模式

roc*_*k3r 35 android media-player android-appcompat android-support-library android-toolbar

我正在将一个代码库从本机Holo(Theme.Holo等)移植到appcompat-v7(Theme.AppCompat等等).如果您不想阅读详细信息,最后一部分包含tl; dr.


问题

一切正常,但我有问题复制一个很容易使用旧ActionBar的行为.我有一个视频播放器,在风景中我希望它的行为像YouTube:隐藏(动画)播放器控件,应用栏和状态栏.在用户交互时,UI控件应该保持"熄灯"模式并返回正常状态.如果用户没有触摸屏幕X秒,则计时器将返回到熄灯模式.使用ActionBar的相同代码不能用Toolbar.

所以,我使用的是:

  • 不透明的状态栏
  • setSystemUiVisibility() 使用以下组合之一:
    • 默认: View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
    • 熄灯: View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LOW_PROFILE | View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_STABLE
  • minSdkVersion 是16岁
  • 显示和隐藏的动作条我简称show()hide()
  • 在app子栏上实现相同的行为我子类化Toolbar并添加了一个show()和一个hide()方法来做同样的事情(首先简单地使用setVisibility(),然后使用动画 - 得到相同的结果)

LAYOUT_STABLE做这样的appbar最终会在状态栏的背后,当然是(因为这意味着fitSystemWindows,由于appbar是视图层次结构中的普通视图和喜欢的动作条中,它是由该标志的影响是不是在装修这就是我在屏幕上看到的:

状态栏后面的App栏

不能立即清楚工具栏界限是什么,因为应用栏在黑暗中是黑暗的,但是你可以看到标题被剪切并且"未对齐".这是因为工具栏的大小正确但位于状态栏后面.我的主要问题是,此时没有公共API来获取状态栏高度,矩形或其他任何内容以垂直移动我的应用栏以显示状态栏下方.

测试主要是在LPX13D上的N5上进行的(在撰写本文时最新的Lollipop公共版本),但在Android 4.4上也可以看到相同的情况.


黑客的解决方案

也就是说,经过相当长的一段时间和一些失败的尝试使其以一种不太苛刻的方式工作(包括我自己试图将其置于装饰中的相当绝望的尝试),我采取了这种令人讨厌的方式使其工作:

  1. onResume:
    a.setSystemUiVisibility(View.SYSTEM_UI_FLAG_VISIBLE)即使我通常不这样做也会打电话(风景)
    b.注册一个OnPreDrawListener

  2. OnPreDrawListener:
    a.使用View root = getRootView().findViewById(R.id.my_root)
    b 获取根视图.获取根视图高度:( int rootTop = getAbsoluteViewTop(root)见下文)
    c.使用顶部(将其作为状态栏高度)作为appbar
    d 的paddingTop .设置我通常使用的SystemUiVisibility(LAYOUT_STABLE等)
    e.取消绘图过程

  3. 在下一个绘图过程中,取消注册 OnPreDrawListener

这是getAbsoluteViewTop()方法:

private int getAbsoluteViewTop(View view) {
    int[] location = new int[2];
    view.getLocationOnScreen(location);
    return location[LOCATION_Y];
}
Run Code Online (Sandbox Code Playgroud)

tl; dr和问题

tl; dr:Toolbar除非采用hacky hack ,否则没有办法用a做正确的"熄灯"模式.

问题:是否有正式和干净的方式来实现这种熄灯模式Toolbar
我在文档中找不到任何内容.状态栏无法访问(并且在SO上找到它的大小的所有方法都被破坏了,仅供参考).但也许我错过了一些东西.我很乐意摆脱这种黑客攻击.

bkD*_*kDJ 1

fitssystemwindows当您希望视图层次结构的某些元素全屏显示并且某些元素位于状态栏或操作栏下方时,我发现也非常不可靠。但我从未见过状态栏后面的操作栏。工具栏是否设置为活动操作栏?你正在用Window.FEATURE_ACTION_BAR_OVERLAY吗 ?paddingTop无论如何,如果您需要的只是获取in的多个像素onResume(),那么执行类似以下操作而不是使用 s 可能会更干净(尽管仍然很hacky)OnPreDrawListener

class MyVideoActivity extends Activity {
    Toolbar bar;

    //...

    @Override protected void onResume() {
        super.onResume();
        bar.setPaddingTop(getStatusBarHeight());
    }

    int getStatusBarHeight() {
        int result = 0;
        Resources res = getResources();
        int resourceId = res.getIdentifier("status_bar_height", "dimen", "android");
        if (resourceId > 0) {
            result = res.getDimensionPixelSize(resourceId);
        }
        return result;
    }
}
Run Code Online (Sandbox Code Playgroud)