override onMeasure()

    xiaoxiao2021-03-25  94

    // 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 @Override protected 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; }
    转载请注明原文地址: https://ju.6miu.com/read-16687.html

    最新回复(0)