2

measurespec(measurespec怎么样)

MeasureSpec: 如何正确理解和使用?

随着移动互联网时代的到来,Android系统成为了全球最为流行的手机操作系统之一。而在Android开发中,MeasureSpec是一个非常重要的概念,它是控件测量的基础。本文将深入解析MeasureSpec,旨在帮助读者更好地理解和使用它。

1. 什么是MeasureSpec?

在Android中,每个控件都有自己的宽高属性,而在绘制前需要进行测量。这个过程就要用到MeasureSpec,MeasureSpec是一个32位的int类型,其中包含了两个主要信息:测量模式和测量大小。

2. 测量模式

MeasureSpec的第一位为两位二进制数,代表了测量模式。目前有三种测量模式:

① UNSPECIFIED:未指定模式,控件大小即为实际大小。

② EXACTLY:精确测量模式,控件大小即为指定大小。

③ AT_MOST:最大可用测量模式,控件大小为指定大小和可用空间的较小值。

3. 测量大小

除了测量模式,MeasureSpec的后30位表示的是控件的大小。对于 UNSPECIFIED 模式,大小是没有意义的;对于 EXACTLY 模式,大小是确定的;而对于 AT_MOST 模式,则表示可用的最大空间。

4. 如何使用MeasureSpec?

在开发中,我们会经常调用View的measure()方法进行测量。这个方法接收两个参数——parentWidthMeasureSpec和parentHeightMeasureSpec,分别表示控件的父容器的大小。根据View的测量模式和父容器剩余可用空间,测量出View的大小信息,并保存在View的mMeasuredWidth和mMeasuredHeight属性中。

5. 几个常见的测量场景

① 边距撑满父容器

假如我们需要设置一个View,使其能够自动调整大小,填满整个父容器,并且固定边距。我们需要的MeasureSpec应该是:

```

int parentWidthMeasureSpec = MeasureSpec.makeMeasureSpec(parentWidth, MeasureSpec.EXACTLY);

int width = parentWidth - leftMargin - rightMargin;

int childWidthMeasureSpec = MeasureSpec.makeMeasureSpec(width, MeasureSpec.EXACTLY);

```

这里的parentWidthMeasureSpec使用了EXACTLY模式,childWidthMeasureSpec也使用了EXACTLY模式,这样就可以保证控件大小和父容器大小一致。

② 固定宽度,按比例填充高度

假如我们需要一个View,宽度固定为parentWidth的三分之一,高度按照固定比例填充。我们需要的MeasureSpec应该是:

```

int parentWidthMeasureSpec = MeasureSpec.makeMeasureSpec(parentWidth, MeasureSpec.EXACTLY);

int width = parentWidth / 3;

int height = (int) (width * ratio);

int childHeightMeasureSpec = MeasureSpec.makeMeasureSpec(height, MeasureSpec.EXACTLY);

```

这里的height使用了EXACTLY模式,这样可以保证View的高度按照固定比例填充。

③ 可滚动的View

对于可滚动的View,我们需要使用AT_MOST模式。例如:

```

int parentWidthMeasureSpec = MeasureSpec.makeMeasureSpec(parentWidth, MeasureSpec.EXACTLY);

int width = parentWidth - leftMargin - rightMargin;

int childWidthMeasureSpec = MeasureSpec.makeMeasureSpec(width, MeasureSpec.EXACTLY);

int parentHeightMeasureSpec = MeasureSpec.makeMeasureSpec(parentHeight, MeasureSpec.EXACTLY);

int height = MeasureSpec.getSize(parentHeightMeasureSpec) - topMargin - bottomMargin;

int childHeightMeasureSpec = MeasureSpec.makeMeasureSpec(height, MeasureSpec.AT_MOST);

```

这里的childWidthMeasureSpec使用了EXACTLY模式,childHeightMeasureSpec使用了AT_MOST模式,这样就可以保证View的高度根据内容自适应,并且支持滚动操作。

6. 总结

作为Android开发中的基础概念,MeasureSpec的理解和掌握对于开发中控件的测量和布局至关重要。无论是简单或者是复杂的场景,合理的MeasureSpec使用可以帮助我们更好的实现UI效果,提高用户体验。希望通过本文,读者能够对MeasureSpec有一个更加深入的理解和掌握。

在Android开发中,我们经常需要在自定义View中测量它的大小。MeasureSpec在这个过程中扮演了非常重要的角色。那么MeasureSpec怎么样呢?本篇文章将会为您一一解答。

一. 什么是MeasureSpec?

MeasureSpec是Android中用于测量View尺寸的工具类,也就是说在对一个视图进行绘制(measure/layout),使用MeasureSpec可以得到该视图最终的尺寸。通常MeasureSpec用一个32位的int值表示。

二. MeasureSpec的组成

MeasureSpec由三个部分组成:Mode(模式)、Size(尺寸)和MeasureSpec值(int值)。其中,Mode和Size是不同的部分组成的一个二元组,如果用数字表示,在整个Measure的过程中,我们就可以使用下面的公式表示:

MeasureSpec = Mode + Size

下面我们分别介绍这三个部分:

1.Mode

Mode是MeasureSpec的模式,它指定了Size的计算模式,一共有三种模式:

- UNSPECIFIED:该模式表示一般情况下不会使用,View的大小不受限制

- EXACTLY:该模式表示View的大小是确定的,如设置成match_parent、指定具体值等。

- AT_MOST:该模式表示View的大小是有限制的,如设置成wrap_content等,尺寸不能超过父容器的大小

2.Size

MeasureSpec的Size指定了View的尺寸大小,在Mode为EXACTLY和AT_MOST时,往往是明确的值,只有在Mode为UNSPECIFIED时,Size才不重要。

3.MeasuredSpec值

MeasuredSpec值是最终使用的尺寸,是一个32位的int值。它是由Mode和Size合并后,使用位运算(shift + 左移运算)得到的32位二进制数。具体而言如下图:

Bit[31]: reserved for later use,保留位

Bit[30]: mode,模式

Bit[29:0]: size,尺寸

其中:mode只占1位,因此取值只能是0或1,对于尺寸size,只需要占29位便足够了。

例如:AT_MOST模式下,ParentView的总大小是1000px, 子View自身的尺寸是200px,那么背后的MeasuredSpec值就是这样算出来的:

int AT_MOST_Mode = 0x80000000;

int Size = 200;

MeasureSpec = (AT_MOST_Mode & Size) | ((1000 & ~AT_MOST_Mode) << 2);

三. MeasureSpec的作用

MeasureSpec在View绘制的过程中,主要有下面几个方面的作用:

1. 确定View的大小

当View的大小不是默认值时(wrap_content/match_parent),MeasureSpec需要确定它的确切大小,以适应当前的View。

2. 确定View的LayoutParams

它在测量时能够提供决策辅助,形成LayoutParams,LayoutParams可以用来描述一个View在父容器中的位置,包括宽度、高度、边距等等。

3. 确定View是否需要滑动

当View的大小超过了父控件的大小时,就需要使用MeasureSpec来判断该View是否能够滑动,例如ScrollView、RecyclerView等。

四. 如何测量View的大小?

Android中,View的测量是从View的父容器开始的,因此我们需要先获取Parent的MeasureSpec,它会告诉我们当前View的大小限制。接着我们将MeasureSpec给View,让View自己计算出自己的大小,需要执行以下测量方法:

@Override

protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {

super.onMeasure(widthMeasureSpec, heightMeasureSpec);

}

可以发现,onMeasure 方法中传递了两个参数,这就是MeasureSpec。在这个方法中任何修改任何尺寸值的调用都会是无效的,所以如果需要更改当前的View尺寸大小,就需要进行重写 onMeasure 方法的操作。

五. 总结

以上就是MeasureSpec的介绍、组成、作用和小白如何使用的全面分析,了解MeasureSpec有助于我们更好的理解Android布局、自定义View的尺寸确定。MeasureSpec虽然看起来非常抽象,但是理解它的意义能够帮助我们更好地布局在Android应用中展示的内容。

如果你对Android的布局还不是很熟悉,推荐一个网站供参考学习,它是一个专注于Android布局开发的百科网站,里面涵盖了大部分的Android布局的知识点。

本文来自网络,不代表本站立场。转载请注明出处: https://tj.jiuquan.cc/a-2375968/
1
上一篇大于等于(大于等于符号≥电脑上怎么打)
下一篇 streamwriter(streamwriter追加写入)

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: alzn66@foxmail.com

关注微信

微信扫一扫关注我们

返回顶部