zoukankan      html  css  js  c++  java
  • 自定义ViewGroup步骤,child.measure()方法,measureChild()方法,setmeasuredDimension()方法

    若在文中涉及到不清楚的知识点请看前面的文章

    自定义ViewGroup首先就要继承于ViewGroup:

    构造方法也是必须要实现的,

    自定义ViewGroup必须要实现的方法还有两个,onMeasure,onLayout方法

    在onMeasure方法对自控件进行测量,以确定父控件的大小,同时也可以在该方法中指定子控件的大小

    在onMeasure方法中确定了父控件的大小,也知道了子控件的大小,在onLayout方法中就只是对子控件进行布局

    1:child.measure(参数1,参数2)方法

    通过该方法来告知父视图子视图的大小与模式,

    参数1:由子视图的宽与模式组成

    参数2:由子视图的高与模式组成

    得到该参数的方式有两种

    (1):通过MeasureSpec.makeMeasureSpec(参数1.1,参数1.2)方法

    参数1.1是子视图的大小,这个大小要么是宽度,要么是高度,参数1.2是子视图的模式,模式又分为3种

    MeasureSpec.EXACTLY:表示精确的,比如我告诉你宽20,那就是20,和父容器一样宽,大小很明确

    MeasureSpec.AT_MOST:表示最大值,最大不能超过多少

    MeasureSpec.UNSPECIFIED:无限制

    val child = getChildAt(0)  //得到子视图
    val childWidth = parentWidth - 2*space //获取子视图的宽度
    val childHeight = parentHeight -2*space //获取子视图的高度
    val chidWidthSpec = MeasureSpec.makeMeasureSpec(childWidth,MeasureSpec.EXACTLY)
    val childHeightSpec = MeasureSpec.makeMeasureSpec(childHeight,MeasureSpec.EXACTLY)
    child.measure(chidWidthSpec,childHeightSpec)
     
    (2):通过getChildMeasureSpec(参数2.1,参数2.2,参数2.3)方法·,
    参数2.1:父容器宽度或高度的Spec,
    参数2.2:子视图与父容器两边间隙之和,
    参数2.3:子视图本身的大小
    val child = getChildAt(0)
    //获取控件的布局参数
    val lp = child.layoutParams //获取子视图的布局参数
    val childWidthSpec = getChildMeasureSpec(widthMeasureSpec,32,lp.width) //widthMeasureSpec父视图的宽度的spec,
    32是子视图与父视图两边的间距之和,lp.width是子视图的宽度
    val childHeightSpec = getChildMeasureSpec(heightMeasureSpec,32,lp.height)
    child.measure(childWidthSpec,childHeightSpec)
    (3):通过
    measureChild(child,widthMeasureSpec,heightMeasureSpec),
    child:第一个参数,对哪个子视图进行测量,
    后面两个分别是父视图的宽度和高度的spec,
    2:设置父容器的大小
    setMeasureDimension(w,h),
    w:是父视图的宽度
    h:是父视图的高度
    3:对子视图的布局
    child.Layout(左边,上边,右边,下边)
  • 相关阅读:
    nodejs
    httpClient closeableHttpClient
    re(正则表达式)模块
    ConfigParser模块
    random和string模块
    常用文件操作模块json,pickle、shelve和XML
    time和datetime模块
    os、sys和shutil模块
    内建函数
    生成器、迭代器、装饰器
  • 原文地址:https://www.cnblogs.com/luofangli/p/13885375.html
Copyright © 2011-2022 走看看