1. 程式人生 > >AutoLayout根佈局適配問題

AutoLayout根佈局適配問題

弘洋大大的UI適配庫,實現了在不同裝置上的自動適配,非常方便

遇到的問題:

在LayoutInflater.from(getContext()).inflate(resource,parent,false),根佈局即parent自身的數值不被轉化

關於inflate(getContext(), resource, null)和inflate(resource,parent,false)瞧下方連結
Android應用效能優化系列檢視篇——LayoutInflater使用的正確姿勢
先看item的根佈局

<com.zhy.autolayout.AutoLinearLayout
xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="200px" android:background="@color/yellow" android:orientation="horizontal"> <ImageView android:id="@+id/iv_ic" android:layout_width="20sp" android:layout_height="20sp"
android:src="@mipmap/ic_launcher" android:visibility="gone"/> <TextView android:id="@+id/tv_test" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="測試資料" android:textSize="15sp" android:visibility="gone"
/> <com.zhy.autolayout.AutoLinearLayout android:layout_width="match_parent" android:layout_height="50px" android:background="#ff0000"> </com.zhy.autolayout.AutoLinearLayout> </com.zhy.autolayout.AutoLinearLayout>

準備了1080*1920和768*1280兩個解析度的裝置,下圖是不做任何處理的結果
如下圖(1080*1920為左圖,768*1280為右圖)

  • 可以看出兩個裝置的紅條是一樣大小的,符合自動適配
  • 黃條背景兩個裝置高度不同,未自動適配

來看一下AutoLayout的原始碼,是怎麼達到自動適配的效果

關鍵看右邊兩個方法,都是獲取當前裝置的寬/高,與設計尺寸的寬/高做對比,得到比例乘以具體數值val,如不整除,則+1
PS:這也是為什麼我當初測試的時候單純的用高的比例乘以數值來動態設定字型大小的時候,有時候會有細微的偏差
PPS:useDefault()和baseWidth()方法可看具體原始碼,是通過是否設定自定義屬性作為基準來取寬的比例或者高的比例(某些屬性如字型大小是預設取的高之比,可自己改為寬之比)

那麼知道了上述原始碼以後,還會發現AutoUtils類裡還有一個方法

看註釋也知道了可以手動把view進行百分比處理

那麼只要在自己的程式碼中手動呼叫就好了

1080*1920和768*1280均呼叫,效果如下圖

這下兩個解析度不同的裝置都達到了適配

結論:inflate(resource,parent,false)後,的確讀取了根佈局的高,但是AutoLayout真正百分比化並不是從根佈局開始的,所以為了達到佈局降級的目的,可採用AutoUtils.auto(view)