美文网首页
自定义View

自定义View

作者: 最黑暗的自己 | 来源:发表于2018-07-02 15:41 被阅读9次
    一、自定义View步骤
    
    1、自定义View的属性
    2、在View的构造方法中获得我们的自定义属性
    3、重写OnMeasure
    4、重写OnDraw
    
    二、自定义View某些问题
    1、为什么自定义View 中设置的wrap_content属性不起作用(与match_parent相同作用)?
       在View的onmeasure方法中
    setMeasuredDimension(getDefaultSize(getSuggestedMinimumWidth(), widthMeasureSpec),  
               getDefaultSize(getSuggestedMinimumHeight(), heightMeasureSpec));  
    }
    (1)、getDefaultSize//根据View宽/高的测量规格计算View的宽/高值。
    当View的测量模式是AT_MOST或EXACTLY时,View的大小都会被设置成子View MeasureSpec的specSize,所以wrap_content和match_content会起到相同的作用。
    (2)、子View MeasureSpec的specSize的值是多少?
    ,子View的MeasureSpec值是根据子View的布局参数(LayoutParams)和父容器的MeasureSpec值计算得来,具体计算逻辑封装在getChildMeasureSpec()里。
    
    https://www.jianshu.com/p/85548a440cd2(普通View的MeasureSpec创建规则)
    
    
    
    
    所以specSize的值为父控件当前剩余控件大小=match_content
    
    2、textview
    
    - 如果TextView的高度和宽度都是定尺寸,那么不管setText传入的什么内容,都不会重新布局,因为尺寸定死了。 
    - 如果TextView的宽度是定尺寸,而高度是wrap_content,那么如果在setText重新设置内容之前,高度是两行高度,那么当重新设置的内容如果高于两行或者低于两行,都应该重新布局的,这时会要求父布局重新布局。 
    - 如果TextView的宽度wrap_content,高度是定尺寸,那么一旦宽度发生变化,就会要求父布局重新布局。
    
    如果父View重新布局会measureChild,子View重新onMeasure。
    
    3、RelativeLayout onMeasure次数:
    RelativeLayout会对子View做两次measure(理论上执行3次)/ (实际上次是4次),View在显示的时候会经历两次OnMeasure(ViewRootImpl类中-->performTraversals()方法调用两次)。
    https://blog.csdn.net/wz249863091/article/details/51757069(RelativeLayout源码解析)
    https://www.jianshu.com/p/733c7e9fb284(View为什么会至少进行2次onMeasure、onLayout)
    
    
    
    
    4、LinearLayout不一定只OnMeasure一次,跟weight有关。
    https://www.jianshu.com/p/0ca9ce789e39(LinearLayout的measure次数)
    https://blog.csdn.net/sun20209527/article/details/51554124(LinearLayout 源码分析)!
    
    
    
    LinearLayout OnMeasure.png 普通View的MeasureSpec创建规则.png

    相关文章

      网友评论

          本文标题:自定义View

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