国产探花免费观看_亚洲丰满少妇自慰呻吟_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開發頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 镇坪县| 西青区| 婺源县| 株洲县| 庆元县| 刚察县| 湘乡市| 河曲县| 海门市| 桐乡市| 六枝特区| 冷水江市| 蓬安县| 定边县| 汶上县| 山阳县| 肥西县| 若尔盖县| 兴安县| 乌兰察布市| 赞皇县| 文登市| 南召县| 昭苏县| 乌兰察布市| 濮阳县| 益阳市| 田阳县| 泾源县| 泽库县| 乌鲁木齐县| 阿坝| 台北县| 金昌市| 青阳县| 南汇区| 昭觉县| 东阳市| 大邑县| 盱眙县| 湘潭市|