转自:http://blog.csdn.net/wotoumingzxy/article/details/7760935#comments



原文摘自:http://gundumw100.iteye.com/blog/1025191

解释一下 之所以用翻译是因为我自己觉得看着繁体字可难受。。为了不让大家难受。。就翻译了。。哈哈

一、 也许很多同学对getWidth()和getMeasuredWidth()的用法有很多的不解,这两者之间有什么样的不同呢,网上也有各种不同的版本,但大多都大同小异罢了,从这个地方CTRL + C 到另一个地方CTRL + V, 没有把问题说透,也有一部分文章误导了大家对这两个方法的认识,我也是深受其害。这里先纠正下面的一个版本,Baidu上一搜一大堆的,可惜这种说法是错的,所以希望大家就不要再盲目的转载到你的空间里:

getWidth 得到的事某个View的实际尺寸。

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

相比你也见过这样的解释,听起来这样的解释也是云里雾里,没有把问题点透。

二、好了,错误的版本不多说了,下面对这两个方法做一下正解,首先大家应先知道一下几点:

1. 在一个类初始化时,即在构造函数当中我们是得不到View的实际大小的。感兴趣的朋友可以试一下,getWidth()和getMeasuredWidth()得到的结果都是0.但是我们可以从onDraw()方法里面的到控件的大小。

2.这两个所得到的结果的单位是像素即pixel。

对这两个方法做介绍:

getWidth(): 得到的是view在父Layout中布局好后的宽度值,如果没有父布局,那么默认的父布局就是真个屏幕。也许不好理解通过一个例子来说明一下:

[java] view plain copy print ?
  1. publicclassTestextendsActivity{
  2. privateLinearLayoutmBackgroundLayout;
  3. privateTextViewTestmTextViewTest;
  4. /**Calledwhentheactivityisfirstcreated.*/
  5. @Override
  6. publicvoidonCreate(BundlesavedInstanceState){
  7. super.onCreate(savedInstanceState);
  8. mBackgroundLayout=newMyLayout(this);
  9. mBackgroundLayout.setLayoutParams(newLinearLayout.LayoutParams(
  10. LinearLayout.LayoutParams.FILL_PARENT,
  11. LinearLayout.LayoutParams.FILL_PARENT));
  12. mTextViewTest=newTextViewTest(this);
  13. mBackgroundLayout.addView(mTextViewTest);
  14. setContentView(mBackgroundLayout);
  15. }
  16. publicclassMyLayoutextendsLinearLayout{
  17. publicMyLayout(Contextcontext){
  18. super(context);
  19. //TODOAuto-generatedconstructorstub
  20. }
  21. @Override
  22. protectedvoidonLayout(booleanchanged,intl,intt,intr,intb){
  23. //TODOAuto-generatedmethodstub
  24. super.onLayout(changed,l,t,r,b);
  25. Log.i("Tag","--------------");
  26. ViewmView=getChildAt(0);
  27. mView.measure(0,0);
  28. }
  29. }
  30. publicclassTextViewTestextendsTextView{
  31. publicTextViewTest(Contextcontext){
  32. super(context);
  33. //TODOAuto-generatedconstructorstub
  34. setText("testtest");
  35. }
  36. @Override
  37. protectedvoidonDraw(Canvascanvas){
  38. //TODOAuto-generatedmethodstub
  39. super.onDraw(canvas);
  40. //measure(0,0);
  41. Log.i("Tag","width:"+getWidth()+",height:"+getHeight());
  42. Log.i("Tag","MeasuredWidth:"+getMeasuredWidth()
  43. +",MeasuredHeight:"+getMeasuredHeight());
  44. }
  45. }
  46. }

这里是在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的内容占据的实际宽度。

你如果想从一个简单的例子中得到他们的不同,下面将对上面的例子做一下修改。

[java] view plain copy print ?
  1. publicclassTestextendsActivity{
  2. privateTextViewTestmTextViewTest;
  3. /**Calledwhentheactivityisfirstcreated.*/
  4. @Override
  5. publicvoidonCreate(BundlesavedInstanceState){
  6. super.onCreate(savedInstanceState);
  7. mTextViewTest=newTextViewTest(this);
  8. setContentView(mTextViewTest);
  9. }
  10. publicclassTextViewTestextendsTextView{
  11. publicTextViewTest(Contextcontext){
  12. super(context);
  13. //TODOAuto-generatedconstructorstub
  14. setText("testtest");
  15. }
  16. @Override
  17. protectedvoidonDraw(Canvascanvas){
  18. //TODOAuto-generatedmethodstub
  19. super.onDraw(canvas);
  20. measure(0,0);
  21. Log.i("Tag","width:"+getWidth()+",height:"+getHeight());
  22. Log.i("Tag","MeasuredWidth:"+getMeasuredWidth()
  23. +",MeasuredHeight:"+getMeasuredHeight());
  24. }
  25. }
  26. }

总结(正解):

getWidth(): View在设定好布局后整个View的宽度。

getMeasuredWidth(): 对View上的内容进行测量后得到的View内容占据的宽度,前提是你必须在父布局的onLayout()方法或者此View的onDraw()方法里调用measure(0,0);(measure中的参数的值你自己可以定义),否则你得到的结果和getWidth()得到的结果是一样的。


更多相关文章

  1. Android(安卓)Launcher 设置壁纸
  2. ButterKnife源码解析
  3. android ViewGroup中的LayoutParams的理解和说明
  4. android中view手势滑动冲突的解决方法
  5. Android实现多线程下载文件的方法
  6. android 退出应用方法一:点击两次退出应用
  7. Android类参考---Fragment(七)
  8. 一步一步学android之布局管理器——RelativeLayout
  9. Android自动化测试之Monkeyrunner使用方法及实例

随机推荐

  1. 特效--------圆角 倒影
  2. android 播放器解析MP3文件乱码分析
  3. android声音检测仪---分贝仪 (附源码)
  4. Android MediaPlayer 分析- MediaPlayerS
  5. Android制作 9-Patch图片(可调整大小的位
  6. Android NDK: WARNING: APP_PLATFORM And
  7. 类似HTML map标签功能的Android组件
  8. ant编译android工程taskdef class not fo
  9. android ListView几个比较特别的属性
  10. 我要一步一步往上爬——Android应用实例