国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統 > Android > 正文

Android控件設置寬高比的方法

2019-10-22 18:14:44
字體:
來源:轉載
供稿:網友

0. 困擾很久的問題

Android控件的寬和高保持比例,這是從我接觸Android以來,一直不斷會遇到的需求。以前,要么就是在代碼里直接設置寬和高,要么就是自定義控件。網上也有開源的自定義ViewGroup,可以讓其子View比較方便的設置寬和高的比例。但這些實現方式,還是比較麻煩,也不夠直觀。直到有了DataBinding,我們可以很方便地給控件加上自定義的屬性,也就可以很方便的在布局文件中設置控件的寬高比了。

1. 如何實現

通過BinderAdapter為所有View綁定下面的方法,當設置widthHeightRatio屬性時,會調用下面這個方法。這個有點AOP的意思,我們針對所有的View做了處理。

public class DataBindingAdapters {  // 根據View的高度和寬高比,設置高度  @BindingAdapter("widthHeightRatio")  public static void setWidthHeightRatio(final View view, final float ratio) {    view.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {      @Override      public void onGlobalLayout() {        int height = view.getHeight();        if (height > 0) {          view.getLayoutParams().width = (int) (height * ratio);          view.invalidate();          view.getViewTreeObserver().removeGlobalOnLayoutListener(this);        }      }    });  }}

我們在獲取到控件的高度后,根據比例計算寬度,然后設置給控件。這里注冊了OnGlobalLayoutListener,是因為控件的高度有可能還沒計算完成。在獲取到高度之后,移除監聽,避免多余的調用。

<ImageView  android:layout_width="120dp"  android:layout_height="match_parent"  app:widthHeightRatio="@{1}"/>

然后我們就可以在布局文件中直接設置寬高比了。這個布局文件必須使用DataBinding,也就是最外層要用layout標簽。屬性值必須加上@{},不然是按普通屬性處理的,不會調用我們的方法,編譯時會因為找不到屬性報錯。當然,這個屬性只能根據高度計算寬度,如果要根據寬度計算高度,可以用同樣的方式再加一個屬性。

2. 原理簡析

其實在編譯后的layout文件中是沒有我們加的屬性的(編譯后的layout文件在build/intermediates/data-binding-layout-out下面可以看到)。真正設置這個屬性,還是在Java代碼中直接調用了我們綁定的方法。在DataBinding自動生成的Binding類中,可以發現有類似下面這樣的調用。

 

復制代碼 代碼如下:

DataBindingAdapters.setWidthHeightRatio(this.mboundView0, cardWidthHeightRatio);

 

這里只是做一個簡單的解釋,至于在什么時機會觸發這行代碼,敬請期待我后續的文章。

3. BinderAdapter的其他妙用

ImageView自動加載網絡圖片

@BindingAdapter({"android:src", "error"})public static void setImageUrl(ImageView view, String url, @DrawableRes int errorImage) {  if (!TextUtils.isEmpty(url)) {    // 封裝好的圖片加載工具    ImageManager.from(view.getContext()).displayImage(view, url, errorImage);  } else {    view.setImageResource(errorImage);  }}

直接在布局文件中設置要加載的圖片的url,和加載失敗時顯示的默認圖。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VEVB武林網。


注:相關教程知識閱讀請移步到Android開發頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 东台市| 蒲城县| 昌都县| 晋江市| SHOW| 嘉禾县| 临邑县| 新津县| 南开区| 宜昌市| 丘北县| 宝应县| 应城市| 富源县| 雅江县| 江永县| 蚌埠市| 化德县| 翼城县| 辽中县| 青川县| 武定县| 大余县| 肇源县| 神农架林区| 广东省| 荔波县| 射洪县| 海南省| 紫金县| 田林县| 云浮市| 牡丹江市| 沁阳市| 会昌县| 榆中县| 遂溪县| 天祝| 诸暨市| 浮梁县| 获嘉县|