一,写在前面
在文章自定义控件之测量一文中,已经很清楚描述了view,viewgroup的测量过程。本篇文章是基于自定义控件之测量的一个小小的使用,不会再详细介绍源码所有流程,直接上源码,分析在Activity中调用measure方法测量宽高的原理。那目的是什么呢?就是为了在activity的onCreate方法里获取控件的宽高值。
在onCreate()中获取控件宽高,调用view.getMeasuredWidth(),但是这个方法返回宽度值是有条件的。在测量TextView过程中,调用setMeasuredDimession(w,h)完成测量后,getMeasuredWidth()才有值。可以选择处理方式之一:先手动测量view,调用view.measure(w,h),才能正确获取宽度值。
二,示例展示
那么参数w,h应该传入些什么呢,先看下面这个例子:
activity_main.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity" >
<TextView
android:id="@+id/tv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="#fff"
android:background="#f00"
android:layout_centerInParent="true"
android:text="测量我丫" />
</RelativeLayout>
MainActivity.java
public class MainActivity extends Activity {
private TextView tv;
private static final String TAG = "MainActivity";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tv = (TextView) findViewById(R.id.tv);
//情况1 --------------------------
int width = tv.getMeasuredWidth();
Log.e(TAG, "width(in method onCreate):" + width);
//情况2 --------------------------------
int lpWidth = tv.getLayoutParams().width; //获取textview的布局参数对象LayoutParams,并获取宽度值width
int lpHeight = tv.getLayoutParams().height;
int widthSpecSize = 0; //定义textview宽度测量值的大小
int widthSpecMode = 0; //定义textview宽度测量值的模式
int heightSpecSize = 0;
int heightSpecMode = 0;
//LayoutParams的宽度值width,分3种情况考虑
if (lpWidth == LayoutParams.WRAP_CONTENT && lpHeight == LayoutParams.WRAP_CONTENT) {
//值为wrap_content(-2)时
widthSpecSize = Integer.MAX_VALUE;
widthSpecMode = MeasureSpec.AT_MOST;
heightSpecSize = Integer.MAX_VALUE;
heightSpecMode = MeasureSpec.AT_MOST;
Log.e(TAG, "宽高