android中各种height和width总结

article/2025/10/7 5:16:02

1. getMeasuredWidth()和getWidth()

以这两个为例,高度与其相同。这两个是在自定义View中最常见到的,通过字面意思可以看出,前者是测量的宽度,后者是控件的实际宽度,下面看下官方文档对他们的描述:

//Return the width of the your view.public final int getWidth()
/**
The width of this view as measured in the most recent call to measure().
This should be used during measurement and layout calculations only. Use getWidth() to see how wide a view is after layout.
*/public final int getMeasuredWidth()

The first pair is known as measured width and measured height. These dimensions define how big a view wants to be within its parent (see Layout for more details.) The measured dimensions can be obtained by calling getMeasuredWidth() and getMeasuredHeight().

The second pair is simply known as width and height, or sometimes drawing width and drawing height. These dimensions define the actual size of the view on screen, at drawing time and after layout. These values may, but do not have to, be different from the measured width and height. The width and height can be obtained by calling getWidth() and getHeight().

看不懂的可以自行百度,主要就是说getMeasuredWidth()的值,是在最近声明的measure()方法后获得的,它定义了一个View想在parent中获得的空间大小,换句话说就是它原本的大小,并且建议只能在measurelayout的循环中使用。

getWidth()返回的是view在屏幕上显示的最终(实际)大小,建议在layout之后调用此方法获取一个view的宽度,并且它的值可能会与getMeasuredWidth()的测量值不同,但是在绝大部分情况下(不在layout中做无意义的改动)它们两个的值是相同的。


我看网上很多文章说在控件全部可见的时候,getMeasuredWidth()getWidth()返回值是相同的,这个基本算是正确,但是他们说在控件部分不可见的时候,getMeasuredWidth()返回值是控件原本的大小,而getWidth()返回的是可见区域的大小,这就有失公允了,下面看个例子:

我在布局文件中定义了一个Button,在Activity中的onWindowFocusChanged()获取Button的测量宽度和最终宽度,代码如下:

    //这里用的是dp,实际获得的是当前屏幕分辨率的px值<Buttonandroid:id="@+id/button"android:layout_width="100dp" android:layout_height="50dp"android:gravity="center"android:text="button" />
public class MainActivity extends AppCompatActivity {public static final String TAG = "MainActivity";Button button;private boolean isFocus = false;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);button = findViewById(R.id.button);}@Overridepublic void onWindowFocusChanged(boolean hasFocus) {super.onWindowFocusChanged(hasFocus);if (!isFocus && hasFocus) {Log.i(TAG, "button.getWidth="+button.getWidth());Log.i(TAG, "button.getMeasuredWidth="+button.getMeasuredWidth());isFocus = true;}}
}

结果为:

这里写图片描述

接下来我将Buttonlayout_width改为1000,显然应该超出了屏幕宽度,结果如下:

这里写图片描述

确实不是网友说的那样,因为即使超出了屏幕,两个值还是相同的。


接下来从源码的角度分析这两者的区别:

首先是getMeasuredWidth():

public final int getMeasuredWidth() {  return mMeasuredWidth;  
}  

mMeasuredWidth是从setMeasuredDimension传过来的参数,而setMeasuredDimension最上层的调用是measure(),也就是measure()方法执行以后getMeasuredWidth()就有返回值了:

 protected final void setMeasuredDimension(int measuredWidth, int measuredHeight) {  mMeasuredWidth = measuredWidth;  mMeasuredHeight = measuredHeight;  mPrivateFlags |= MEASURED_DIMENSION_SET;  }  

接下来看下getWidth()的源码:

public final int getWidth() {  return mRight - mLeft;  
}  

其中的mRightmLeft是在layout过程中传过去的参数:

    protected boolean setFrame(int left, int top, int right, int bottom) {  boolean changed = false;  if (mLeft != left || mRight != right || mTop != top || mBottom != bottom) {  changed = true;  。。。省略部分代码。。。  mLeft = left;  mTop = top;  mRight = right;  mBottom = bottom;  。。。省略部分代码。。。  }  return changed;  }  

其中的rightleftlayout方法的参数传下来的,代表的是子view相对于父view的左右坐标,两者的差值作为getWidth()的返回值,所以在layout之后就可以通过getWidth()获取子view的最终大小了。

正常情况下,如果没有手动修改layout方法中的参数,那么getMeasuredWidth()getWidth()两者的值是相等的,但是一般建议在measurelayout的过程中调用getMeasuredWidth(),其他情况下调用getWidth()

2. getSuggestedMinimumWidth()和getSuggestedMinimumHeight()

这两个属性是在onMeasure方法中被使用的:

protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {setMeasuredDimension(getDefaultSize(getSuggestedMinimumWidth(), widthMeasureSpec),getDefaultSize(getSuggestedMinimumHeight(), heightMeasureSpec));
}

具体是在getDefaultSize方法中被使用的,该方法在widthMeasureSpecAT_MOSTEXACTLY两种情况下返回widthMeasureSpec中的specSize,也就是测量后的大小,而只有在UNSPECIFIED,一般用于系统内部的测量过程的情况下,才会返回getSuggestedMinimumWidth(),下面看下其源码:

protected int getSuggestedMinimumWidth() {return (mBackground == null) ? mMinWidth : max(mMinWidth, mBackground.getMinimunWidth());
}

可以看出,如果View没有设置背景,那么View的宽度就是mMinWidth,其对应的是android:minWidth这个属性的值,这个属性的默认值为0;如果View指定了背景,那么View的宽度就是两者的最大值。而后者获取的是Drawable的原始宽度,如果不存在原始宽度就为0。

总结一下,这个建议最小宽度的值取决于View背景的有无,如果没有就返回android:minWidth的值,有就返回背景最小宽度和前面那个值之间的最大值。


暂时就这么多,以后遇到了再补充。


http://chatgpt.dhexx.cn/article/Z5Qv0DFO.shtml

相关文章

JavaFX布局(一)

说道GUI编程一定要谈到布局&#xff0c;JavaFX内置了大量的布局控件提供给我们使用。其实&#xff0c;JavaFX的布局控件和界面元素控件都是继承自javafx.scene.layout.Region类。我们这里只看布局控件类。布局控件我们在界面上一般是看不到的&#xff0c;它一个容器用于放置其它…

Android 桌面小组件 AppWidgetProvider

废话 桌面小组件&#xff0c;绝对是小程序中的小程序&#xff0c;说白了就是任何复杂一丁点的操作都不适合做成桌面小组件。 所以这里采用的演示的例子&#xff0c;就只有一个白色圆角背景&#xff0c;外加一个文本框&#xff0c;显示文字。 小组件的教程网上一搜一大堆&…

Android 约束布局 ConstrainLayout min max width

写一个自定义view package com.anguomob.guidelineimport android.content.Context import android.graphics.Canvas import android.graphics.Color import android.util.AttributeSet import android.view.Viewclass ZeroView constructor(context: Context?, attrs: Attri…

ConstrainLayout 基础教程2,近期想跳槽的程序员必看

特性详解 Visibility behavior (可见性的表现) ConstraintLayout对可见性被标记View.GONE的控件(后称“GONE控件”)有特殊的处理。一般情况下,GONG控件是不可见的,且不再是布局的一部分,但是在布局计算上,ConstraintLayout与传统布局有一个很重要的区别: 传统布局下,…

UGUI源码解析——LayoutElement

一&#xff1a;前言 继承了ILayoutElement和ILayoutIgnorer接口&#xff0c;作为布局元素组件 挂载了Layout Element组件的对象&#xff0c;布局并不会生效&#xff0c;它是受到实现了布局组的控制(HorizontalLayoutGroup、VerticalLayoutGroup、GridLayoutGroup) 二&#xff…

Layui框架的使用技巧

1.选中html代码块&#xff0c;ctrlshift减号- 就会全部折叠 2.加入Thymeleaf模板需要添加命名空间 <!DOCTYPE html> <html xmlns:th"http://www.thymeleaf.org/"></html> 2.1 替换方法 2.2添加 th:fragment 2.3主页面用一行代码替换 3.SpringBo…

UGUI源码解析——LayoutUtility

一&#xff1a;前言 布局的工具类&#xff0c;可以获取到对象的minWidth、preferredWidth、flexibleWidth、minHeight、preferredHeight、layoutPriority的属性值 二&#xff1a;源码解析 ——获取对象属性值的方法 以上方法可以获取到对象的minWidth、preferredWidth、flexi…

Flutter布局指南之深入理解BoxConstraints

点击上方蓝字关注我&#xff0c;知识会给你力量 强烈建议先看下这篇文章——Flutter你竟是这样的布局 不管你是Android开发&#xff0c;还是Flutter开发&#xff0c;当你开始使用Flutter茫茫多的Widget时&#xff0c;可能会猜测Widget在屏幕上的尺寸和位置&#xff0c;但事实上…

vue element-ui el-table表格二次封装 自定义el-table表格组件 vue封装表格组件

CommTable.vue table组件 <template><div><el-table:data"tableData"border:class"tabClass ? tabClass : null":showHeader"showHeader ? showHeader : true":spanMethod"spanMethod ? spanMethod : null"element…

Stage的MinWidth和MinHeight的疑问

设置了Stage的MinWidth和MinHeight,但是显示的时候不是这个高度和宽度&#xff0c;最小化之后再次显示的时候就可以了&#xff0c;奇怪 package stage;import javafx.application.Application; import javafx.event.ActionEvent; import javafx.event.EventHandler; import jav…

php的width是什么意思,minwidth什么意思?min-width怎么设置

很多人刚刚入门css的新手&#xff0c;不知道minwidth什么意思&#xff1f;min-width怎么设置&#xff0c;下面php中文网就带领大家来学习一下min-width。 一&#xff1a;minwidth什么意思 在css中&#xff0c;minwidth是设置段落的最小宽度&#xff0c;使用该属性是设置一个最小…

width和min-width的区别和差异性比较

1、正常情况下&#xff1a; width :给块级元素/行内块 元素设置固定的宽度&#xff0c;或者固定百分比的宽度。 min-width: 当盒子内部元素宽度小于 min-width的值时&#xff0c;盒子宽度为 min-width的值&#xff0c;当盒子内容宽度大于 min-width的值时&#xff0c;盒子随着…

【NOIP2013提高组】华容道

题目背景 NOIP2013 提高组 Day2 试题。 题目描述 小 B 最近迷上了华容道&#xff0c;可是他总是要花很长的时间才能完成一次。于是&#xff0c;他想到用编程来完成华容道&#xff1a;给定一种局面&#xff0c;华容道是否根本就无法完成&#xff0c;如果能完成&#xff0c;最…

【NOIP2013提高组】花匠

题目背景 NOIP2013 提高组 Day2 试题。 题目描述 花匠栋栋种了一排花&#xff0c;每株花都有自己的高度。花儿越长越大&#xff0c;也越来越挤。栋栋决定把这排中的一部分花移走&#xff0c;将剩下的留在原地&#xff0c;使得剩下的花能有空间长大&#xff0c;同时&#xff…

【NOIP2013提高组】积木大赛

题目背景 NOIP2013 提高组 Day2 试题 题目描述 春春幼儿园举办了一年一度的“积木大赛”。今年比赛的内容是搭建一座宽度为 n 的大厦&#xff0c;大厦可以看成由 n 块宽度为 1 的积木组成&#xff0c;第 i 块积木的最终高度需要是 hi。 在搭建开始之前&#xff0c;没有任何…

7.15 NOIP 2013

NOIP 2013 DAY 1 DAY1 T1 转圈游戏 快速幂模板 #include<bits/stdc.h> using namespace std; int n,m,k,x; long long ans; long long cmd(long long a,long long b){long long sum1;for(;a;a>>1){if(a&1){sumsum*b%n;}bb*b%n; } return sum; } int main(…

noip2013 day2

一道纯模拟就可以过&#xff08;水水水&#xff09;。 考试时本蒟蒻甚至写了个线段树&#xff0c;然后发现其实不如直接模拟。 模拟思路&#xff1a; 从1到n枚举每个最长的不为0的序列&#xff0c;每次每个数减去其中剩余的最小值&#xff0c;答案加上这个最小值&#xff0c…

noip2013

D1&#xff1a; T1&#xff1a;快速幂 #include<cstdio> #include<cstring> #include<algorithm> #include<iostream> #include<cstdlib> #include<cmath> #define LL long long using namespace std; LL n,m,k,x; inline LL quickpow(LL…

解题报告:NOIP2013 车站分级(拓扑序递推求解差分约束、建图优化O(n+m)) 超详细讲解

本题是2013年NOIP普及组的压轴题 差分约束裸题。 计算当前线路中最小的级别&#xff08;比较始发站和终点站&#xff09;。 整条线路中所有大于这个级别的都必须停靠 所有未停靠的站点的级别一定小于这个级别 也就是说所有未停靠的即为级别低&#xff0c;记为A 所有停靠的站点…

[NOIP2013]记数问题

[NOIP2013]记数问题 1.题目2.分析3.代码方法1&#xff1a;将每个数字的每一位单独算出方法2&#xff1a;转换为字符串再进行遍历 4.反思总结5.更新日志 1.题目 题目链接 题号&#xff1a;NC16538 时间限制&#xff1a;C/C 1秒&#xff0c;其他语言2秒 空间限制&#xff1a;C/C…