Android屏幕適配框架-(今日頭條終極適配方案)


 

在Android開發中,屏幕適配是一個非常頭痛的問題,因而為了去進行屏幕適配,作為程序員,是嘔心瀝血,歷經磨難,哈哈

我們之前做屏幕適配一般都會用到一下兩種方式:

  1. 第一種就是寬高限定符適配,什么是寬高限定符適配呢

    ├── src/main
    │   ├── res
    │   ├── ├──values
    │   ├── ├──values-800x480
    │   ├── ├──values-860x540
    │   ├── ├──values-1024x600
    │   ├── ├──values-1024x768
    │   ├── ├──...
    │   ├── ├──values-2560x1440
  2. 就是這種,在資源文件下生成不同分辨率的資源文件,然后在布局文件中引用對應的 dimens,大家一定還有印象

  3. 第二種就是 鴻神 的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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM