gpt4 book ai didi

android - 使用 appcompat-v7 在 Android 中视频播放器熄灯模式

转载 作者:IT老高 更新时间:2023-10-28 21:38:35 26 4
gpt4 key购买 nike

我正在将代码库从原生 Holo(Theme.Holo 等)移植到 appcompat-v7 (Theme.AppCompat 等等)。最后一节包含 tl;博士如果您不想阅读详细信息。

问题

一切正常,但我在复制一种使用旧 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() 的 ActionBar和 hide()就可以了
  • 为了在应用栏上实现相同的行为,我对 Toolbar 进行了子类化并添加了 show()hide()执行相同操作的方法(首先简单地使用 setVisibility(),然后使用动画——得到相同的结果)
  • LAYOUT_STABLE这样做是为了让 appbar 最终位于状态栏后面,当然(因为它暗示了 fitSystemWindows 。由于 appbar 是 View 层次结构中的普通 View ,并且不像 ActionBar 那样在装饰中,因此它受那面旗帜。这就是我在屏幕上看到的:

    App bar behind the status bar

    无法立即清楚工具栏的边界是什么,因为应用程序栏在黑暗中是黑暗的,但您可以看到标题被剪切并且“未对齐”。这是因为工具栏的大小正确但位于状态栏后面。我的主要问题是当时没有公共(public) API 来获取状态栏高度、矩形或其他任何东西来垂直移动我的应用栏以显示在状态栏下方。

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

    骇人听闻的解决方案

    也就是说,经过相当长的一段时间和一些失败的尝试,使其以一种不太老套的方式工作(包括相当绝望的试图自己把它放入装饰中的尝试),我采用了这种令人讨厌的方式让它工作:
  • onResume :
    一个。调用 setSystemUiVisibility(View.SYSTEM_UI_FLAG_VISIBLE)即使我通常不会这样做(风景)
    湾。注册 OnPreDrawListener
  • OnPreDrawListener :
    一个。使用 View root = getRootView().findViewById(R.id.my_root) 获取 Root View
    湾。获取 Root View 高度:int rootTop = getAbsoluteViewTop(root) (见下文)
    C。使用该顶部(将其作为状态栏高度)作为应用栏的 paddingTop
    d。设置我通常使用的 SystemUiVisibility(LAYOUT_STABLE 等)
    e.抑制绘图通
  • 在下一个绘图过程中,取消注册 OnPreDrawListener

  • 这是 getAbsoluteViewTop()方法:
    private int getAbsoluteViewTop(View view) {
    int[] location = new int[2];
    view.getLocationOnScreen(location);
    return location[LOCATION_Y];
    }

    tl;博士和问题

    tl;博士 : 没有办法使用 Toolbar 进行正确的“熄灯”模式除非使用 hacky hack。

    问题:有没有一种官方和干净的方式来实现这个熄灯模式 Toolbar ?
    我在文档中找不到任何内容。状态栏无法访问(并且您可以在 SO 上找到其大小的所有方法都已损坏,仅供引用)。但也许我错过了一些东西。我很想摆脱这个黑客。

    最佳答案

    我找到了fitssystemwindows当您希望 View 层次结构的某些元素全屏显示并且某些元素位于状态栏或操作栏下方时,这也是非常不可靠的。但我从未见过状态栏后面的操作栏。工具栏是否设置为 Activity 操作栏?您在使用 Window.FEATURE_ACTION_BAR_OVERLAY ?无论如何,如果您只需要获取 paddingTop 的像素数在 onResume() , 做类似下面的事情而不是使用 OnPreDrawListener 可能会更干净(虽然仍然很hacky) s。

    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;
    }
    }

    关于android - 使用 appcompat-v7 在 Android 中视频播放器熄灯模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26850721/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com