Android-UI(一)

2021-04-22  本文已影响0人  森屿暖茶

View:单一视图

ViewGourp:多个View组成的视图组

view和viewGourp的关系

View的生命周期

自定义View

自定义View最基本的三个方法:onMeasure()、onLayout()、onDraw()

onMeasure():测量View的大小

onLayout():确定View的位置

onDraw():View开始绘制

自定义View:只需要重写onMeasure和onDraw()

自定义ViewGroup:只需要重写onMeasure和onLayout()

View的构造函数

AttributeSet

在XML如

这些属性可以在XML中使用

Android View的视图结构

PhoneWindow:Android系统中最基本的窗口系统,继承自Windows类,负责管理界面显示以及事件响应。它

是Activity与View系统交互的接口。

DecorView:PhoneWindow中的起始节点View,继承于View类,作为整个视图容器来使用。用于设置窗口属

性。它本质上是一个FrameLayout。我们看到的View就是绘制在DecorView层内的。

ViewRoot

view树的绘制流程是通过ViewRoot去负责绘制的,负责将DecorView和PhoneWindow“组合”起来,View树的根节点严格意义上来说只有DecorView;每个DecorView都有一个ViewRoot与之关联,这种关联关系是由WindowManager去进行管理的。

LayoutParams

LayoutPrams就是布局参数,子View通过LayoutParams告诉父容器(ViewGroup)应该如何放置自己。每个ViewGroup的子类都有自己对应的LayoutParams类,如LinearLayout.LayoutParams和FrameLayout.LayoutParams等,LayoutParams都是对应ViewGroup子类的内部类。

MarginLayoutParams

MarginLayoutParams是和外间距有关的。事实也确实如此,和LayoutParams相比,MarginLayoutParams只是增

加了对上下左右外间距的支持。实际上大部分LayoutParams的实现类都是继承自MarginLayoutParams,因为基本

所有的父容器都是支持子View设置外间距的。

常见的LayoutParams子类

ViewGroup.MarginLayoutParams

FrameLayout.LayoutParams

LinearLayout.LayoutParams

RelativeLayout.LayoutParams

RecyclerView.LayoutParams

GridLayoutManager.LayoutParams

StaggeredGridLayoutManager.LayoutParams

ViewPager.LayoutParams

WindowManager.LayoutParam

MeasureSpec

测量规格,Android View 的测量过程中使用到了MeasureSpec。MeasureSpec由俩部分组成,一部分是SpecMode(测量模式),另一部分是SpecSize(规格大小)。View的MeasureSpec由父容器和自己布局参数共同决定。

规则总汇

childLayoutParams:就是子view设置的宽高属性,我们比较常见。

parentSpecMode:有3种状态

UNSPECIFIED :父控件不对你有任何限制,你想要多大给你多大,想上天就上天。这种情况一般用于系统内部,表示一种测量状态。(这个模式主要用于系统内部多次Measure的情形,并不是真的说你想要多大最后就真有多大)

EXACTLY :父控件已经知道你所需的精确大小,你的最终大小应该就是这么大。

AT_MOST: 你的大小不能大于父控件给你指定的size,但具体是多少,得看你自己的实现。

MeasureSpec总结:

MeasureSpecs 的意义:通过将 SpecMode 和 SpecSize 打包成一个 int 值可以避免过多的对象内存分配,为了方便操作,其提供了打包 / 解包方法。    

对于应用层 View ,其 MeasureSpec 由父容器的 MeasureSpec 和自身的 LayoutParams 来共同决定

对于不同的父容器和view本身不同的LayoutParams,view就可以有多种MeasureSpec。 

1. 当view采用固定宽高的时候,不管父容器的MeasureSpec是什么,view的MeasureSpec都是精确模式并且其大小遵循

Layoutparams中的大小;

 2. 当view的宽高是match_parent时,这个时候如果父容器的模式是精准模式,那么view也是精准模式并且其大小是父容器的剩余空间,如果父容器是最大模式,那么view也是最大模式并且其大小不会超过父容器的剩余空间; 

3. 当view的宽高是wrap_content时,不管父容器的模式是精准还是最大化,view的模式总是最大化并且大小不能超过父容器的剩余空间。

 4. Unspecified模式,这个模式主要用于系统内部多次measure的情况下,一般来说,我们不需要关注此模式(这里注意自定义View放到ScrollView的情况 需要处理)。

view的测量到确定布局

getMeasureWidth与getWidth的区别

getMeasuredWidth:在measure()过程结束后就可以获取到对应的值;通过setMeasuredDimension()方法来进行设置的。

getWidth:在layout()过程结束后才能获取到;通过视图右边的坐标减去左边的坐标计算出来的。

上一篇下一篇

猜你喜欢

热点阅读