一。也許很多童鞋對getWidth()和getMeasuredWidth()的用法有很多的不解,這兩者之間有什麼樣的不同呢,網上也有各種不同的版本,但大多數都大同小異,從這個地方Ctrl+C,到另一個地方Ctrl+V,沒有把問題說透,也有一部分文章誤導了大家對這兩個方法的認識,我也是深受其害。這裡先糾正下面的一個版本的說法,Baidu上一搜一大堆的,可惜這種說法是錯的,所以希望大家就不要再盲目的轉載到你的空間裡:

getWidth得到是某个view的实际尺寸.

getMeasuredWidth是得到某view想要在parent view里面占的大小.

想必你也見過這樣的解釋,聽起來這樣的解釋也似雲裡霧裡,沒有把問題點透。

二。好了,錯誤的版本就不過多說了,下面對這兩個方法做一下正解,首先大家應先知道以下幾點:

1.

在一個類初始化時,即在構造函數當中我們是得不到View的實際大小的。感興趣的朋友可以試一下,getWidth()和getMeasuredWidth()得到的結果都是0.但是我們可以從onDraw()方法裡面得到控件的大小。

2. 這兩個方法所得到的結果的單位是像素即pixel.

對兩個方法做介紹:

getWidth():得到的是view在父Layout中佈局好後的寬度值,如果沒有父佈局,那麼默認的父佈局是整個屏幕。也許不好理解。通過一個例子來說明一下。

例1 :

public class Test extends Activity {

private LinearLayout mBackgroundLayout;

private TextViewTest mTextViewTest;

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

mBackgroundLayout = new MyLayout(this);

mBackgroundLayout.setLayoutParams(new

LinearLayout.LayoutParams(

LinearLayout.LayoutParams.FILL_PARENT,

LinearLayout.LayoutParams.FILL_PARENT));

mTextViewTest = new TextViewTest(this);

mBackgroundLayout.addView(mTextViewTest);

setContentView(mBackgroundLayout);

}

public class MyLayout extends LinearLayout{

public MyLayout(Context context) {

super(context);

// TODO Auto-generated constructor stub

}

@Override

protected void onLayout(boolean changed, int l, int t, int r, int

b) {

// TODO Auto-generated method stub

super.onLayout(changed, l, t, r, b);

Log.i("Tag", "--------------");

View mView=getChildAt(0);

mView.measure(0, 0);

}

}

public class TextViewTest extends TextView {

public TextViewTest(Context context) {

super(context);

// TODO Auto-generated constructor stub

setText("test test ");

}

@Override

protected void onDraw(Canvas canvas) {

// TODO Auto-generated method stub

super.onDraw(canvas);

// measure(0, 0);

Log.i("Tag", "width: " + getWidth() + ",height: " +

getHeight());

Log.i("Tag", "MeasuredWidth: " + getMeasuredWidth()

+ ",MeasuredHeight: " + getMeasuredHeight());

}

}

}

這裡是在LinearLayout裡添加一個TextView控件,如果此時要得到對TextView獲取getWidth(),那麼是在TextView添加到Layout後再去獲取值,並不單單的是對TextView本身寬度的獲取。

getMeasuredWidth():先看一下API裡面怎麼說的

The width of this view as measured in the most recent call to

measure(). This should be used during measurement and layout

calculations only.

得到的是在最近一次調用measure()方法測量後得到的view的寬度,它僅僅用在測量和layout的計算中。

所以此方法得到的是view的內容佔據的實際寬度。

你如果想從一個最簡單的例子中的到它們的不同,下面將對上面的例子做一下修改:

public class Test extends Activity {

private TextViewTest mTextViewTest;

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

mTextViewTest = new TextViewTest(this);

setContentView(mTextViewTest);

}

public class TextViewTest extends TextView {

public TextViewTest(Context context) {

super(context);

// TODO Auto-generated constructor stub

setText("test test ");

}

@Override

protected void onDraw(Canvas canvas) {

// TODO Auto-generated method stub

super.onDraw(canvas);

measure(0, 0);

Log.i("Tag", "width: " + getWidth() + ",height: " +

getHeight());

Log.i("Tag", "MeasuredWidth: " + getMeasuredWidth()

+ ",MeasuredHeight: " + getMeasuredHeight());

}

}

}

總結(正解):

getWidth(): View在設定好佈局後整個View的寬度。

getMeasuredWidth():

對View上的內容進行測量後得到的View內容佔據的寬度,前提是你必須在父佈局的onLayout()方法或者此View的onDraw()方法裡調用measure(0,0);(measure

參數的值你可以自己定義),否則你得到的結果和getWidth()得到的結果一樣。也許我組織的不是很好,大家有什麼不清楚的地方再給我留言。關於這兩個方法的區別就是看你有沒有用measure()方法,當然measure()的位置也是很重要的。

android view getwidth 0,Android中View.getWidth()和View.getMeasuredWidth()的区别相关推荐

  1. android view getx 0,Android动画:解决通过View.getY()获取初始位置为0的问题

    问题描述 View.getY()返回为0 问题背景 用ObjectAnimator进行平移动画的时候需要获取控件的初始位置以及结束位置,比如 ObjectAnimator animY = Object ...

  2. oracle 计划中的view,为何执行计划中会出现个VIEW: VM_NWVW_1 ?

    为何执行计划中会出现个VIEW:  VM_NWVW_1 ? 数据库中根本没有这个OBJECT. 也不象系统自己产生的! SELECT R.CREATED_OFFICE STOCK_CODE, R.CU ...

  3. android 模拟器 2.0,Android Studio 2.0 之 新的模拟器

    上个星期,Android Studio 2.0 的稳定版终于发布了,于是我马上兴冲冲的升级了. Android Studio 2.0 最突出的主新特性有两个: Instant Run -- 即时运行, ...

  4. AccountManager getAccount 在Android O 8.0版本中获取为 null ?

    问题 AccountManager accountManager = AccountManager.get(this);Account[] accounts = accountManager.getA ...

  5. 声道切换 android,[RK3288][Android6.0] Audio中的单声道到双声道的转换处理过程

    Platform: Rockchip OS: Android 6.0 Kernel: 3.10.92 播放音乐是单声道,硬件用的是双声道. AudioFlinger::PlaybackThread:: ...

  6. android 发送按键 0,android monitor tool (8.0 模拟发送按键及触摸屏事件实现)

    首先看下操作界面: 你可以可以远程控制手机,模拟发送触摸屏及按键事件 (应用场合:开发早期触摸屏还没确定及判断问题是驱动层还是framework / app 层) 先讲发送按键事件的实现(如下面是发送 ...

  7. android 模拟器 2.0,Android模拟神器-Genymotion2.0发布,安卓的x86模拟器

    支持 Android 4.3 虚拟设备 Indie or Business license only: new remote control widget which allows you to co ...

  8. android retrofit 2.0,android – Retrofit 2.0 OnFailure – 原始响应

    我正在使用改造来调用Web服务并且改造失败,来自'Throwable`的消息给了我 java.lang.IllegalStateException: Expected BEGIN_OBJECT but ...

  9. android通过代码设置铃声_Android基础(5)—自定义View

    自定义View 基本认知: 虽然Android已经自带来很多强大的UI控件,但是依旧不能满足所有开发人员的需求.通常开发人员需要实现设计师精心设计的视觉效果,这样情况下可能现有的控件就不能满足需求或者 ...

最新文章

  1. 两大AI技术集于一身,有道词典笔3从0到1的飞跃
  2. Android系统匿名共享内存(Anonymous Shared Memory)C++调用接口分析(6)
  3. python中的reduce函数
  4. android view 渐变动画,Android自定义view渐变圆形动画
  5. mybatis sql打印输出位置
  6. linux usb 升级脚本,linux – 使用bash脚本更新CRON
  7. 数据库之间数据转换最快方法
  8. 什么叫POE交换机?POE交换机使用方法介绍?
  9. flask-01-http通信的回顾
  10. Android输入事件InputReader和InputDispatcher分析
  11. [Unity3D] DOTween和Curvy插件,以及UI-Extension
  12. copy的过去式_copy的过去式和用法例句
  13. shal+php,学习笔记---PHP中几种加密算法(MD5,shal,base64_encode等)
  14. mysql汉字对应字段_mysql和SqlServer 中取得汉字字段的各汉字首字母
  15. Matlab渐变颜色图(colormap)生成/编辑器—ColorMap
  16. Cisco Packet Tracer基础命令操作以及组织网络实验
  17. 史上最简单的rar压缩包文档解密方法,rar压缩包权限密码如何解开?
  18. android-设置/去除背景,透明度
  19. 【Web基础入门】一文搞懂HTML + CSS + JavaScript 简单了解
  20. 5.12四川汶川等市发生8.0级大震——国难日

热门文章

  1. 卡方分布分位数_卡方检验和精确概率法及两两比较
  2. Ollydbg使用教程学习总结(二)
  3. 数据结构,Java实现递归回溯,寻找出迷宫路线,解决迷宫问题
  4. android tcp判断服务器是否断开,Android tcp客户端连接,然后从java服务器断开连接...
  5. atom自动补全html代码,Atom - Emmet插件的使用详解(HTML/CSS代码自动补全)
  6. 开源GraphView的使用--数据统计
  7. php imagemagick 文档,调用ImageMagick的PHP函数中文文档
  8. Angular 个人深究(四)【生命周期钩子】
  9. WPF 实现水纹效果
  10. Token注解防止表单的重复提交