override onMeasure()

来源:互联网 发布:pr软件图标 编辑:程序博客网 时间:2024/06/03 23:17
// widthMeasureSpec是一个int值,前两位代表模式,后面30位代表数值,有三种mode:// EXACTLY: 当layout_width = 100dp 或 layout_width = match_parent时// AT_MOST:当layout_width = wrap_content时// UNSPECIFIED:一般自定义的时候才会用,要多大有多大// 如果不override的话,默认是按EXACTLY模式来处理的, 看如下代码:// public static int getDefaultSize(int size, int measureSpec) {//    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://    case MeasureSpec.EXACTLY://        result = specSize;//        break;//    }//    return result;// }// an example@Overrideprotected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {     // 一定要用setMeasureDimension     setMeasureDimension(measureWidth(widthMeasureSpec), measureHeight(heightMeasureSpec));}// 这里才是处理mode的关键,默认的getDefaultSize()统统处理成EXACTLY模式private int measureWidth(int measureSpec) {     int result = 0;     int specMode = MeasureSpec.getMode(measureSpec);     int specSize = MeasureSpec.getSize(measureSpec);     if(specMode == MeasureSpec.EXACTLY) {          // set width 20 px wider         result = MeasureSpec.makeMeasureSpec(specSize + 20, MeasureSpec.EXACTLY);     }     else {         result = 200;//要控制不要超过parent的大小          if(specMode == MeasureSpec.AT_MOST) {]              int size = Math.min(result, specSize);               result = MeasureSpec.makeMeasureSpec(size, MeasureSpec.AT_MOST);          }      }     return result;}

0 0
原创粉丝点击