Экран Android мигает при отображении / скрытии системных панелей
Эта проблема
Я хочу показать системные панели, когда пользователь прокручивает RecyclerView вверх, и скрыть системные панели, когда пользователь прокручивает вниз. Однако с моим подходом это работает, но содержимое странно движется и мигает во время процесса показа / скрытия. Вы загрузили видео для поведения здесь: https://drive.google.com/open?id=0B_b9EpRt-zyHVW54dkQzcXdUTXM
Мой подход
В основном у меня есть два метода:
private void hideSystemUI() {
getActivity().getWindow().getDecorView().setSystemUiVisibility(
View.SYSTEM_UI_FLAG_LAYOUT_STABLE |
View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
| View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
| View.SYSTEM_UI_FLAG_HIDE_NAVIGATION // hide nav bar
| View.SYSTEM_UI_FLAG_FULLSCREEN // hide status bar
| View.SYSTEM_UI_FLAG_IMMERSIVE);
}
private void showSystemUI() {
getActivity().getWindow().getDecorView().setSystemUiVisibility(
View.SYSTEM_UI_FLAG_LAYOUT_STABLE
| View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
| View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);
}
И я установил это onScrollListener в RecyclerView, чтобы скрыть и показать строки состояния в зависимости от прокрутки:
mFragmentListBinding.fragListRvMovies.addOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
super.onScrolled(recyclerView, dx, dy);
if (dy > 5) {
// hideSystemUI();
// SystemUIHelper.hide(getActivity());
hideSystemUI();
} else if (dy < -5) {
showSystemUI();
// showSystemUI();
// SystemUIHelper.show(getActivity());
}
if (pageToDownload < TOTAL_PAGES && layoutManager.findLastVisibleItemPosition() == adapter.movieList.size() - 1 && !isLoadingLocked && !isLoading) {
downloadMoviesList();
}
}
});
И это макет:
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools">
<android.support.v4.widget.DrawerLayout
android:id="@+id/frag_drawer_layout"
android:layout_width="match_parent"
android:layout_height="match_parent">
<android.support.design.widget.CoordinatorLayout
android:id="@+id/frag_drawer_coordinator"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="false">
<android.support.design.widget.AppBarLayout
android:id="@+id/frag_drawer_appbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:theme="@style/AppTheme.AppBarOverlay"
android:transitionGroup="false"
tools:targetApi="lollipop">
<android.support.v7.widget.Toolbar
android:id="@+id/frag_drawer_tb"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:background="?attr/colorPrimary"
app:layout_scrollFlags="scroll|enterAlways"
app:popupTheme="@style/ThemeOverlay.AppCompat.Light"
app:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar" />
</android.support.design.widget.AppBarLayout>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/frag_drawer_content"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="false"
app:layout_behavior="@string/appbar_scrolling_view_behavior" />
<android.support.design.widget.FloatingActionButton
android:id="@+id/frag_drawer_fab_add"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="end|bottom"
android:layout_margin="@dimen/material_component_floating_action_button_margin"
android:src="@drawable/ic_add_white_24dp"
android:visibility="gone"
android:fitsSystemWindows="false"
app:backgroundTint="@color/accent"
app:elevation="@dimen/elevation_fab_resting"
app:fabSize="normal" />
<android.support.design.widget.FloatingActionButton
android:id="@+id/frag_drawer_fab_filter"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="end|bottom"
android:layout_margin="@dimen/material_component_floating_action_button_margin"
android:fitsSystemWindows="false"
android:src="@drawable/ic_filter"
android:visibility="visible"
app:backgroundTint="@color/accent"
app:elevation="@dimen/elevation_fab_resting"
app:fabSize="normal" />
</android.support.design.widget.CoordinatorLayout>
<android.support.design.widget.NavigationView
android:id="@+id/frag_drawer_nav"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_gravity="start"
app:elevation="@dimen/elevation_nav_drawer"
app:headerLayout="@layout/layout_nv_header"
app:itemIconTint="@color/nav_icon_tint"
app:itemTextColor="@color/nav_text"
app:menu="@menu/menu_drawer" />
</android.support.v4.widget.DrawerLayout>
</layout>
Мой вопрос
Как можно более плавно показать и скрыть строку состояния и вид навигации?
3 ответа
То, что вы видите, это Layout
изменение размера. Единственный способ предотвратить это - иметь Layout
слой под системным представлением, так что это не влияет. Проверьте следующие флаги, которые могут помочь вам предотвратить изменение размера:
FLAG_LAYOUT_IN_SCREEN
FLAG_LAYOUT_INSET_DECOR
Однако имейте в виду, что в верхней части вашего контента будет находиться системный интерфейс, и вам необходимо это компенсировать.
// Скрыть строку состояния
getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
// Показать строку состояния
getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
Вы пытались запустить свои методы в потоке пользовательского интерфейса Android? например
runOnUiThread(new Runnable() {
public void run() {
// execute your hiding/presenting the bar here
}
});
Существует несколько вариантов использования темы пользовательского интерфейса Android... Посмотрите на этот вопрос