本文最后更新于:2019年8月1日 下午
有些时候我们需要获取到View的宽高信息。在onCreate和onResume中尝试view.getWidth()或是view.getHeiht()时,我们会发现获取到的是0。
Activity视图在创建完成后,各个子view并不一定被加载完成。
获取宽高正确的方法有哪些呢?
方法1 - 在Activity的onWindowFocusChanged
获取宽高
1 2 3 4 5 6
| @Override public void onWindowFocusChanged(boolean hasFocus) { super.onWindowFocusChanged(hasFocus); Log.d(TAG, "onWindowFocusChanged: mBtn1.getWidth == " + mBtn1.getWidth()); }
JAVA
|
方法2 - 使用ViewTreeObserver的OnGlobalLayoutListener
回调
获取View的ViewTreeObserver,添加回调
1 2 3 4 5 6 7 8 9 10
| ViewTreeObserver vto = mBtn1.getViewTreeObserver(); vto.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { @Override public void onGlobalLayout() { int height = mBtn1.getHeight(); int width = mBtn1.getWidth(); Log.d(TAG, "onGlobalLayout: mBtn1 " + width + ", " + height); mBtn1.getViewTreeObserver().removeOnGlobalLayoutListener(this); } });
JAVA
|
方法3 - 使用View.post(Runnable action)
方法
例如我们在onCreate中post一个Runnable
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); mBtn1 = findViewById(R.id.btn1); Log.d(TAG, "mBtn1 post runnable"); mBtn1.post(new Runnable() { @Override public void run() { Log.d(TAG, "mBtn1: " + mBtn1.getWidth() + ", " + mBtn1.getHeight()); } }); }
JAVA
|
可以获取到view的宽高。从log的时间上可以看出,在view加载完毕后,执行的Runnable。
应用 - 动态调整ImageView的宽高
获取到view的宽高后,我们可以动态地调整ImageView的高度。
假设图片宽高为704 * 440。xml中设置scaleType为fitXY。已知ImageView的宽度是固定的,我们可以调整高度。
1 2 3 4
| <ImageView android:layout_width="match_parent" android:layout_height="wrap_content" android:scaleType="fitXY"/>
XML
|
根据图片真实大小来重设ImageView的高度。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| @Override public void onWindowFocusChanged(boolean hasFocus) { super.onWindowFocusChanged(hasFocus); resetIntroIvParams(); }
private void resetIntroIvParams() { int height = mIntroIv.getHeight(); int wid = mIntroIv.getWidth(); if (height > 0 && wid > 0) { ViewGroup.LayoutParams layoutParams = mIntroIv.getLayoutParams(); layoutParams.height = (int) (wid * 440.0 / 704.0); mIntroIv.setLayoutParams(layoutParams); } }
JAVA
|