Android適配自己總結的心德 & 同時適配手機和平板 & 同時適配橫豎屏幕切換

前言:關於這個問題就設計到了很多單位了,什麼px、pt、dp、sp,手機尺寸,ppi等等,我這裏只介紹我解除過比較靠譜的。如果你有更好的屏幕適配方案,請在評論區留下鏈接。非常感謝

一、最小寬度 限定符(推薦)

什麼是最小寬度限定符,先看看我的截圖把:

沒錯,以values-sw360dp 這種結尾的文件夾,和你項目裏的values文件處於同一級。

我簡單用我的話理解下:google推薦使用的單位是dp(就像蘋果推薦使用的單位是pt一樣),這裏的意思是屏幕密度的意思。聽到密度就知道了。雖然各大android尺寸分辨率很多,但是用密度衡量的話,會顯得很少。簡單的話來說就是:1寸的屏幕裏,像素點是一樣的

1.1、感謝大神插件ScreenMatch

詳細鏈接,感謝

當你會使用ScreenMatch插件後,我稍微講下screenMatch.properties這個文件,是插件自動生成的:

點開的是這樣的

############################################################################
#
# You need to refresh or reopen the project every time you modify the configuration,
# or you can't get the latest configuration parameters.
#
#############################################################################
#
# Base dp value for screen match. Cut the screen into [base_dp] parts.
# Data type is double. System default value is 360.
# I advise you not to modify the value, be careful !!!!!!!!! _^_  *_*
# 設計圖上最小的寬度的基準值。意思就是滿屏時是360dp
base_dp=360
# Also need to match the phone screen of [match_dp].
# If you have another dp values.
# System default values is 320,360,384,392.7272,400,410,411.4285,432,480,533,592,600,640,662,720,768,800,811,820,960,961,1024,1280,1365
# 要適配的最小寬度有哪些寬度
match_dp=320,360,384,392.7272,400,410,411.4285,432,480,533,592,600,640
# If you not wanna to match dp values above. Write some above values here, append value with "," .
# For example: 811,961,1365
# 需要忽略適配的寬度有哪些
ignore_dp=662,720,768,800,811,820,960,961,1024,1280,1365
# They're not android module name. If has more,split with , Symbol.
# If you set, it will not show in SelectDialog.
# If you have, write here and append value with "," .
# For example: testLibrary,commonModule
  • base_dp=360 這裏上面寫的是你設計圖上滿屏的dp值。只要設置之後,手機上適配,控件的大小就可以溫泉按照設計圖走。超方便
  • match_dp=320,360,384,392.7272,400,410,411.4285,432,480,533,592,600,640 要適配的最小寬度有哪些寬度
  • ignore_dp=662,720,768,800,811,820,960,961,1024,1280,1365 需要忽略適配的寬度有哪些

1.2、同時適配 手機 & 平板

首先我們要知道一點,同時要適配手機和平板,這裏應該有2套佈局。做一套手機的做一套平板的。知道這個就好辦了。我們都知道手機屏幕的大小一般在3英寸-5英寸之間,平板電腦的大小在7英寸-10英寸之間。所以手機會直接運行layout裏的佈局。我們再定義一個layout-sw600dp文件夾,與layout同一層。裏面的佈局就是平板佈局。當然你要更精細的可以協商不同尺寸的文件夾。如下

這樣的話運行在手機上,會走layout。運行在平板會走layout-sw600dp。你可以放2套不同的佈局試試。但是你的layout的xml名稱要保持一致哦。

我首先運行在手機上,再運行在平板上。同一個項目,看效果


1.3、同時適配橫豎屏

當你會使用screenMatch插件裏,是不是生成了很多最小寬度限定符swXXdp的文件夾。之前也說了最小寬度限定符,是不區分橫豎屏,既最小那邊是最小寬度。那麼這樣的話在切換橫豎屏幕的時候是會混亂的。意思你再豎屏的時候設置了一個控件,佔屏幕寬度一半,但切換到橫屏時,卻沒有佔一半。具體怎麼做呢??

將插件生成的文件夾,前面的swXXdp的s去掉,變成wXXdp。,大致意思,當前方向就是最小寬度的方向,這裏區分了橫豎屏了。看下面效果(這裏配置好了,我什麼都沒幹,只是旋轉了手機,看適配效果):

這裏稍微提下,就不細講了。如果你想單獨爲橫屏或者豎屏幕適配一套,可以利用橫豎限定符

  • values-sw400dp-land (最小寬度 400 dp 橫向)
  • values-sw400dp-port (最小寬度 400 dp 縱向)

關於以上demo鏈接

二、屏幕分辨率限定符( 小心使用 )

什麼是屏幕分辨率限定符?

首先感謝張鴻洋的自動生成工具

但是經過我具體細緻的測試下,我發現問題大大的。首先這本身就是屏幕分辨率限定符的弊端。先看我的測試,我使用的真機測試機,

很明顯我的手機是1080 x 1920的分辨率。這裏我們從lay_x.xml分析就行了。首先我是以設計圖裏的寬度375去生成這些文件夾。
之後我在Activity裏放了2個控件,一個設置成@dimen/x375,另外一個設置成@dimen/x187。但是結果並不是,一個滿屏,一個半屏。之後我很奇怪所以我在Activity裏打印了當前@dimen/x375的長度,和屏幕當前寬度。結果是這樣的:

發現屏幕寬度確實是1080。但是@dimen/x375的值確是800。然後我那一堆values文件夾裏去找,找到了values-1280x800文件夾裏是800px。但是我就有點奇怪了。既然有values-1920x1080文件夾。爲什麼不走呢??!!我後面怒刪values-1280x800文件夾。結果走的是values-1280x768。我整個人都震驚了,震驚了。我在想,我以前某些項目豈不是坑爹了。!!後面繼續怒刪values-1280x768文件夾。結果刪了一個遍,系統一直去往上找。就是不找1920x1080。沒辦法繼續去找資料瞭解這個機制。直接給鏈接吧

被誤用的屏幕分辨率限定符
Android 屏幕適配,比較全的方案

個人建議屏幕分辨率限定符還是小心使用吧。不像screenMathch那樣能經受的住考驗。如果你有更好的屏幕適配方法,請在評論區留下鏈接。一起加油進步。3q

三、今日頭條屏幕適配方案

今日頭條屏幕適配方案終極版,一個極低成本的 Android 屏幕適配方案

字節跳動官方文章
小結:經過實際測試和大量虛擬機測試,今日頭條是以360dp爲例,且以160dpi爲例。不改代碼直接去試。設置了360dp後,如果屬於160dpi的手機確實正常,但是不是160的dpi卻不是滿屏。且如果動態獲取dpi:appDisplayMetrics.densityDpi。卻發現還是不能實現如官網文章所說的效果。是我忽略什麼了嗎?而且全it平臺全是以官網文章爲例子,360和160。大家真的用了多種機型測試過嗎。希望有比較瞭解的,能解決我的疑惑!!!

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