在Android開發中,屏幕適配是一個非常頭痛的問題,因而為了去進行屏幕適配,作為程序員,是嘔心瀝血,歷經磨難,哈哈
我們之前做屏幕適配一般都會用到一下兩種方式:
-
第一種就是寬高限定符適配,什么是寬高限定符適配呢
├── src/main
│ ├── res
│ ├── ├──values
│ ├── ├──values-800x480
│ ├── ├──values-860x540
│ ├── ├──values-1024x600
│ ├── ├──values-1024x768
│ ├── ├──...
│ ├── ├──values-2560x1440 -
就是這種,在資源文件下生成不同分辨率的資源文件,然后在布局文件中引用對應的 dimens,大家一定還有印象
-
第二種就是 鴻神 的AndroidAutoLayout
這兩種方案都已經逐漸退出了歷史的舞台,為什么想必大家都知道,不知道的建議看看拉丁吳老師的文章,現在最主流的兩種屏幕適配方案,今日頭條適配方案和smallestWidth限定符適配方案,下面介紹一個框架,采用的是今日頭條適配方案傳送門
框架使用效果
Pixel 2 XL | 1440 x 2880 | 560dpi:
Pixel XL | 1440 x 2560 | 560dpi:
Nexus 5X | 1080 x 1920 | 420dpi:
Nexus 4 | 768 x 1280 | 320dpi:
Nexus S | 480 x 800 | 240dpi:
使用方式
第一步: 在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.** { *; }
github項目地址:https://github.com/JessYanCoding/AndroidAutoSize















