Android onmeasure 与 onLayout示例

一、viewgroup垂直滚动布局的设置——————————————————–
1、 onmeasure过程

@Override  
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec)  
{  
    super.onMeasure(widthMeasureSpec, heightMeasureSpec);  
    int count = getChildCount();  
    for (int i = 0; i < count; ++i)  
    {  
        View childView = getChildAt(i);  
        measureChild(childView, widthMeasureSpec,mScreenHeight);  
    }  
} 

—————————————————–
(java 架构师全套教程,共760G, 让你从零到架构师,每月轻松拿3万)
请先拍 购买地址, 下载请用百度盘
目录如下:
01.高级架构师四十二个阶段高
02.Java高级系统培训架构课程148课时
03.Java高级互联网架构师课程
04.Java互联网架构Netty、Nio、Mina等-视频教程
05.Java高级架构设计2016整理-视频教程
06.架构师基础、高级片
07.Java架构师必修linux运维系列课程
08.Java高级系统培训架构课程116课时
(送:hadoop系列教程,java设计模式与数据结构, Spring Cloud微服务, SpringBoot入门)
01高级架构师四十二个阶段高内容:
01高级架构师四十二个阶段高内容:
Android onmeasure 与 onLayout示例_第1张图片
Android onmeasure 与 onLayout示例_第2张图片
—————————————————–
2、onLayout过程

@Override  
protected void onLayout(boolean changed, int l, int t, int r, int b){  
    if (changed){  
        int childCount = getChildCount();  
        // 设置主布局的高度  
        MarginLayoutParams lp = (MarginLayoutParams) getLayoutParams();  
        lp.height = mScreenHeight * childCount;  
        setLayoutParams(lp);  

        for (int i = 0; i < childCount; i++){  
            View child = getChildAt(i);  
            if (child.getVisibility() != View.GONE){  
                child.layout(l, i * mScreenHeight, r, (i + 1) * mScreenHeight);// 调用每个自布局的layout  
            }  
        }  
    }  
}  

二、viewgroup左右切换的滚动布局的设置——————————————————–
1、measure过程

@Override  
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {  

    Log.i(TAG, "--- start onMeasure --");  

    // 设置该ViewGroup的大小  
    int width = MeasureSpec.getSize(widthMeasureSpec);  
    int height = MeasureSpec.getSize(heightMeasureSpec);  
    setMeasuredDimension(width, height);  

    int childCount = getChildCount();  
    Log.i(TAG, "--- onMeasure childCount is -->" + childCount);  
    for (int i = 0; i < childCount; i++) {  
        View child = getChildAt(i);  
        // 设置每个子视图的大小 , 即全屏  
        child.measure(MultiScreenActivity.screenWidth, MultiScreenActivity.scrrenHeight);  
    }  
}  

2、layout过程

 // layout过程  
    @Override  
    protected void onLayout(boolean changed, int l, int t, int r, int b) {  
        // TODO Auto-generated method stub  
        Log.i(TAG, "--- start onLayout --");  
        int startLeft = 0; // 每个子视图的起始布局坐标  
        int startTop = 10; // 间距设置为10px 相当于 android:marginTop= "10px"  
        int childCount = getChildCount();  
        Log.i(TAG, "--- onLayout childCount is -->" + childCount);  
        for (int i = 0; i < childCount; i++) {  
            View child = getChildAt(i);  
            child.layout(startLeft, startTop,   
                    startLeft + MultiScreenActivity.screenWidth,   
                    startTop + MultiScreenActivity.scrrenHeight);  
            startLeft = startLeft + MultiScreenActivity.screenWidth ; //校准每个子View的起始布局位置  
            //三个子视图的在屏幕中的分布如下 [0 , 320] / [320,640] / [640,960]  
        }  
    }  

}  

三、圆形图片

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    /**
     * 如果类型是圆形,则强制改变view的宽高一致,以小值为准
     */
    if (mType == TYPE_CIRCLE) {
        mWidth = Math.min(getMeasuredWidth(), getMeasuredHeight());
        mRadius = mWidth / 2;
        // measure(mWidth, mWidth);
        setMeasuredDimension(mWidth, mWidth);
    }
    super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}

@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
    if (mType == TYPE_ROUND) {
        // 圆角图片的范围
        mRoundRect = new RectF(0, 0, getWidth(), getHeight());
    }
    super.onSizeChanged(w, h, oldw, oldh);
}

四、view变化的文本设置——————————————————–

@Override  
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec)  
{  
    int width = measureWidth(widthMeasureSpec);  
    int height = measureHeight(heightMeasureSpec);  
    setMeasuredDimension(width, height);  

    mRealWidth = getMeasuredWidth() - getPaddingLeft() - getPaddingRight();  
    mTextStartX = mRealWidth / 2 - mTextWidth / 2;  

}  

private int measureHeight(int measureSpec)  
{  
    int mode = MeasureSpec.getMode(measureSpec);  
    int val = MeasureSpec.getSize(measureSpec);  
    int result = 0;  
    switch (mode)  
    {  
    case MeasureSpec.EXACTLY:  
        result = val;  
        break;  
    case MeasureSpec.AT_MOST:  
    case MeasureSpec.UNSPECIFIED:  
        result = mTextBound.height();  
        break;  
    }  
    result = mode == MeasureSpec.AT_MOST ? Math.min(result, val) : result;  
    return result + getPaddingTop() + getPaddingBottom();  
}  

private int measureWidth(int measureSpec)  
{  
    int mode = MeasureSpec.getMode(measureSpec);  
    int val = MeasureSpec.getSize(measureSpec);  
    int result = 0;  
    switch (mode)  
    {  
    case MeasureSpec.EXACTLY:  
        result = val;  
        break;  
    case MeasureSpec.AT_MOST:  
    case MeasureSpec.UNSPECIFIED:  
        // result = mTextBound.width();  
        result = mTextWidth;  
        break;  
    }  
    result = mode == MeasureSpec.AT_MOST ? Math.min(result, val) : result;  
    return result + getPaddingLeft() + getPaddingRight();  
}  

private void measureText()  
{  
    mTextWidth = (int) mPaint.measureText(mText);  
    mPaint.getTextBounds(mText, 0, mText.length(), mTextBound);  
}  

你可能感兴趣的:(anroid-属性与方法,Android-总结)