美文网首页
Android-UI(一)

Android-UI(一)

作者: 森屿暖茶 | 来源:发表于2021-04-22 15:21 被阅读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()过程结束后才能获取到;通过视图右边的坐标减去左边的坐标计算出来的。

    相关文章

      网友评论

          本文标题:Android-UI(一)

          本文链接:https://www.haomeiwen.com/subject/ffualltx.html