📜  颤动删除状态栏 (1)

📅  最后修改于: 2023-12-03 15:42:28.708000             🧑  作者: Mango

颤动删除状态栏

当我们需要在 Android 应用中删除状态栏时,传统的做法是直接将 android:theme 属性设为 Theme.NoTitleBar,但这样的话会直接去掉整个标题栏,可能会影响用户体验。这时,颤动删除状态栏的方法可能会更加优美。

设计思路

颤动删除状态栏的基本思路是在状态栏当前隐身时将标题栏从原来的位置下移,从而达到删除状态栏的效果。为了保证效果更加美观,我们还需要对整个 App 的布局做出一些调整。

下面是具体的步骤:

  1. 在 Activity 的布局文件中增加一个空白 View,用于填充状态栏的位置。这个 View 的高度设为系统状态栏的高度,这样就可以让整体布局更加协调。
  2. 在 Activity 的 onCreate 方法中,通过 View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN 指定应用的布局是否应从应用窗口的顶部扩展到状态栏的区域。
  3. 然后再通过 WindowInsetsCompat 获取系统状态栏的高度,并将上述空白 View 的高度设为状态栏的高度。
  4. 最后,当状态栏隐身时,将标题栏的位置下移。
实现方式

下面是具体的实现代码:

public class MainActivity extends AppCompatActivity {

    private View mStatusBarPlaceholder; // 空白 View,填充状态栏的位置

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // 指定应用的布局是否应从应用窗口的顶部扩展到状态栏的区域
        getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);

        // 通过 WindowInsetsCompat 获取系统状态栏的高度,并设置空白 View 的高度为状态栏的高度
        mStatusBarPlaceholder = findViewById(R.id.status_bar_placeholder);
        ViewCompat.setOnApplyWindowInsetsListener(mStatusBarPlaceholder, new OnApplyWindowInsetsListener() {
            @Override
            public WindowInsetsCompat onApplyWindowInsets(View v, WindowInsetsCompat insets) {
                ViewGroup.LayoutParams layoutParams = v.getLayoutParams();
                layoutParams.height = insets.getSystemWindowInsetTop();
                v.setLayoutParams(layoutParams);
                return insets;
            }
        });

        // 当状态栏隐身时,将标题栏的位置下移
        getWindow().getDecorView().setOnSystemUiVisibilityChangeListener(new View.OnSystemUiVisibilityChangeListener() {
            @Override
            public void onSystemUiVisibilityChange(int visibility) {
                if ((visibility & View.SYSTEM_UI_FLAG_FULLSCREEN) == 0) {
                    getSupportActionBar().show();
                } else {
                    getSupportActionBar().hide();
                }
            }
        });
    }
}
结语

通过颤动删除状态栏的方法,我们能够轻松地删除状态栏,同时也能保证整个应用的布局得到优化。如果你在 Android 应用中需要删除状态栏,不妨试试上述方法,看看效果如何。