直播平台软件开发,Android SystemUI 导航栏动态显示隐藏
直播平台软件开发,Android SystemUI 导航栏动态显示隐藏
1、导航栏创建加载及隐藏:
1 | <br> frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java<br> ...<br> try {<br> // boolean showNav = mWindowManagerService.hasNavigationBar();<br> // 添加自定义控制状态栏的 Settings.system 属性值,控制初始化时是否创建状态栏<br> boolean showNav = Settings.system.getInt(mContext.getContentResolver(), "nav_bar_mode", 0) == 0;<br> // 注册属性值变化监听<br> mContext.getContentResolver().registerContentObserver(<br> Settings.System.getUriFor("nav_bar_mode"), false, new SettingsObserver(mHandler), UserHandle.USER_ALL);<br> <br> if (DEBUG) Log.v(TAG, "hasNavigationBar=" + showNav);<br> if (showNav) {<br> createNavigationBar();<br> }<br> } catch (RemoteException ex) {<br> // no window manager? good luck with that<br> }<br> ...<br> <br> // 自定义 nav_bar_mode 属性值的监听<br> private final class SettingsObserver extends ContentObserver {<br> public SettingsObserver(Handler handler) {<br> super(handler);<br> }<br> <br> @Override<br> public void onChange(boolean selfChange, Uri uri) {<br> int navMode = Settings.Secure.getInt(mContext.getContentResolver(), "nav_bar_mode", 0);<br> Log.i("TAG", "navMode = " + navMode);<br> switch (navMode) {<br> case 0:<br> createNavigationBar();<br> break;<br> <br> case 1:<br> mContext.getSystemService(WindowManager.class).removeView(mNavigationBarView);<br> break;<br> <br> default:<br> Log.w(TAG, "Unknown mode");<br> break;<br> }<br> }<br> } |
这里主要了解导航栏的加载是由系统的 WindowManager 加载,通过addView进行加载显示,所以我们也可以通过 removeView 去进行删除隐藏。
2、加载 view 的源码:
1 | <br>frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarFragment.java<br> public static View create(Context context, FragmentListener listener) {<br> WindowManager.LayoutParams lp = new WindowManager.LayoutParams(<br> LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT,<br> WindowManager.LayoutParams.TYPE_NAVIGATION_BAR,<br> WindowManager.LayoutParams.FLAG_TOUCHABLE_WHEN_WAKING<br> | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE<br> | WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL<br> | WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH<br> | WindowManager.LayoutParams.FLAG_SPLIT_TOUCH<br> | WindowManager.LayoutParams.FLAG_SLIPPERY,<br> PixelFormat.TRANSLUCENT);<br> lp.token = new Binder();<br> lp.setTitle( "NavigationBar" );<br> lp.accessibilityTitle = context.getString(R.string.nav_bar);<br> lp.windowAnimations = 0;<br> View navigationBarView = LayoutInflater.from(context).inflate(<br> R.layout.navigation_bar_window, null);<br> if (DEBUG) Log.v(TAG, "addNavigationBar: about to add " + navigationBarView);<br> if (navigationBarView == null) return null;<br> context.getSystemService(WindowManager. class ).addView(navigationBarView, lp);<br> FragmentHostManager fragmentHost = FragmentHostManager.get(navigationBarView);<br> NavigationBarFragment fragment = new NavigationBarFragment();<br> fragmentHost.getFragmentManager().beginTransaction()<br> .replace(R.id.navigation_bar_frame, fragment, TAG)<br> .commit();<br> fragmentHost.addTagListener(TAG, listener);<br> return navigationBarView;<br> } |
以上就是 直播平台软件开发,Android SystemUI 导航栏动态显示隐藏,更多内容欢迎关注之后的文章
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
2022-09-15 直播平台开发,附带干扰线的随机验证码
2022-09-15 直播平台搭建,javascript轮播图示例
2022-09-15 app直播源代码,html网站使用js实现记住账号密码功能
2021-09-15 短视频app开发,实现一个朴实的Canvas时钟效果
2021-09-15 直播视频app源码,自定义可点击可滑动的通用RatingBar
2021-09-15 直播源码APP的最佳扫码插件,实现自定义视图