android中各种height和width总结

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值

    <Button
        android: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;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        button = findViewById(R.id.button);
    }

    @Override
    public 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的值,有就返回背景最小宽度和前面那个值之间的最大值。


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

内容概要:本文档详细介绍了在三台CentOS 7服务器(IP地址分别为192.168.0.157、192.168.0.158和192.168.0.159)上安装和配置Hadoop、Flink及其他大数据组件(如Hive、MySQL、Sqoop、Kafka、Zookeeper、HBase、Spark、Scala)的具体步骤。首先,文档说明了环境准备,包括配置主机名映射、SSH免密登录、JDK安装等。接着,详细描述了Hadoop集群的安装配置,包括SSH免密登录、JDK配置、Hadoop环境变量设置、HDFS和YARN配置文件修改、集群启动与测试。随后,依次介绍了MySQL、Hive、Sqoop、Kafka、Zookeeper、HBase、Spark、Scala和Flink的安装配置过程,包括解压、环境变量配置、配置文件修改、服务启动等关键步骤。最后,文档提供了每个组件的基本测试方法,确保安装成功。 适合人群:具备一定Linux基础和大数据组件基础知识的运维人员、大数据开发工程师以及系统管理员。 使用场景及目标:①为大数据平台建提供详细的安装指南,确保各组件能够顺利安装和配置;②帮助技术人员快速掌握Hadoop、Flink等大数据组件的安装与配置,提升工作效率;③适用于企业级大数据平台的建与维护,确保集群稳定运行。 其他说明:本文档不仅提供了详细的安装步骤,还涵盖了常见的配置项解释和故障排查建议。建议读者在安装过程中仔细阅读每一步骤,并根据实际情况调整配置参数。此外,文档中的命令和配置文件路径均为示例,实际操作时需根据具体环境进行适当修改。
在无线通信领域,天线阵列设计对于信号传播方向和覆盖范围的优化至关重要。本题要求设计一个广播电台的天线布局,形成特定的水平面波瓣图,即在东北方向实现最大辐射强度,在正东到正北的90°范围内辐射衰减最小且无零点;而在其余270°范围内允许出现零点,且正西和西南方向必须为零。为此,设计了一个由4个铅垂铁塔组成的阵列,各铁塔上的电流幅度相等,相位关系可自由调整,几何布置和间距不受限制。设计过程如下: 第一步:构建初级波瓣图 选取南北方向上的两个点源,间距为0.2λ(λ为电磁波波长),形成一个端射阵。通过调整相位差,使正南方向的辐射为零,计算得到初始相位差δ=252°。为了满足西南方向零辐射的要求,整体相位再偏移45°,得到初级波瓣图的表达式为E1=cos(36°cos(φ+45°)+126°)。 第二步:构建次级波瓣图 再选取一个点源位于正北方向,另一个点源位于西南方向,间距为0.4λ。调整相位差使西南方向的辐射为零,计算得到相位差δ=280°。同样整体偏移45°,得到次级波瓣图的表达式为E2=cos(72°cos(φ+45°)+140°)。 最终组合: 将初级波瓣图E1和次级波瓣图E2相乘,得到总阵的波瓣图E=E1×E2=cos(36°cos(φ+45°)+126°)×cos(72°cos(φ+45°)+140°)。通过编程实现计算并绘制波瓣图,可以看到三个阶段的波瓣图分别对应初级波瓣、次级波瓣和总波瓣,最终得到满足广播电台需求的总波瓣图。实验代码使用MATLAB编写,利用polar函数在极坐标下绘制波瓣图,并通过subplot分块显示不同阶段的波瓣图。这种设计方法体现了天线阵列设计的基本原理,即通过调整天线间的相对位置和相位关系,控制电磁波的辐射方向和强度,以满足特定的覆盖需求。这种设计在雷达、卫星通信和移动通信基站等无线通信系统中得到了广泛应用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值