今日頭條屏幕適配方案終極版 AndroidAutoSize

A low-cost Android screen adaptation solution (今日頭條屏幕適配方案終極版,一個極低成本的 Android 屏幕適配方案).

Overview

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:

Notice

  • 主流機型設備信息,可以作爲參考

  • 原理分析

  • 對於老項目的使用,AndroidAutoSize 可以和 AndroidAutoLayout 一起使用,因爲 AndroidAutoLayout 使用的是 px,所以 AndroidAutoSize 對它不會產生任何影響,如果老項目的某些頁面之前使用了 dp 進行佈局,並且 AndroidAutoSize 對這些頁面已經產生了不良影響,可以讓之前使用了 dp 的舊 Activity 實現 CancelAdapt 取消適配,建議使用副單位,使用副單位則不會影響之前使用了 dp 的頁面 (也不會影響三方庫和系統控件),詳情請查看 demo-subunits

Download

 implementation 'me.jessyan:autosize:0.9.1'

Usage

Step 1 (真的不吹牛逼,只需要以下這一步,框架就可以對項目中的所有頁面進行適配)

  • 請在 AndroidManifest 中填寫全局設計圖尺寸 (單位 dp),如果使用副單位,則可以直接填寫像素尺寸,不需要再將像素轉化爲 dp,詳情請查看 demo-subunits
<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>

 

Preview

  • 佈局時的實時預覽在開發階段是一個很重要的環節,很多情況下 Android Studio 提供的默認預覽設備並不能完全展示我們的設計圖,所以我們就需要自己創建模擬設備,下面就介紹下 dp、pt、in、mm 這四種單位的模擬設備創建方法

  • 如果您在預覽時不希望在 Preview 中出現狀態欄和導航欄, 則可以根據下圖選擇 panel 主題,使用該主題後縱向分辨率剛好填充整個預覽頁面,顯示效果完全和設計圖一致

  • 爲了方便廣大新手,所以還是將創建模擬設備的步驟貼出來,爲大家操碎了心,如果覺得 AndroidAutoSize 不錯,請一定記得 star,並將 AndroidAutoSize 推薦給您的夥伴們

DP

  • 如果您在 layout 文件中使用 dp 作爲單位進行佈局 (AndroidAutoSize 默認支持 dp、sp 進行佈局),則可以根據公式 (sqrt(縱向分辨率^2+橫向分辨率^2))/dpi 求出屏幕尺寸,然後創建模擬設備 (只用填寫屏幕尺寸和分辨率)

PT

  • 如果您在 layout 文件中使用 pt 作爲單位進行佈局 (需要通過 AutoSizeConfig.getInstance().getUnitsManager().setSupportSubunits(Subunits.PT); 打開對單位 pt 的支持),則可以根據公式 (sqrt(縱向分辨率^2+橫向分辨率^2))/72 求出屏幕尺寸,然後創建模擬設備 (只用填寫屏幕尺寸和分辨率)

IN

  • 如果您在 layout 文件中使用 in 作爲單位進行佈局 (需要通過 AutoSizeConfig.getInstance().getUnitsManager().setSupportSubunits(Subunits.IN); 打開對單位 in 的支持),則可以根據公式 sqrt(縱向分辨率^2+橫向分辨率^2) 求出屏幕尺寸,然後創建模擬設備 (只用填寫屏幕尺寸和分辨率)

MM

  • 如果您在 layout 文件中使用 mm 作爲單位進行佈局 (需要通過 AutoSizeConfig.getInstance().getUnitsManager().setSupportSubunits(Subunits.MM); 打開對單位 mm 的支持),則可以根據公式 (sqrt(縱向分辨率^2+橫向分辨率^2))/25.4 求出屏幕尺寸,然後創建模擬設備 (只用填寫屏幕尺寸和分辨率)

Advanced (以下用法看不懂?答應我,認真看 demo 好不好?)

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 {

}

Subunits (請認真看 demo-subunits,裏面有詳細介紹)

  • 可以在 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.** { *; }

Donate

About Me

License

 Copyright 2018, jessyan

   Licensed under the Apache License, Version 2.0 (the "License");
   you may not use this file except in compliance with the License.
   You may obtain a copy of the License at

       http://www.apache.org/licenses/LICENSE-2.0

   Unless required by applicable law or agreed to in writing, software
   distributed under the License is distributed on an "AS IS" BASIS,
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   See the License for the specific language governing permissions and
   limitations under the License.

項目地址:https://github.com/JessYanCoding/AndroidAutoSize

 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章