最簡單也最難——如何擷取到Android控制項的高度,擷取android控制項

來源:互聯網
上載者:User

最簡單也最難——如何擷取到Android控制項的高度,擷取android控制項
問題

如何擷取一個控制項的長和高,相信很多朋友第一眼看見這個問題都會覺得很簡單,直接在onCreate裡面調用getWidth、getMeasuredWidth不就可以獲得了嗎,但是,事實上是並沒有簡單的,不信的話,你可以去試一下,在onCreate裡面,你是無法獲得長寬值的,始終為0。

原因

這是為什麼呢,其實熟悉view繪製流程的朋友應該一眼就看出來了,在onCreate中,我們的控制項其實還並沒有畫好,換句話說,等onCreate方法執行完了,我們定義的控制項才會被度量(measure),所以我們在onCreate方法裡面通過view.getHeight()擷取控制項的高度或者寬度肯定是0。

解決

No1:

int w = View.MeasureSpec.makeMeasureSpec(0,View.MeasureSpec.UNSPECIFIED);int h = View.MeasureSpec.makeMeasureSpec(0,View.MeasureSpec.UNSPECIFIED);imageView.measure(w, h);int height = imageView.getMeasuredHeight();int width = imageView.getMeasuredWidth();

這種方法很簡單,就是我們自己來測量


No2:

ViewTreeObserver vto = imageView.getViewTreeObserver();     vto.addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {         public boolean onPreDraw() {         vto.removeOnPreDrawListener(this);            int height = imageView.getMeasuredHeight();             int width = imageView.getMeasuredWidth();             return true;         }     }); 

這個方法,我們需要註冊一個ViewTreeObserver的監聽回調,這個監聽回調,就是專門監聽繪圖的,既然是監聽繪圖,那麼我們自然可以擷取測量值了,同時,我們在每次監聽前remove前一次的監聽,避免重複監聽。


No3:

ViewTreeObserver vto = imageView.getViewTreeObserver();   vto.addOnGlobalLayoutListener(new OnGlobalLayoutListener() {     @Override       public void onGlobalLayout() {         imageView.getViewTreeObserver().removeGlobalOnLayoutListener(this);         imageView.getHeight();        imageView.getWidth();    }   });   

這個方法於第2個方法基本相同,但他是全域的布局改變監聽器,所以是最推薦使用的。


OK,現在看來,看似簡單問題也不是那麼簡單吧。

以上。


怎得到控制項的寬 高 android

有兩種情況,
1,當頁面還未顯示出來的時候,擷取控制項寬高的方式有
ViewTreeObserver viewTreeObserver = mView.getViewTreeObserver();

viewTreeObserver.addOnPreDrawListener(....);
在監聽函數中擷取控制項的寬高就行了,
2,當頁面畫完了,也就是最簡單的的直接
mView.getWidth()和mView.getHeight()就行了
 
android 怎動態設定控制項的寬度與高度

android中的控制項如果在xml布局檔案中把控制項的layout_width和layout_height寫成固定值了,好像就不能再在程式中更改該控制項的高度和寬度了,不知哪位大俠有何良策可以指教一二,如xml檔案內容如下:<LinearLayoutandroid:id="@id/dialog_bottom_neutral"android:layout_width="fill_parent"android:layout_height="wrap_content"android:layout_weight="1.0"android:gravity="center"<Buttonandroid:id="@id/dialog_bottom_neutral_button"android:layout_width="80.0dip"android:layout_height="28.0dip"android:background="@drawable/dlg_button"android:gravity="center"android:singleLine="true"android:text="mid"android:textColor="@drawable/dlg_button_text_color"android:textSize="14.0sp" /小弟在程式中使用button.width和button.height設定沒用,用LayoutParmas設定也沒用
 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.