日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

安卓屏幕适配方案(根据今日头条方案,升级版)

發布時間:2025/3/21 编程问答 59 豆豆
生活随笔 收集整理的這篇文章主要介紹了 安卓屏幕适配方案(根据今日头条方案,升级版) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

前言

屏幕適配方案有很多,比如原生的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變得偏小

某些可以避免的坑

  • 字體單位的坑,sp可以通過修改scaledDensity屬性來修改,不過為了防止用戶調節字體導致字體顯示不全,所以推薦使用dp,而不用去修改scaledDensity屬性
  • 聽說8.0手機無效,不過我在自己的8.0手機上可以(華為)
  • 本方案對純豎屏應用支持較好,若是純橫屏或橫豎屏相交叉的話需要自行修改方法即可
  • 擴展

    由于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,則可以解決上述問題

    親測可以使用,并且適配三方框架,也不會影響到系統控件;但,該方案缺點也有,所以該方案僅供參考

  • 預覽慘不忍睹,因為in單位是英寸,手機才幾英寸,而View的值動不動就是幾十幾百的,預覽時基本上就是一個控件占滿屏幕
  • 由于本人只是測試了該方案(n多種情況下),但是并沒有正式用在項目上,所以會不會出現奇葩情況也不得而知
  • 由于修改了xdpi,測試過程中并沒有什么其他變化,但目前不清楚修改后會不會有其他的影響(查看源碼看到引用該值的地方并不多)
  • 由于該操作屬于比較騷的操作,所以可能不會得到認可(哈哈)
  • 所以上面的幾種方案需要自行選擇判斷

    ?

    轉載請帶上本文鏈接,然后點個贊

    總結

    以上是生活随笔為你收集整理的安卓屏幕适配方案(根据今日头条方案,升级版)的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。