安卓屏幕适配方案(根据今日头条方案,升级版)
前言
屏幕適配方案有很多,比如原生的dp,鴻洋大神的AutoLayout,寬高限定符,今天我用缺點比較小的今日頭條方案
頭條適配方案的文章鏈接:https://mp.weixin.qq.com/s/d9QCoBP6kV9VSWvVldVVwA
使用效果
測試后可以適配我身邊的所有機型(其他的應該是都可以)
- 設置Activity后Activity可以適配
- 設置Activity后Activity內的Fragment可以適配
- 設置Activity后Activity內的RecyclerView可以適配
- 設置Activity后Activity彈出的Dialog可以適配
優缺點
優點:適配簡單,無侵入,調用簡單,未使用非官方api,不影響性能
缺點:基本可以通過騷操作來避免
使用方式
復制工具類
import android.app.Activity; import android.util.DisplayMetrics;/*** 創 建: lt 2018/8/15--14:45* 作 用: 使用并優化今日頭條的適配方案的工具類* 注意事項: 在Activity的onCreate里,并在setContextView之上調用,可以直接放在Base里*/public class FitUtil {private static float width = 750;//todo 手動設置為設計圖的寬(px),適配將根據寬為基準,也可以設置高,但是推薦設置寬,如果不需要px=dp則不設置也行private static int dpi = 375;//todo 手動設置設計圖的dpi,一般 xhdpi是寬/2 xxhdpi 是寬/3private static float nativeWidth = 0;//真實屏幕的寬,不需要手動改/*** 在Activity的onCreate中調用,修改該Activity的density,即可完成適配,使用寬高直接使用設計圖上px相等的dp值** @param activity 需要改變的Activity* @param isPxEqualsDp 是否需要設置為設計圖上的px直接在xml上寫dp值(意思就是不需要自己計算dp值,直接寫設計圖上的px值,并改單位為dp),但開啟后可能需要手動去設置ToolBar的大小,如果不用可以忽略*/public static void autoFit(Activity activity, boolean isPxEqualsDp) {if (nativeWidth == 0) {//保證取到的是真實的寬,而不是旋轉后的寬Point outSize = new Point();activity.getWindowManager().getDefaultDisplay().getSize(outSize);nativeWidth = Math.min(outSize.x, outSize.y);}DisplayMetrics displayMetrics = activity.getResources().getDisplayMetrics();displayMetrics.density = isPxEqualsDp ? nativeWidth / dpi / (width / dpi) : nativeWidth / dpi;displayMetrics.densityDpi = (int) (displayMetrics.density * 160);} }使用
在Activity的onCreate里,并在setContextView之上調用,可以直接放在Base里,比如:
public class BaseActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);FitUtil.autoFit(this,false);//this} }手動設置好UI給你的設計圖的寬和dp(請查看注釋自行計算)
單位用dp,字體單位也用dp,就可以自動適配了
需要注意方法的第二個參數
如果UI給你的圖紙是按照dp為單位,就設置為false,然后頁面上直接寫相應的dp值就ok
如果UI給你的圖紙是按照px為單位,就設置為true,然后頁面上寫對應的px值,但是單位寫成dp,相當于直接從UI設計圖上抄下來,很方便
但是推薦設置為false,如果設計圖紙是px為單位則自行計算,因為設置為true會使其他的三方View變得偏小
某些可以避免的坑
擴展
由于px=dp方案留有一些坑(三方View框架也會用到dp值,而部分無法手動去修改),所以該px=dp的方案并不推薦使用,但是若小伙伴又想如此適配,又想使用px=dp方案的話,接下來我會提供一下騷操作供參考
查看源碼可知,系統在使用距離值的時候會把所有的單位值轉換為px值來應用,而轉換方法如下:
TypedValue.java下 public static float applyDimension(int unit, float value,DisplayMetrics metrics){switch (unit) {case COMPLEX_UNIT_PX:return value;case COMPLEX_UNIT_DIP:return value * metrics.density;case COMPLEX_UNIT_SP:return value * metrics.scaledDensity;case COMPLEX_UNIT_PT:return value * metrics.xdpi * (1.0f/72);case COMPLEX_UNIT_IN:return value * metrics.xdpi;case COMPLEX_UNIT_MM:return value * metrics.xdpi * (1.0f/25.4f);}return 0;}可以看到系統提供了六種單位,上面就是修改了dp的計算系數來適配屏幕,而一些三方框架可能會使用dp,sp甚至是px來給View設置寬高,所以可以將目光放在基本不用的單位上
騷操作來了
我們可以使用in這個單位(英寸),修改方法:
public static void autoFit2(Activity activity, boolean isPxEqualsDp) {if (nativeWidth == 0) {nativeWidth = activity.getWindowManager().getDefaultDisplay().getWidth();}DisplayMetrics displayMetrics = activity.getResources().getDisplayMetrics();displayMetrics.xdpi = isPxEqualsDp ? nativeWidth / dpi / (width / dpi) : nativeWidth / dpi;}然后所有值抄設計圖上的,單位用in,則可以解決上述問題
親測可以使用,并且適配三方框架,也不會影響到系統控件;但,該方案缺點也有,所以該方案僅供參考
所以上面的幾種方案需要自行選擇判斷
?
轉載請帶上本文鏈接,然后點個贊
總結
以上是生活随笔為你收集整理的安卓屏幕适配方案(根据今日头条方案,升级版)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 图解八大排序算法
- 下一篇: android studio引用modu