关于安卓一个可见界面的视图分层,文章很多,但是看得时候总是有点云里雾里。


记录下,自己的总结:




我想到要研究视图层的时候,是在项目中用到沉浸式状态栏的时候。当时,主观的认为,状态栏存在于activity的视图层中,但是,其实不然,状态栏不包括在activity视图层中。




打开我们的安卓手机,看到的是我们的手机界面,整体看做三部分或者两部分(部分手机navigationbar是默认隐藏的)




从上而下分为:statusbar——>activity——>navigationbar




Android 状态栏的位置也显示图片内容 安卓手机状态栏在哪里_acticity视图层





应用:


一:沉浸式状态来


而我们实现沉浸式状态栏的时候,就是控制的statusbar和activity之间的位置关系(4.4让statusbar覆盖到acticity上,5.0以上可以直接设置statusbar颜色或者覆盖到acticity上面)




5.0的设置statusbar颜色的方式,使用有局限性,只能设置颜色。要是需要实现,一些图片类背景沉浸到状态栏就做不到了,此时还是


需要改变statusbar和activity的相对关系。


So,统一的做法,改变statusbar和activity的相对关系,使statusbar覆盖到aciticty上,让activity要显示文字的内容,距离上边距statusbar的高度即可,这里只是说思路,具体怎么实现覆盖,请自行百度就行啦,文章多的是。




二:顶层动画(在某些电商app里面,点击商品添加到购物车,商品图片会有移动动画,移动到购物车图标然后消失)




这里就用到了activity的视图层构成结构,简单描述下:




从上而下分为:Activity——>PhoneWindow——>DecorView——>TitleView——>ContentView




每个activity都包含一个window对象,在android中window由phonewindow来实现,phonewindow将decoview设置为整个应用窗口的


根view。decoview是一个FrameLayout,其内部包含字viewGroup。


例如:


Decoview—>LinearLayout—>titlebar+contentView




如上面,通常装载了一个linearlayout,contentView为我们在onCreate中设置的contentView,titlebar为系统自带的title。如果用户设置了requstWindowFeature来隐藏title实现全屏,这时候就只剩下contentview,这也就解释了为什么设置requestwidowfeature要在setContent之前设置才能生效的原因。




使用:通常,要实现一个通用的,能适应所有界面的上述动画,在decoview层去实现即可。




以上,都是文字说明,具体实现没有再往上写,实现网上很多,但原理基本都是差不多的。