Android SystemBar各种风格案例

  • Android System Bar(Status Bar 和Navigation Bar)暗淡效果

  • Android Status Bar的隐藏与浮层效果

  • Android NavigationBar隐藏与浮层

  • Android SystemBar(Status Bar 和Navigation Bar)设置 Immersive与Sticky Immersion风格

  • Android 响应System UI状态,焦点改变,手势处理

响应System UI状态,焦点改变,手势处理


System Bar 状态显示的处理方式:

为了监听System bar 状态变化,需在Activity类中onCreate()方法中注册View.OnSystemUiVisibilityChangeListener 去监听。

class MainActivity : AppCompatActivity(), View.OnClickListener {    private var tag = MainActivity::class.java.simpleName    override fun onCreate(savedInstanceState: Bundle?) {        super.onCreate(savedInstanceState)        setContentView(R.layout.activity_main)        setSystemUIChangeListener()    }    /**     * 监听System bar异步改变     */    fun setSystemUIChangeListener() {        /**         *  当 system bar 设置LOW_PROFILE, HIDE_NAVIGATION, or FULLSCREEN flags,才会触发         */        window.decorView.setOnSystemUiVisibilityChangeListener {            visibility ->            if ((visibility and View.SYSTEM_UI_FLAG_FULLSCREEN) == 0) {// system bar可见                //再次隐藏SystemBar                SystemUIManager.setStickyStyle(window)                Toast.makeText(applicationContext, " system bar 显示出来",                                    Toast.LENGTH_SHORT).show()            } else {// system bar不可见                Toast.makeText(applicationContext, " system bar被隐藏", Toast.LENGTH_SHORT).show()            }        }    }}

Window 焦点改变的处理方式

当焦点发生改变的时候(dialog弹出或者一些其他动作),隐藏的system bar会重新出现。若是onCreate()执行隐藏的system bar的代码,按Home键退出,重新进入的时候,不会再走onCreate(),而最好的处理方式是在onResume()或者onWindowFocusChanged()进行隐藏。

    /**     * 当焦点占据时候,隐藏system bar.     */    override fun onWindowFocusChanged(hasFocus: Boolean) {            SystemUIManager.setStickyStyle(window)        super.onWindowFocusChanged(hasFocus)   }

一些特殊的手势处理:

通过GestureDetector来处理手势,当触摸屏幕:手指落下,且抬起,不滑动,会触发onSingleTapUp(),则进行判断SystemBar是否显示出来

   /**     * 手势处理类     */    lateinit var gestureDetector: GestureDetector    /**     * 添加手势处理     */    fun setGestureHandler() {        //创建一个 Gesture Detector来处理onTouch()中信息。        gestureDetector = GestureDetector(this.applicationContext,                            object : GestureDetector.SimpleOnGestureListener() {            override fun onSingleTapUp(e: MotionEvent): Boolean {               var visible= (window.decorView.systemUiVisibility                                  and View.SYSTEM_UI_FLAG_HIDE_NAVIGATION)==0                if (visible){//单击导致SystemBar可见,则进行隐藏                    showToast("onSingleTapUp响应: 触摸屏幕system bar 显示出来,进行再次隐藏")                    SystemUIManager.setStickyStyle(window)                }                return true            }        })        gestureDetector.setIsLongpressEnabled(false)    }

了解了一系列的System bar各种使用情况。

总结以下模式适合哪种类型的App:

  • 视频类型APP采用的模式:FullScreen+Hide_navigation

  • 阅读器类型App采用的模式: Immersive+fullScreen+Hide_Navigation

  • 游戏类型App采用的模式: Immersive_Sticky+FullScreen+Hide_Navigation


本项目案例:https://github.com/13767004362/ManageSystemUIDemo

参考资源

  • 官方介绍:https://developer.android.google.cn/training/system-ui/index.html

更多相关文章

  1. 隐藏菜单APP显示图标
  2. Android: Android(安卓)Touch事件处理
  3. Android(安卓)studio怎样隐藏标题栏
  4. ant编译android工程用批处理打包
  5. android 事件处理机制
  6. android 隐藏ListView滚动条
  7. android bitmap 处理
  8. Android事件处理
  9. Android横竖屏切换解决方案

随机推荐

  1. Android实现自动填充验证码
  2. Android修改主机名和IP地址问题
  3. Android(安卓)pulltorefresh上拉下拉刷新
  4. Android(安卓)开发最佳实践
  5. android 升级包制作
  6. Android系统架构分析 和 Android应用程序
  7. 我眼中的Qt for Android
  8. Android系统移植与调试之------->Android
  9. Android存储数据的三种方式
  10. Android(安卓)椭圆轨迹动画