前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >LinearLayout中resolveSizeAndState解析

LinearLayout中resolveSizeAndState解析

作者头像
None_Ling
发布2018-10-24 15:12:12
1.2K0
发布2018-10-24 15:12:12
举报
文章被收录于专栏:Android相关Android相关

resolveSizeAndState

resolveSizeAndState

  • 方法说明:

Utility to reconcile a desired size and state, with constraints imposed by a MeasureSpec. Will take the desired size, unless a different size is imposed by the constraints. The returned value is a compound integer, with the resolved size in the {@link #MEASURED_SIZE_MASK} bits and optionally the bit {@link #MEASURED_STATE_TOO_SMALL} set if the resulting size is smaller than the size the view wants to be. @param size How big the view wants to be @param measureSpec Constraints imposed by the parent @return Size information bit mask as defined by {@link #MEASURED_SIZE_MASK} and {@link #MEASURED_STATE_TOO_SMALL}.

一个计算期望大小和状态的工具方法,通过被强加的MeasureSpec来计算。除非有不同的大小限制,否则还是会使用期望的大小。返回的int值是一个合成值,通过MEASURED_SIZE_MASK来解析出size,并且使用可选的位MEASURE_STATE_TOO_SMALL来标识返回的结果大小比View期望的大小还要小。

代码语言:javascript
复制
public static int resolveSizeAndState(int size, int measureSpec, int childMeasuredState) {
    if (Build.VERSION.SDK_INT >= 11) {
        return View.resolveSizeAndState(size, measureSpec, childMeasuredState);
    }
    int result = size;
    int specMode = MeasureSpec.getMode(measureSpec);
    int specSize =  MeasureSpec.getSize(measureSpec);
    switch (specMode) {
    case MeasureSpec.UNSPECIFIED:
        result = size;
        break;
    case MeasureSpec.AT_MOST:
        if (specSize < size) {
            result = specSize | MEASURED_STATE_TOO_SMALL;
        } else {
            result = size;
        }
        break;
    case MeasureSpec.EXACTLY:
        result = specSize;
        break;
    }
    return result | (childMeasuredState&MEASURED_STATE_MASK);
}

参数size:View期望的大小 参数measureSpec:父View的measureSpec限制 返回:返回返回大小信息通过MEASURED_SIZE_MASK的掩码来获取,并且MEASURED_STATE_TOO_SMALL位来返回是否获取到的结果比期望的小

  1. 判断当前ROM版本是否大于11,如果大于11的话,则返回View.resolveSizeAndState,而View.resolveSizeAndState中的方法体和下述方法一致
  2. 如果ROM版本小于11的话,首先根据传入的MeasureSpec获取Size以及Mode
  3. 如果父View的MeasureSpec的Mode为MeasureSpec.UNSPECIFIED的话,那么size等于传入的size
  4. 如果父View的MeasureSpec的Mode为MeasureSpec.AT_MOST的话,那么就会判断父View的MeasureSpec中的size,是否比传入的size小,如果小的话,那么size等于specSize,并且加入MEASURE_STATE_TOO_SMALL标志位(result=specSize|MEASURE_STATE_TOO_SMALL),否则size等于传入的size
  5. 如果父View的MeasureSpec的Mode为MeasureSpec.EXACTLY的话,则size为specSize
  6. 返回的int值为size|(childMeasuredState&MEASURED_STATE_MASK)
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2016.05.19 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • resolveSizeAndState
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档