上Layout:
<LinearLayout 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" >
<TextView
android:id="@+id/tv_hello"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/hello_world" />
</LinearLayout>
上Activity,几种方法都写下来了:
package com.cn.measure;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.ViewTreeObserver;
import android.view.ViewTreeObserver.OnGlobalLayoutListener;
import android.widget.TextView;
import android.widget.Toast;
@SuppressLint("NewApi")
public class MainActivity extends Activity
{
private TextView tv_hello;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tv_hello = (TextView)findViewById(R.id.tv_hello);
getSizeWithViewTreeObserver();
getSizeWithPost();
getSizeWithMeasureByHand();
}
/**
* 如果tv_hello的mode是match_parent不能用这种方法
* 因为view的measure过程中需要知道父容器的剩余空间大小,这个时候无法知道父容器剩余空间大小
* 其实这种方法不推荐使用,测量出来的值可能不正确
*/
private void getSizeWithMeasureByHand()
{
tv_hello.measure(View.MeasureSpec.UNSPECIFIED, View.MeasureSpec.UNSPECIFIED);
int height = tv_hello.getMeasuredHeight();
int width = tv_hello.getMeasuredWidth();
Toast.makeText(MainActivity.this,
"getSizeWithMeasureByHand excuted: width is " + width + " \n Height is " + height,
0).show();
}
private void getSizeWithPost()
{
tv_hello.post(new Runnable()
{
@Override
public void run()
{
int width = tv_hello.getMeasuredWidth();
int height = tv_hello.getMeasuredHeight();
Toast.makeText(MainActivity.this,
"getSizeWithPost excuted: width is " + width + " \n Height is " + height,
0).show();
}
});
}
private void getSizeWithViewTreeObserver()
{
ViewTreeObserver observer = tv_hello.getViewTreeObserver();
observer.addOnGlobalLayoutListener(new OnGlobalLayoutListener()
{
@Override
public void onGlobalLayout()
{
tv_hello.getViewTreeObserver().removeGlobalOnLayoutListener(this);
int width = tv_hello.getMeasuredWidth();
int height = tv_hello.getMeasuredHeight();
Toast.makeText(MainActivity.this,
"getSizeWithViewTreeObserver excuted: width is " + width + " \n Height is " + height,
0).show();
}
});
}
@Override
public void onWindowFocusChanged(boolean hasFocus)
{
super.onWindowFocusChanged(hasFocus);
int width = tv_hello.getMeasuredWidth();
int height = tv_hello.getMeasuredHeight();
Toast.makeText(MainActivity.this,
"onWindowFocusChanged excuted: width is " + width + " \n Height is " + height,
0).show();
}
}
四种方法:
private void getSizeWithMeasureByHand() //不推荐使用
private void getSizeWithViewTreeObserver() //推荐使用
private void getSizeWithPost() //推荐使用
public void onWindowFocusChanged(boolean hasFocus) //推荐使用