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. 监听android电话呼叫状态
  2. Android获取通话状态
  3. Android USB状态监控(解决scheme="file")
  4. Android - GridView,自定义开关控件,状态选择器selector,自定义对话
  5. Android如何使布局中图(ImageButton)和文字(TextView)同时获得press
  6. 《Android/OPhone开发完全讲义》连载(5):Notification与状态栏信息
  7. Android selector 状态选择器
  8. Android selector状态选择器的使用详解
  9. Android焦点分发基本流程

随机推荐

  1. Android之ORMLite实现数据持久化的简单使
  2. Android中的Selector 背景选择器
  3. [转]Android(安卓)NDK学习笔记
  4. (亲测有效)Android(安卓)SDK Manager国内
  5. Android流式布局实现
  6. Android坐标系
  7. Android(安卓)Launcher 分析
  8. Android中TextView属性
  9. Android平板上开发应用的一点心得——精
  10. android:padding和android:margin的区别