Android SystemBar各种风格案例:
响应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
参考资源: