Android螢幕適配框架-(今日頭條終極適配方案)
在Android開發中,因為碎片化的問題,螢幕適配是一個非常頭痛的問題,因而為了去進行螢幕適配,作為程式員,是嘔心瀝血,歷經磨難,哈哈
我們之前做螢幕適配一般都會用到一下兩種方式:
-
第一種就是寬高限定符適配,什麼是寬高限定符適配呢
├── src/main
│├── res
│├── ├──values
│├── ├──values-800x480
│├── ├──values-860x540
│├── ├──values-1024x600
│├── ├──values-1024x768
│├── ├──...
│├── ├──values-2560x1440 -
就是這種,在資原始檔下生成不同解析度的資原始檔,然後在佈局檔案中引用對應的 dimens,大家一定還有印象
-
第二種就是 鴻神 的AndroidAutoLayout
這兩種方案都已經逐漸退出了歷史的舞臺,為什麼想必大家都知道,不知道的建議看看 拉丁吳 老師的文章,現在最主流的兩種螢幕適配方案,今日頭條適配方案和 smallestWidth 限定符適配方案,下面介紹一個框架,採用的是今日頭條適配方案傳送門
框架使用效果
使用方式
第一步: 在module的build.gradle檔案下做如下依賴
implementation 'me.jessyan:autosize:0.9.5'
第二步: 在 AndroidManifest 中填寫全域性設計圖尺寸 (單位 dp),如果使用副單位,則可以直接填寫畫素尺寸,不需要再將畫素轉化為 dp
<manifest>
<application>
<meta-data
android:name="design_width_in_dp"
android:value="360"/>
<meta-data
android:name="design_height_in_dp"
android:value="640"/>
</application>
</manifest>
經過上面兩個步驟,框架就對你所有的頁面進行適配了
當我們的設計圖尺寸與在 AndroidManifest 中填寫的全域性設計圖尺寸不同時,我們可以對具體頁面進行手動適配
Activity
-
當某個 Activity 的設計圖尺寸與在 AndroidManifest 中填寫的全域性設計圖尺寸不同時,可以實現 CustomAdapt 介面擴充套件適配引數:
public class CustomAdaptActivity extends AppCompatActivity implements CustomAdapt {
@Override
public boolean isBaseOnWidth() {
return false;
}
@Override
public float getSizeInDp() {
return 667;
}
} -
當某個 Activity 想放棄適配,請實現 CancelAdapt 介面:
-
public class CancelAdaptActivity extends AppCompatActivity implements CancelAdapt {
}
Fragment
-
首先開啟支援 Fragment 自定義引數的功能
AutoSizeConfig.getInstance().setCustomFragment(true);
-
當某個 Fragment 的設計圖尺寸與在 AndroidManifest 中填寫的全域性設計圖尺寸不同時,可以實現 CustomAdapt 介面擴充套件適配引數:
public class CustomAdaptFragment extends Fragment implements CustomAdapt {
@Override
public boolean isBaseOnWidth() {
return false;
}
@Override
public float getSizeInDp() {
return 667;
}
} -
當某個 Fragment 想放棄適配,請實現 CancelAdapt 介面:
public class CancelAdaptFragment extends Fragment implements CancelAdapt {
}可以在 pt、in、mm 這三個冷門單位中,選擇一個作為副單位,副單位是用於規避修改 DisplayMetrics#density 所造成的對於其他使用 dp 佈局的系統控制元件或三方庫控制元件的不良影響,使用副單位後可直接填寫設計圖上的畫素尺寸,不需要再將畫素轉化為 dp
AutoSizeConfig.getInstance().getUnitsManager()
.setSupportDP(false)
.setSupportSP(false)
.setSupportSubunits(Subunits.MM);
ProGuard
-keep class me.jessyan.autosize.** { *; }
-keep interface me.jessyan.autosize.** { *; }
專案地址:
https://github.com/sweetying520/AndroidAutoSizeDemo
原文釋出時間為:2018-09-26
本文作者:妖孽那裡逃