在Android中,视图何时知道自己的大小?(宽度和高度)

在Android中,视图何时知道自己的大小?(宽度和高度),android,view,Android,View,我对所有被调用的方法都感到困惑,而且因为到处都没有视图生命周期描述,我想知道Android视图何时知道它的确切大小,以便它可以告诉观察者? 也许“仅布局”或“仅测量”的方法很有用,但我正在寻找实现这一点的最佳方法。 谢谢 视图只有在屏幕上绘制后才知道自己的大小。要在绘制值后获取这些值,可以使用如下类似的OnGlobalLayoutListener: <yourView>.getViewTreeObserver().addOnGlobalLayoutListener( new

我对所有被调用的方法都感到困惑,而且因为到处都没有视图生命周期描述,我想知道Android视图何时知道它的确切大小,以便它可以告诉观察者? 也许“仅布局”或“仅测量”的方法很有用,但我正在寻找实现这一点的最佳方法。
谢谢

视图只有在屏幕上绘制后才知道自己的大小。要在绘制值后获取这些值,可以使用如下类似的
OnGlobalLayoutListener

<yourView>.getViewTreeObserver().addOnGlobalLayoutListener(
    new ViewTreeObserver.OnGlobalLayoutListener() {
        @Override
        public void onGlobalLayout() {
            //getWidth() and getHeight() now have values
            //you can remove this layout listener too if you don't need it anymore
        }
    }
);
.getViewTreeObserver().addOnGlobalLayoutListener(
新建ViewTreeObserver.OnGlobalLayoutListener(){
@凌驾
公共图书馆{
//getWidth()和getHeight()现在具有值
//如果不再需要,也可以删除此布局侦听器
}
}
);

视图只有在屏幕上绘制后才知道自己的大小。要在绘制值后获取这些值,可以使用如下类似的
OnGlobalLayoutListener

<yourView>.getViewTreeObserver().addOnGlobalLayoutListener(
    new ViewTreeObserver.OnGlobalLayoutListener() {
        @Override
        public void onGlobalLayout() {
            //getWidth() and getHeight() now have values
            //you can remove this layout listener too if you don't need it anymore
        }
    }
);
.getViewTreeObserver().addOnGlobalLayoutListener(
新建ViewTreeObserver.OnGlobalLayoutListener(){
@凌驾
公共图书馆{
//getWidth()和getHeight()现在具有值
//如果不再需要,也可以删除此布局侦听器
}
}
);

是的,您的猜测是正确的-
onMeasure()。顺便说一下,根据布局的复杂性,
onMeasure()
可能会被多次调用

引自Jason Ostrender的“Android UI基础开发与设计”

系统调用onMeasure方法来确定 视图及其子对象。它传递了两个整数,实际上是 测量方面。MeasureSpec只是模式标志和 整数值。它被实现为一个整数以减少 不需要的对象分配。模式告诉视图它应该如何操作 计算它的大小。以下是可能的模式:

未指明。父视图未对此视图设置任何约束; 它可以是它想要的任何尺寸。
至多。视图的大小可以任意减小 大于或等于度量值大小。
确切地景色会很美 无论它要求什么,都精确地指定MeasureSpec大小

创建自定义视图并重写onMeasure方法时,它是 你的工作是正确处理每一个这样的案件。此外, 度量契约要求调用设置的度量维度 方法使用确定的整数大小值。如果你做不到 这样,将抛出一个IllegalStateException

所以,父视图告诉子视图他必须遵守的一些约束,子视图根据这些信息计算自己的大小


如果您想了解如何正确使用
onMeasure()
的示例,可以查看以下内容。不久前,我在自定义视图中玩过,这是我的一个实验-简单的形状视图,正方形或圆形。

是的,你的猜测是正确的-
onMeasure()
这是视图第一次告知它的尺寸。顺便说一下,根据布局的复杂性,
onMeasure()
可能会被多次调用

引自Jason Ostrender的“Android UI基础开发与设计”

系统调用onMeasure方法来确定 视图及其子对象。它传递了两个整数,实际上是 测量方面。MeasureSpec只是模式标志和 整数值。它被实现为一个整数以减少 不需要的对象分配。模式告诉视图它应该如何操作 计算它的大小。以下是可能的模式:

未指明。父视图未对此视图设置任何约束; 它可以是它想要的任何尺寸。
至多。视图的大小可以任意减小 大于或等于度量值大小。
确切地景色会很美 无论它要求什么,都精确地指定MeasureSpec大小

创建自定义视图并重写onMeasure方法时,它是 你的工作是正确处理每一个这样的案件。此外, 度量契约要求调用设置的度量维度 方法使用确定的整数大小值。如果你做不到 这样,将抛出一个IllegalStateException

所以,父视图告诉子视图他必须遵守的一些约束,子视图根据这些信息计算自己的大小

如果您想了解如何正确使用
onMeasure()
的示例,可以查看以下内容。我以前玩过自定义视图,这是我的一个实验-简单形状视图,正方形或圆形