zoukankan      html  css  js  c++  java
  • Android getWidth和getMeasuredWidth的区别

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

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

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

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

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

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

      对这两个方法做介绍:

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


        public class Test extends Activity {  
         private LinearLayout mBackgroundLayout;  
         private TextViewTest mTextViewTest;  
          
         /** Called when the activity is first created. */  
         @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", " " + 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;  
          
         /** Called when the activity is first created. */  
         @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", " " + getWidth() + ",height: " + getHeight());  
           Log.i("Tag", "MeasuredWidth: " + getMeasuredWidth()  
             + ",MeasuredHeight: " + getMeasuredHeight());  
          }  
         }  
        }  

    总结(正解):

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

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

    学习的时候来自网上整理转载。供大家学习

  • 相关阅读:
    C语言知识
    Java课程设计——个人
    Java大作业
    DAO模式代码阅读及应用
    有理数设计
    泛型 -Java
    集合框架之ArrayList -Java
    图总结
    树、二叉树、查找算法总结
    编辑器、编译器、文件、IDE等常见概念辨析
  • 原文地址:https://www.cnblogs.com/rysinal/p/5834476.html
Copyright © 2011-2022 走看看