Android开发(24)——测量与布局:子控件和父容器尺寸都不确定,先测量子控件,再确定父容器尺寸

本节内容

1.测量单个子控件确定容器尺寸

一、测量单个子控件确定容器尺寸
1.先创建一个类,继承自ViewGroup,实现一个构造方法,并把onMeasre和onLayout方法写好。
class MyViewGroup:ViewGroup {
         constructor(context: Context, attrs: AttributeSet):super(context,attrs){}
      override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec)
      }
  override fun onLayout(changed: Boolean, l: Int, t: Int, r: Int, b: Int) {
  }
}
2.在xml中把前面的类写进去,并在里面添加一个Textview
 <com.example.unknowassociation.MyViewGroup
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"
       android:background="@color/colorOrange">
       <TextView
           android:layout_width="match_parent"
           android:layout_height="wrap_content"
           android:text="简书是一个创作社区,任何用户均可以在其上进行创作。用户在简书上面可以方便的创作自己的写作作品,互相交流。"
           android:textSize="20sp"
           android:background="@color/colorAccent"/>
   </com.example.unknowassociation.MyViewGroup>
3.在onMeasure方法里面,先定义两个变量来记录容器最终的尺寸
        var resultWidth =0
        var resultHeight = 0
4.获取子控件,并测量子控件
 val child = getChildAt(0)
 measureChild(child,widthMeasureSpec,heightMeasureSpec)
5.由于事先并不知道子控件是wrap_content,match_parent还是写死的,所以我们要先确定容器本身的尺寸和模式
        val parentWidthSize = MeasureSpec.getSize(widthMeasureSpec)
        val parentWidthMode = MeasureSpec.getMode(widthMeasureSpec)
6.先确定宽度,EXACTLY,AT_MOST还是unspecific
 when(parentWidthMode){
            MeasureSpec.EXACTLY ->  resultWidth = parentWidthSize
            MeasureSpec.AT_MOST ->  resultWidth = child.measuredWidth  +2*space
            else ->{
                resultWidth = parentWidthSize
            }
        }
7.接着确定高度,和前面一样
        val parentHeinghtSize = MeasureSpec.getSize(heightMeasureSpec)
        val parentHeightMode = MeasureSpec.getMode(heightMeasureSpec)
        when(parentHeightMode){
            MeasureSpec.EXACTLY ->  resultHeight = parentHeinghtSize
            MeasureSpec.AT_MOST ->  resultHeight = child.measuredHeight +2*space
            else ->{
                resultHeight = parentHeinghtSize
            }
        }
8.然后设置父容器尺寸
setMeasuredDimension(resultWidth,resultHeight)
9.最后在onLayout方法里面布局一下
override fun onLayout(changed: Boolean, l: Int, t: Int, r: Int, b: Int) {
        val child = getChildAt(0)
        var left =space
        var top= space
        var right=left+ child.measuredWidth
        var bottom=top+ child.measuredHeight
        child.layout(left,top,right,bottom)
    }
  • 为了方便修改文字,我们可以在strings.xml中添加一个属性
<string name="title">简书是一个创作社区,任何用户均可以在其上进行创作。
用户在简书上面可以方便的创作自己的写作作品,互相交流。</string>
  • 然后在.xml中把text设置为这个即可。
 android:text="@string/title"
  • 间距是很早就设置好的
 private val space = 30
最后运行一下,得到如下结果
一个控件
  • 结果发现,右边的间距好像消失了。因为我们测量的时候,使用的是measureChild方法,这个完全是依赖于父容器的,默认没有内间距。所以我们换一个方法来测量子控件。
10.通过 child.measure方法来测量子控件
        val lp = child.layoutParams
        val widthSpec = getChildMeasureSpec(widthMeasureSpec,2*space,lp.width)
        val heightSpec = getChildMeasureSpec(heightMeasureSpec,2*space,lp.height)
        child.measure(widthSpec,heightSpec)
这样右边就也会有间距了,写完之后运行程序得到如下结果。
修改之后
  • 当自己要额外去测量子控件的时候,就是用child.measure方法。一般时候都可以直接用measureChild方法。
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,496评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,407评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,632评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,180评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,198评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,165评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,052评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,910评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,324评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,542评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,711评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,424评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,017评论 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,668评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,823评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,722评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,611评论 2 353

推荐阅读更多精彩内容