Android SystemBar 碎碎念_第1页
已阅读5页,还剩15页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、android systembar 碎碎念android systembar在android中向来饰演着十分重要的角色,google也向来在优化这一部分的用户体验,结合最近的工作体验碎碎念 rom 去掉navigationbar、systembar translucent支持、systembar setcolor支持几个小点。 rom 去掉navigationbar resgrep navigationbar相关的res,发觉在framework/base/core/res/res/config.xml中可以通过config_shownavigationbar配置,继续jgrep showna

2、vigationbar相关的java,发觉在phonewindowmanager中通过boolean变量mhasnavigationbar记录是否有navigationbar,详细代码如下: mhasnavigationbar = res.getboolean(ernal.r.bool.config_shownavigationbar); 需要注重的是mhasnavigationbar也可以通过系统提供的property来标识,详细代码如下: string navbaroverride = systemproperties.get("qemu.h

3、w.mainkeys"); if ("1".equals(navbaroverride) mhasnavigationbar = false; else if ("0".equals(navbaroverride) mhasnavigationbar = true; 在phonewindowmanager中存在一个类型为windowstate的变量mnavigationbar,windowstate是在phonewindowmanger prepareaddwindow时会用到的一个interface,认

4、真看看prepareaddwindowlw办法 switch (attrs.type) case type_navigation_bar: mcontext.enforcecallingorselfpermission(android.manifest.permission.status_bar_service, "phonewindowmanager"); if (mnavigationbar != null) if (mnavigationbar.isalive() return windowmanagerglobal.add_multiple_sing

5、leton; mnavigationbar = win; mnavigationbarcontroller.setwindow(win); if (debug_layout) slog.i(tag, "navigation bar: " + mnavigationbar); break; 推断type为type_navigation_bar的时候,给mnavigationbar赋值,并且mnavigationbarcontroller setwindow,mnavigationbarcontroller是一个用来操纵systembar window的类,有爱

6、好可以具体看看这个类,位于/framework/base/services/core/java/com/android/server/policy。继续扫瞄代码会发觉办法layoutnavigationbar,通过mnavigationbarcontroller对mnavigationbar举行layout。 在framework/base/packages/systemui中phonestatusbar中makestatusbarview有如下一段代码: try boolean shownav = mwindowmanagerservice.hasnavigationbar(); if (d

7、ebug) log.v(tag, "hasnavigationbar=" + shownav); if (shownav) createnavigationbarview(context); catch (remoteexception ex) / no window manager? good luck with that 按照windowmanagerservice中的hasnavigationbar办法推断是否有navigationbar,再看windowmangerservice中是调用了phonewindowmanager中的hasnavigati

8、onbar办法,终于返回的就是最开头提到了mhasnavigationbar这个标识。在phonestatusbar有具体讲到如何createandaddwindows,感爱好可以再进一步了解。 systembar translucent支持 android在api 19的时候添加了两个windowmanager.layoutparams,分离是flag_translucent_navigation、flag_translucent_status。 在官方文档中有提到当为window设置flag_translucent_navigation时,自动设置了system ui visibility

9、 system_ui_flag_layout_stable、system_ui_flag_layout_hide_navigation,当为window设置了flag_translucent_status时,自动设置了system ui visibility system_ui_flag_layout_stable、system_ui_flag_layout_fullscreen。 明显,这时system ui visibility有发生变幻,在phonewindowmanager中有如下一段代码: public int adjustsystemuivisibilitylw(int visib

10、ility) mstatusbarcontroller.adjustsystemuivisibilitylw(mlastsystemuiflags, visibility); mnavigationbarcontroller.adjustsystemuivisibilitylw(mlastsystemuiflags, visibility); mrecentsvisible = (visibility & view.recent_apps_visible) > 0; mtvpictureinpicturevisible = (visibility & vi

11、ew.tv_picture_in_picture_visible) > 0; / reset any bits in mforceclearingstatusbarvisibility that / are now clear. mresettingsystemuiflags &= visibility; / clear any bits in the new visibility that are currently being / force cleared, before reporting it. return visibility & &

12、mdash;—mresettingsystemuiflags & ——mforceclearedsystemuiflags; 可以看到前边提到的操控systembar的controller这个时候发挥了作用,调用了其adjustsystemuivisibilitylw,继续看barcontroller中相关代码 public void adjustsystemuivisibilitylw(int oldvis, int vis) if (mwin != null && mtransien

13、tbarstate = transient_bar_showing && (vis & mtransientflag) = 0) / sysui requests hide settransientbarstate(transient_bar_hiding); setbarshowinglw(false); else if (mwin != null && (oldvis & munhideflag) != 0 && (vis & munhidefla

14、 = 0) / sysui ready to unhide setbarshowinglw(true); 同时,看到barcontroller中有applytranslucentflaglw,通过查找其调用处,发觉依然是在phonewindowmanager中调用,以下是调用部分 / apply translucent bar vis flags windowstate fullscreentranswin = isstatusbarkeyguard() && !mhidelockscreen ? mstatusbar : mtopfullscreenopaqu

15、ewindowstate; vis = mstatusbarcontroller.applytranslucentflaglw(fullscreentranswin, vis, oldvs); vis = mnavigationbarcontroller.applytranslucentflaglw(fullscreentranswin, vis, oldvis); final int dockedvis = mstatusbarcontroller.applytranslucentflaglw(mtopdockedopaquewindowstate, 0, 0); final boolean

16、 fullscreendrawsstatusbarbackground = (drawssystembarbackground(mtopfullscreenopaquewindowstate) && (vis & view.status_bar_translucent) = 0) | forcesdrawstatusbarbackground(mtopfullscreenopaquewindowstate); final boolean dockeddrawsstatusbarbackground = (drawssystembarbackgro

17、und(mtopdockedopaquewindowstate) && (dockedvis & view.status_bar_translucent) = 0) | forcesdrawstatusbarbackground(mtopdockedopaquewindowstate); 可以看到在phonewindowmanager中通过updatesystembarslw举行了相应的更新systembars。这个地方还有一个比较故意思的问题是,在实际用法这两个flag的时候,会发觉app自动延长到statusbar和navigationbar

18、下方,这是为何? 猜测,应当是app区域对系统下发的windowinsets值做了处理,查看actionbaroverlaylayout onapplywindowinsets办法,可以发觉通过computefitsystemwindows对actionbaroverlaylayout的measure时用到的insets值做了处理,查看view的computefitsystemwindows办法 protected boolean computefitsystemwindows(rect inoutinsets, rect outlocalinsets) if (mviewflags &

19、;amp; optional_fits_system_windows) = 0 | mattachinfo = null | (mattachinfo.msystemuivisibility & system_ui_layout_flags) = 0 && !mattachinfo.moverscanrequested) outlocalinsets.set(inoutinsets); inoutinsets.set(0, 0, 0, 0); return true; else / the application wants to take ca

20、re of fitting system window for / the content. however we still need to take care of any overscan here. final rect overscan = mattachinfo.moverscaninsets; outlocalinsets.set(overscan); inoutinsets.left -= overscan.left; inoutinsets.top -= overscan.top; inoutinsets.right -= overscan.right; inoutinset

21、s.bottom -= overscan.bottom; return false; 可以发觉这个地方,按照flag的推断通过overscan rect对actionbaroverlaylayout的insets值举行了修改(最近把这个处理移植到api 19以下了,嘿嘿嘿)。固然google也没士气对这个处理一锅端,因此app可以用法fitssystemwindows属性来避开系统做这个处理,通过这个属性可以默认把insets值给到当前view的padding值,固然app也可以自己继承view的fitsystemwindows办法来自己处理insets。 systembar setcolor支持 android在api 21的时候为window添加了setnavigationba

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论