這篇筆記是根據(jù)作者博客中的介紹,進行記錄總結箍邮。GitHub中文README
AndroidAutoSize
屏幕適配框架AndroidAutoSize是根據(jù)今日頭條屏幕適配方案優(yōu)化的。
配置第三方遠程依賴
<!--私有依賴-->
implementation 'me.jessyan:autosize:1.1.2'
<!--共有依賴-->
api 'me.jessyan:autosize:1.1.2'
使用以及功能介紹
AndroidAutoSize 在使用上非常簡單吨凑,只需要填寫設計圖尺寸這一步即可接入項目口猜;
<manifest>
<application>
<meta-data
android:name="design_width_in_dp"
android:value="540"/>
<meta-data
android:name="design_height_in_dp"
android:value="960"/>
</application>
</manifest>
有兩種類型的布局單位可以選擇,一個是 主單位 (dp蓬推、sp),一個是 副單位 (pt澡腾、in沸伏、mm)
主單位: 使用 dp、sp 為單位進行布局动分,侵入性最低毅糟,會影響其他三方庫頁面、三方庫控件以及系統(tǒng)控件的布局效果澜公,但 AndroidAutoSize 也通過這個特性姆另,使用 ExternalAdaptManager 實現(xiàn)了在不修改三方庫源碼的情況下適配三方庫的功能
副單位: 使用 pt、in坟乾、mm 為單位進行布局迹辐,侵入性高,對老項目的支持比較好甚侣,不會影響其他三方庫頁面右核、三方庫控件以及系統(tǒng)控件的布局效果,可以徹底的屏蔽修改 density 所造成的所有未知和已知問題渺绒,但這樣 AndroidAutoSize 也就無法對三方庫進行適配
在使用主單位時,
design_width_in_dp
和design_height_in_dp
的單位必須是 dp,計算公式dp = px / (DPI / 160)
將 px 尺寸轉換為 dp 尺寸宗兼,如果實在找不到設備的 DPI 那就直接將 px 尺寸除以 3 或者 2 躏鱼。
框架接入完成
這就是 AndroidAutoSize 的基礎功能,AndroidAutoSize 的使用方法在這里就結束了殷绍,只需要上面這一步染苛,即可幫助你以最簡單的方式接入 AndroidAutoSize。
進階使用
在 AndroidManifest.xml 中填寫的設計尺寸主到,是整個項目的全局設計圖尺寸茶行,但是如果某些 Activity 頁面由于某些原因,這個頁面的設計圖尺寸和在 AndroidManifest.xml 中填寫的設計圖尺寸不一樣該怎么辦呢登钥?則可以讓這個頁面的 Activity 實現(xiàn) CustomAdapt 畔师,CustomAdapt 接口的第一個方法可以修改當前頁面的設計尺寸。
- 自定義Activity
public class CustomAdaptActivity extends AppCompatActivity implements CustomAdapt {
/**
* 是否按照寬度進行等比例適配 (為了保證在高寬比不同的屏幕上也能正常適配, 所以只能在寬度和高度之中選擇一個作為基準進行適配)
*
* @return {@code true} 為按照寬度進行適配, {@code false} 為按照高度進行適配
*/
@Override
public boolean isBaseOnWidth() {
return false;
}
/**
* 設計圖尺寸為 1080px * 1920px, 高換算成 dp 為 960 (1920px / 2 = 960dp)
* <p>
* 返回的設計尺寸, 單位 dp
* {@link #getSizeInDp} 須配合 {@link #isBaseOnWidth()} 使用, 規(guī)則如下:
* 如果 {@link #isBaseOnWidth()} 返回 {@code true}, {@link #getSizeInDp} 則應該返回設計圖的總寬度
* 如果 {@link #isBaseOnWidth()} 返回 {@code false}, {@link #getSizeInDp} 則應該返回設計圖的總高度
* 如果您不需要自定義設計圖上的設計尺寸, 想繼續(xù)使用在 AndroidManifest 中填寫的設計圖尺寸, {@link #getSizeInDp} 則返回 {@code 0}
*
* @return 單位 dp
*/
@Override
public float getSizeInDp() {
return 667;
}
}
如果某個 Activity 想放棄適配牧牢,讓這個 Activity 實現(xiàn) CancelAdapt 接口即可看锉,比如修改 density 影響到了老項目中的某些 Activity 頁面的布局效果,這時就可以讓這個 Activity 實現(xiàn) CancelAdapt 接口
public class CancelAdaptActivity extends AppCompatActivity implements CancelAdapt {
}
- 自定義Fragment
Fragment 的自定義方式和 Activity 是一樣的塔鳍,只不過在使用前需要先在 App 初始化時開啟對 Fragment 的支持
AutoSizeConfig.getInstance().setCustomFragment(true);
- 實現(xiàn) CustomAdapt
public class CustomAdaptFragment extends Fragment implements CustomAdapt {
@Override
public boolean isBaseOnWidth() {
return false;
}
@Override
public float getSizeInDp() {
return 667;
}
}
- 實現(xiàn) CancelAdapt
public class CancelAdaptFragment extends Fragment implements CancelAdapt {
}
萬能解決方案
在任何情況下本來適配正常的布局突然出現(xiàn)適配失效伯铣,適配異常等問題,只要重寫 Activity 的 getResources() 方法即可轮纫,如果是 Dialog腔寡、PopupWindow 等控件出現(xiàn)適配失效或適配異常,同樣在每次 show() 之前調用 AutoSize#autoConvertDensity() 即可掌唾。
解決方案來自:Blankj
@Override
public Resources getResources() {
//需要升級到 v1.1.2 及以上版本才能使用 AutoSizeCompat
AutoSizeCompat.autoConvertDensityOfGlobal((super.getResources());//如果沒有自定義需求用這個方法
AutoSizeCompat.autoConvertDensity((super.getResources(), 667, false);//如果有自定義需求就用這個方法
return super.getResources();
}
總結
到目前為止我們已經掌握了AndroidAutoSize的基本使用放前,但是這個框架怎么實現(xiàn)的屏幕適配我們還得自己去看源碼。