zoukankan      html  css  js  c++  java
  • android的View

      1、android的界面使用组合模式实现。

        -ViewGroup
            --ViewGroup
            --VieW

      2、View绘制主要包括三个步骤:

        测量(Measure)   :计算View的mMeasuredXXX(即View出现在界面上的宽高)
        布局(Layout)   :计算View的绘制的位置
        绘制(Draw) :使用前面两步的结果,将View以特定大小,绘制在特定的位置。

      3、测量:

        1)测量的最终目的是依据View的相关属性、View与父容器的关系、父容器的相关属性,计算View的高度和宽度。

        2)我们可以重写onMeasure方法来编码自己的View测量代码——计算出View的高度和宽度,使用setMeasuredDimension方法,赋值给mMeasuredXXX相关变量。

        3)我们进行测量计算,View的相关属性可以自己直接获取,而需要的父容器的一些信息和与父容器关系的信息,就需要引入MeasureSpec包含父容器的信息,然后传入onMeasure函数。

        4)MeasureSpec包含两个信息:

          a)MeasureSpec的模式,exactly(精确模式,即父容器给View的宽高设定了确定的数值),AT_MOST(范围,即父容器给View的宽高设定了一个范围),UNSPECIFIED(无限制,父容器没有给子容器限制。

          b)MeasureSpec传递的宽高值。

        5)View计算宽高除了MeasureSpec的信息外,会用到View自身的minHeight、minWidth和背景图片的大小等,大多数的View子类会使用不同的其他属性。

        6)ViewGroup子类测量的是时候,一般会获取计算获取所有子元素的尺寸,然后依据自身的布局规则,计算自己的尺寸。如FrameLayou可能t获取的是子元素中最大的,LinearLayout可能是子元素的累加值。

      4、布局(Layout):

        1) 我们调用View的layout函数,内部会调用setFrame(l,t,r,b)直接确定了View在父容器中的四个方向上的距离值——mRight - mLeft, mBottom - mTop。所以虽然我们实现的时候,会使用前面计算的View的宽高值,来确定l,t,r,b这四个值,但是View最终绘制时,只是使用这里传入值,如果我们这里修改了,View的宽高会和计算的宽高不同,也就是(getWidth和getMeasuredWidth)获取的值不同了。

      5、绘制(Draw):

        绘制的位置和范围确定了,然后就是绘制内容。

        通过重写onDraw函数实现对View的绘制,绘制的具体内容和View本身有关。

  • 相关阅读:
    公号文章模板
    css 网格线
    刷题笔记-图-图的存储
    PAT Advanced A1021 Deepest Root (25) [图的遍历,DFS,计算连通分量的个数,BFS,并查集]
    PAT Advanced 1013 Battle Over Cities (25) [图的遍历,统计连通分量的个数,DFS,BFS,并查集]
    PAT Advanced 1076 Forwards on Weibo (30) [图的遍历,BFS,DFS]
    PAT Advanced 1034 Head of a Gang (30) [图的遍历,BFS,DFS,并查集]
    堆排序
    PAT Advanced 1155 Heap Paths (30) [DFS, 深搜回溯,堆]
    PAT Advanced 1098 Insertion or Heap Sort (25) [heap sort(堆排序)]
  • 原文地址:https://www.cnblogs.com/z964166725/p/8727314.html
Copyright © 2011-2022 走看看