1. 問題android
如何獲取一個控件的長和高,相信不少朋友第一眼看見這個問題都會以爲很簡單,直接在onCreate裏面調用getWidth、getMeasuredWidth不就能夠得到了嗎,可是,事實上是並無簡單的,不信的話,你能夠去試一下,在onCreate裏面,你是沒法得到長寬值的,始終爲0。app
1 package com.himi.test; 2 3 import android.app.Activity; 4 import android.os.Bundle; 5 import android.util.Log; 6 import android.view.ViewTreeObserver; 7 import android.view.ViewTreeObserver.OnGlobalLayoutListener; 8 import android.widget.Button; 9 10 public class MainActivity extends Activity { 11 12 private Button button; 13 14 @Override 15 protected void onCreate(Bundle savedInstanceState) { 16 super.onCreate(savedInstanceState); 17 setContentView(R.layout.activity_main); 18 19 button = (Button) findViewById(R.id.button); 20 Log.e("Test", "getWidth寬度:" + button.getWidth()); 21 Log.e("Test", "getHeight高度:" + button.getMeasuredWidth()); 22 } 23 24 }
程序運行結果以下:ide
2. 緣由佈局
這是爲何呢,其實熟悉view繪製流程的朋友應該一眼就看出來了,在onCreate中,咱們的控件其實還並無畫好,換句話說,等onCreate方法執行完了,咱們定義的控件纔會被度量(measure),因此咱們在onCreate方法裏面經過view.getHeight()獲取控件的高度或者寬度確定是0。this
3. 獲取Button的高度、寬度、座標值:spa
(1)利用延時(保證onCreate先完成):code
1 package com.himi.test; 2 3 import android.app.Activity; 4 import android.os.Bundle; 5 import android.util.Log; 6 import android.view.ViewTreeObserver; 7 import android.view.ViewTreeObserver.OnGlobalLayoutListener; 8 import android.widget.Button; 9 10 public class MainActivity extends Activity { 11 12 private Button button; 13 14 @Override 15 protected void onCreate(Bundle savedInstanceState) { 16 super.onCreate(savedInstanceState); 17 setContentView(R.layout.activity_main); 18 19 button = (Button) findViewById(R.id.button); 20 Log.e("Test", "getWidth寬度:" + button.getWidth()); 21 Log.e("Test", "getHeight高度:" + button.getMeasuredWidth()); 22 23 new Thread() { 24 25 @Override 26 public void run() { 27 synchronized (this) { 28 try { 29 wait(1000);// 1秒 30 } catch (InterruptedException e) { 31 // TODO Auto-generated catch block 32 e.printStackTrace(); 33 } 34 } 35 36 Log.e("Test", "高度:" + button.getHeight()); 37 Log.e("Test", "寬度:" + button.getWidth()); 38 39 Log.e("Test", "左上角座標x:" + button.getLeft()); 40 Log.e("Test", "左上角座標y:" + button.getTop()); 41 42 Log.e("Test", "右下角座標x:" + button.getRight()); 43 Log.e("Test", "右下角座標y:" + button.getBottom()); 44 45 } 46 }.start(); 47 48 } 49 50 }
運行程序以下:server
(2)本身使用API測量:blog
1 package com.himi.test; 2 3 import android.app.Activity; 4 import android.os.Bundle; 5 import android.util.Log; 6 import android.view.View; 7 import android.widget.Button; 8 9 public class MainActivity extends Activity { 10 11 private Button button; 12 13 @Override 14 protected void onCreate(Bundle savedInstanceState) { 15 super.onCreate(savedInstanceState); 16 setContentView(R.layout.activity_main); 17 18 button = (Button) findViewById(R.id.button); 19 20 21 22 int w = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED); 23 int h = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED); 24 button.measure(w, h); 25 26 int height = button.getMeasuredHeight(); 27 int width = button.getMeasuredWidth(); 28 29 Log.e("Test", "寬度:" + width); 30 Log.e("Test", "高度:" + height); 31 32 Log.e("Test", "左上角座標x:" + button.getLeft()); 33 Log.e("Test", "左上角座標x:" + button.getTop()); 34 35 Log.e("Test", "左上角座標x:" + button.getRight()); 36 Log.e("Test", "左上角座標x:" + button.getBottom()); 37 38 39 40 41 } 42 43 }
運行程序以下:事件
(3)咱們須要註冊一個ViewTreeObserver的監聽回調,這個監聽回調OnGlobalLayoutListener,就是全局的佈局改變監聽器,因此是最推薦使用的:
ViewTreeObserver:這是一個註冊監聽視圖樹的觀察者(observer),在視圖樹種全局事件改變時獲得通知。這個全局事件不只還包括整個樹的佈局,從繪畫過程開始,觸摸模式的改變等。ViewTreeObserver不可以被應用程序實例化,由於它是由視圖提供,參照getViewTreeObserver()以查看更多信息。
1 package com.himi.test; 2 3 import android.app.Activity; 4 import android.os.Bundle; 5 import android.util.Log; 6 import android.view.ViewTreeObserver; 7 import android.view.ViewTreeObserver.OnGlobalLayoutListener; 8 import android.widget.Button; 9 10 public class MainActivity extends Activity { 11 12 private Button button; 13 14 @Override 15 protected void onCreate(Bundle savedInstanceState) { 16 super.onCreate(savedInstanceState); 17 setContentView(R.layout.activity_main); 18 19 button = (Button) findViewById(R.id.button); 20 21 22 final ViewTreeObserver vto = button.getViewTreeObserver(); 23 vto.addOnGlobalLayoutListener(new OnGlobalLayoutListener() { 24 @Override 25 public void onGlobalLayout() { 26 button.getViewTreeObserver().removeGlobalOnLayoutListener(this); 27 int height = button.getMeasuredHeight(); 28 int width = button.getMeasuredWidth(); 29 30 31 Log.e("Test", "高度:" + height); 32 Log.e("Test", "寬度:" + width); 33 34 35 36 37 Log.e("Test", "左上角座標x:" + button.getLeft()); 38 Log.e("Test", "左上角座標y:" + button.getTop()); 39 40 Log.e("Test", "右下角座標x:" + button.getRight()); 41 Log.e("Test", "右下角座標y:" + button.getBottom()); 42 43 } 44 }); 45 } 46 47 }
部署程序到手機上,以下: