动态获取view 大小以及 MeasureSpec介绍及使用详解
2016-06-18 12:20
489 查看
getMeasuredHeight()与getHeight的区别
实际上在当屏幕可以包裹内容的时候,他们的值相等,
只有当view超出屏幕后,才能看出他们的区别:
getMeasuredHeight()是实际View的大小,与屏幕无关,
而getHeight的大小此时则是屏幕的大小。
当超出屏幕后,getMeasuredHeight()等于getHeight()加上屏幕之外没有显示的大小
具体方法
我们知道在oncreate中View.getWidth和View.getHeight无法获得一个view的高度和宽度,这是因为View组件 布局要在onResume回调后完成。
1,getViewTreeObserver
使用 getViewTreeObserver().addOnGlobalLayoutListener()来获得宽度或者高度
2.View
post事件中获取
3.直接测量计算
直接上代码:
package
com.gsc.getviewsize;
import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.View;
import android.view.View.MeasureSpec;
import android.view.ViewTreeObserver.OnGlobalLayoutListener;
import android.widget.TextView;
public class MainActivity extends Activity {
TextView tv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tv=(TextView) findViewById(R.id.tv);
tv.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
//1
@Override
public void onGlobalLayout() {
System.out.println("tv1==with:"+tv.getWidth());
System.out.println("tv1==height:"+tv.getHeight());
}
});
tv.post(new Runnable() {//2
@Override
public void run() {
System.out.println("tv2==with:"+tv.getWidth());
System.out.println("tv2==height:"+tv.getHeight());
}
});
//3
种
int w=View.MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED);
一个MeasureSpec封装了父布局传递给子布局的布局要求,每个MeasureSpec代表了一组宽度和高度的要求。一个MeasureSpec由大小和模式组成。它有三种模式:
UNSPECIFIED(未指定),父元素部队自元素施加任何束缚,子元素可以得到任意想要的大小;
EXACTLY(完全),父元素决定自元素的确切大小,子元素将被限定在给定的边界里而忽略它本身大小;
AT_MOST(至多),子元素至多达到指定大小的值。
它常用的三个函数:
1.static int getMode(int measureSpec):根据提供的测量值(格式)提取模式(上述三个模式之一)
2.static int getSize(int measureSpec):根据提供的测量值(格式)提取大小值(这个大小也就是我们通常所说的大小)
3.static int makeMeasureSpec(int size,int mode):根据提供的大小值和模式创建一个测量值(格式)
int h=View.MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED);
tv.measure(w, h);
int tv_w=tv.getMeasuredWidth();
int tv_h=tv.getMeasuredHeight();
System.out.println("tv3==with:"+tv_w);
System.out.println("tv3==height:"+tv_h);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
}
06-18
12:34:56.487: I/System.out(28910): tv3==with:103
06-18 12:34:56.487: I/System.out(28910): tv3==height:27
06-18 12:34:56.571: I/System.out(28910): tv1==with:103
06-18 12:34:56.571: I/System.out(28910): tv1==height:27
06-18 12:34:56.572: I/System.out(28910): tv2==with:103
06-18 12:34:56.572: I/System.out(28910): tv2==height:27
实际上在当屏幕可以包裹内容的时候,他们的值相等,
只有当view超出屏幕后,才能看出他们的区别:
getMeasuredHeight()是实际View的大小,与屏幕无关,
而getHeight的大小此时则是屏幕的大小。
当超出屏幕后,getMeasuredHeight()等于getHeight()加上屏幕之外没有显示的大小
具体方法
我们知道在oncreate中View.getWidth和View.getHeight无法获得一个view的高度和宽度,这是因为View组件 布局要在onResume回调后完成。
1,getViewTreeObserver
使用 getViewTreeObserver().addOnGlobalLayoutListener()来获得宽度或者高度
2.View
post事件中获取
3.直接测量计算
直接上代码:
package
com.gsc.getviewsize;
import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.View;
import android.view.View.MeasureSpec;
import android.view.ViewTreeObserver.OnGlobalLayoutListener;
import android.widget.TextView;
public class MainActivity extends Activity {
TextView tv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tv=(TextView) findViewById(R.id.tv);
tv.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
//1
@Override
public void onGlobalLayout() {
System.out.println("tv1==with:"+tv.getWidth());
System.out.println("tv1==height:"+tv.getHeight());
}
});
tv.post(new Runnable() {//2
@Override
public void run() {
System.out.println("tv2==with:"+tv.getWidth());
System.out.println("tv2==height:"+tv.getHeight());
}
});
//3
种
int w=View.MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED);
一个MeasureSpec封装了父布局传递给子布局的布局要求,每个MeasureSpec代表了一组宽度和高度的要求。一个MeasureSpec由大小和模式组成。它有三种模式:
UNSPECIFIED(未指定),父元素部队自元素施加任何束缚,子元素可以得到任意想要的大小;
EXACTLY(完全),父元素决定自元素的确切大小,子元素将被限定在给定的边界里而忽略它本身大小;
AT_MOST(至多),子元素至多达到指定大小的值。
它常用的三个函数:
1.static int getMode(int measureSpec):根据提供的测量值(格式)提取模式(上述三个模式之一)
2.static int getSize(int measureSpec):根据提供的测量值(格式)提取大小值(这个大小也就是我们通常所说的大小)
3.static int makeMeasureSpec(int size,int mode):根据提供的大小值和模式创建一个测量值(格式)
int h=View.MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED);
tv.measure(w, h);
int tv_w=tv.getMeasuredWidth();
int tv_h=tv.getMeasuredHeight();
System.out.println("tv3==with:"+tv_w);
System.out.println("tv3==height:"+tv_h);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
}
06-18
12:34:56.487: I/System.out(28910): tv3==with:103
06-18 12:34:56.487: I/System.out(28910): tv3==height:27
06-18 12:34:56.571: I/System.out(28910): tv1==with:103
06-18 12:34:56.571: I/System.out(28910): tv1==height:27
06-18 12:34:56.572: I/System.out(28910): tv2==with:103
06-18 12:34:56.572: I/System.out(28910): tv2==height:27
相关文章推荐
- [Java]面试题、基础细节与易错点(逐步积累、扎实、查阅)
- 大学生实习是去大公司好还是小公司好
- 阅读程序
- Codeforces Round #358 (Div. 2) C. Alyona and the Tree
- 使用RDS不得不知的注意事项
- 交通工具 虚函数的应用
- 第十三周项目1(2)
- jqPlot jQuery绘图插件的使用
- 字典树(Trie树)
- 黑洞数
- eclipse中解决65536
- RxJava
- 215. Kth Largest Element in an Array
- faster_rcnn c++版本的 caffe 封装,动态库(2)
- 3ds max 渲染清晰面片的边缘
- JQuery_Validation_plugin
- 第一个博客 属于自己的
- C程序编译过程浅析
- scikit-learn : 线性回归
- MongoDB的性能监控