View 的测量

作者: 异想天开的骑士 | 来源:发表于2018-08-22 16:35 被阅读3次

重写 onMeasure 方法

在对 View 进行测量时,要在 onMeasure 方法中使用 setMeasuredDimension 设置测量后的结果。 setMeasuredDimension 方法需要传入两个参数,即测量后的宽和高。下面就来看看如何对宽高进行测量。

onMeasure 方法中有两个参数,分别为父 View 对子 View 宽高的限制。我们在进行测量时需要根据这两个参数取出测量模式和实际大小,我们以宽度为例

int widthMode = MeasureSpec.getMode(widthMeasureSpec);
int widthSize = MeasureSpec.getSize(widthMeasureSpec);

三种测量模式

  • EXACTLY:精确值模式。对应布局文件中的 match_parent 或者具体的数值。
  • AT_MOST:最大值模式。对应布局文件中的 wrap_content
  • UNSPECIFIED:无限制模式。很少用到。

具体测量

假设我们指定 View 的宽高为300px,则可进行如下测量

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

/**
 * 测量宽度
 * @param width
 * @param widthMeasureSpec
 * @return
 */
public int measureWidth(int width, int widthMeasureSpec) {
    int widthResult;
    int widthMode = MeasureSpec.getMode(widthMeasureSpec);
    int widthSize = MeasureSpec.getSize(widthMeasureSpec);
    switch (widthMode) {
        case MeasureSpec.EXACTLY:
            widthResult = widthSize;
            break;
        case MeasureSpec.AT_MOST:
            if (widthSize < width) {
                widthResult = widthSize;
            } else {
                widthResult = width;
            }
            break;
        default:
            widthResult = width;
            break;
    }
    return widthResult;
}

当为 EXACTLY 模式时,最终测量结果为父 View 所限制的宽度。
当为 AT_MOST 模式时,最终测量结果为父 View 所限制的宽度与所定义尺寸的最小值。

效果

 <com.chrongliu.customviewsample.MeasureView
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/colorAccent"/>
match_parent.png
<com.chrongliu.customviewsample.MeasureView
    android:layout_width="50dp"
    android:layout_height="50dp"
    android:background="@color/colorAccent"/>
50dp.png
<com.chrongliu.customviewsample.MeasureView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:background="@color/colorAccent"/>
wrap_content.png

相关文章

  • 安卓自定义view(二) - 测量

    view的测量过程 之所以先讲view的测量过程,是因为ViewGroup测量的时候是先把他的所有子view测量完...

  • Android-View的测量

    Android View的测量 在绘制View之前,要对整个View进行测量,这个过程就在onMeasure()方...

  • Android通过View生成Bitmap

    已测量过的View生成Bitmap 即经过测量、布局、绘制并显示在界面上的View,此类View无需再次进行测量和...

  • Android自定义View笔记

    View的测量: View测量模式有三种:EXACTLY,AT_MOST,UNSPECIFIED。一般测量都在on...

  • 自定义view

    测量,赋值,绘制 测量:父view调用子view的onMeasure()方法,首先看子view是一个view还是v...

  • View测量流程

    View测量流程简介 ViewGroup继承自View,在View的测量方法measure方法中,调用了onMea...

  • android基础-view的测量,布局,绘制

    知识点 view的测量 view的布局 view的绘制 android中的view显示方式主要就是测量出大小→决定...

  • View的测量、布局和绘制过程中父View(当前View)和子V

    View的测量、布局和绘制过程中父View(当前View)和子View的先后顺序 View的测量、布局和绘制过程中...

  • Android view架构

    view测量与绘制 view的测量MeasureSpec:定义:由SpecMode(int)于SpecSize(i...

  • 第八单元

    一、View绘制流程 1、流程 measure:确定View的测量宽高 layout:根据测量的宽高确定View在...

网友评论

    本文标题:View 的测量

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