① android 屏幕適配
摘自: https://www.jianshu.com/p/ec5a1a30694b
摘自: https://www.jianshu.com/p/337c47721690
摘自: https://www.jianshu.com/p/4669814362ee
因為ui設計師給你的設計圖是以px為單位的,Android開發則是使用dp作為單位的,那麼我們需要進行轉換:
擴展:
Android屏幕適配-基礎篇
Android推薦使用dp作為尺寸單位來適配UI ,通過dp加上自適應布局和weight比例布局可以基本解決不同手機上適配的問題,這基本是最原始的Android適配方案。
缺點:
(1)這種方案只能保證我們寫出來的界面適配絕大部分手機,部分手機仍然需要單獨適配,但dpi的不同,還是會存在差異。
(2)一般的設計稿都是以px為單位的,所以我們在寫layout文件的時候需要將px轉為dp,影響開發效率。
為了高效的實現UI開發,出現了新的適配方案,我把它稱作寬高限定符適配。簡單說,就是模仿市面上所有的Android手機的寬高像素值,設定一個基準的解析度,其他解析度都根據這個基準解析度來計算,在不同的尺寸文件夾內部,根據該尺寸編寫對應的dimens文件:
鴻洋大神的作品 ,使用也超級簡單,核心功能就是在繪制的時候在onMeasure裡面做變換,重新計算px。
缺點:
我們自定義的控制項可能會被影響或限制,可能有些特定的控制項(框架沒有做適配的控制項),需要單獨適配。
小結:上述幾種適配方案都是實際開發中用過的方案,但隨著技術不斷的更新,出現了更好的適配方案。
1.SmallestWidth適配(sw限定符適配)
實現原理:
Android會識別屏幕可用高度和寬度的最小尺寸的dp值(其實就是手機的寬度值),然後根據識別到的結果去資源文件中尋找對應限定符的文件夾下的資源文件。
sw限定符適配 和 寬高限定符適配 類似,區別在於,前者有很好的容錯機制,如果沒有value-sw360dp文件夾,系統會向下尋找,比如離360dp最近的只有value-sw350dp,那麼Android就會選擇value-sw350dp文件夾下面的資源文件。這個特性就完美的解決了上文提到的寬高限定符的容錯問
優點:
1.非常穩定,極低概率出現意外
2.不會有任何性能的損耗
3.適配范圍可自由控制,不會影響其他三方庫
缺點:
就是多個dimens文件可能導致apk變大,幾百k。
這里有個問題:
在項目的其他 mole 中怎麼實現適配?難道也要多套 dimens 文件?
解答:
並不需要多套 dimens 文件,只需要在 values 文件夾下有一套與 app mole 一樣的 dimens 文件即可達到適配。因為經過編譯,所有 mole 中的 dimen 數據都會統一歸類到主 mole(即 app mole)中的 values/dimens.xml 文件中了,然後系統又會根據你設置的值去找對應 values-swxxxdp 文件夾下的dimens.xml 文件中的值。
附件: [生成sw文件的工具]( https://links.jianshu.com/go ?
to=https%3A%2F%2Fgithub.com%2Fladingwu%2Fdimens_sw)
實現原理:修改系統的density值(核心)
今日頭條適配是以設計圖的寬或高進行適配的,適配最終是改變系統density實現的。
過程:
缺點:
1.只需要修改一次 density,項目中的所有地方都會自動適配,這個看似解放了雙手,減少了很多操作,但是實際上反應了一個缺點,那就是只能一刀切的將整個項目進行適配,但適配范圍是不可控的。
2.這個方案依賴於設計圖尺寸,但是項目中的系統控制項、三方庫控制項、等非我們項目自身設計的控制項,它們的設計圖尺寸並不會和我們項目自身的設
AndroidAutoSize 是基於今日頭條適配方案,該開源庫已經很大程度上解決了今日頭條適配方案的兩個缺點,可以對activity,fragment進行取消適配。也是目前我的項目中所使用的適配方案。
使用也非常簡單只需兩步:
第一步: 導入依賴
第二步: 配置AndroidManifest
在 AndroidManifest 中填寫全局設計圖尺寸 (單位 dp),如果使用副單位,則可以直接填寫像素尺寸,不需要再將像素轉化為 dp,詳情請查看 demo-subunits
老師給的UI設計是在藍湖上的,因為還沒工作,接觸就藍湖,SW個人感覺好處就是藍湖上尺寸多少你就寫多少就行
② android 怎樣pixes轉化程dp
在android中為了適應不同解析度的屏幕,引入了密度無關像素density-independent pixes,也就是dip,也可以簡寫為dp。之所以是與密度無關,是因為android為不同的密度提供了不同的scale值,比如mdpi的值為1,hdpi為1.5,xhdpi為2.這樣,如果使用相同的dp值,系統在轉換為px時,會使用dp*scale值,這樣得到的比例大家都相同,而比例相同了,也就意味著屏幕適配了。如480*800,4.0inch的屏幕,為hdpi。屏幕的一半可以用160dp表示,其px = 160 * 1.5 = 240px,恰好為480的一半。而320*640的 3.5inch的屏幕,為mdpi。屏幕的一半也是160dp,其px = 160 * 1 = 160px,恰好為320的一半。這樣dp就實現了不同屏幕的適配。
但是現在xhdpi的屏幕也很普遍,比如720*1280 4.5inch的屏幕,其scale值為2,所以整個屏幕為360dp,這樣與hdpi和mdpi就不太相同了,用dp表示比例就有些誤差了。不過這種誤差也是在可以接受的范圍之內。
上面所說的都是以屏幕寬度為基準,因為ui設計時也是盡量已寬度為基準,如果以高度為基準,dp值表示的比例就相差更大了。
而對於平板很多情況下以高度作為標准。都是hdpi的平板其寬高就更不一樣了。比如高度分別是1200和1600的平板,都是hdpi。這就意味著如果是表示一半的高度,dp值分別為400dp和533,相差如此之大,所以用dp來布局顯然不再適用。
解決方法:
既然dp的引入其實就是為了用同一個dp值表示相同的比例,那麼我們其實可以直接用比例表示(dp的本質也是比例,只不過scale的劃分無法面面俱到)。當然前提是不同的屏幕比例不能相差過大,比如橫屏和豎屏就無法通用,需要寫兩個layout
例如ui給一張設計圖,尺寸為2560 * 1920,其長寬比為4:3. 所有的標注均以該尺寸為准。這樣為了能夠通用這些標注,不必手動計算,可以定義如下個方法
private int px_x(float px) {//以寬度為基準計算x方向上的比例
return (int)(px / 2560 * mScreenHight);
}
private int px_y(float px) {
return (int)(px / 1920* mScreenWidth);
}
這樣在代碼中重新設置一下跟尺寸相關的屬性即可以保證相關內容可以適配到不同尺寸的屏幕上。
需要注意的是:
這樣寫的一個缺點就是無法再xml里的layout中直接定義好布局。尤其是各個控制項之間的距離。不過xml並非沒有用處,可以通過xml很方便的定義控制項直接的相對位置,比如above,below等屬性,這樣在代碼中就不必重復定義了。可以通過 view.getLayoutParameters()方法獲取到布局屬性,然後覆蓋與尺寸相關的內容即可。(註:不可以用new parameter()的方法,這樣會完全覆蓋xml中的設置)
③ 一種非常好用的Android屏幕適配
網上關於屏幕適配的文章已經鋪天蓋地了,為什麼我還要講?因為網上現在基本都是使用 屏幕解析度限定符 進行適配,即每種屏幕解析度的設備需要定義一套 dimens.xml 文件。由於不同解析度的設備太多了,而且有些設備還有虛擬按鍵(例如華為手機),這樣就還需要每個有虛擬按鍵的設備加多一套 dimens.xml 文件,再加上平板那些你會發現 dimens.xml 文件所佔的體積已經超過 2M 了!這絕對不是我們想要的。
我這里要講的是使用 sw<N>dp 限定符,即 smallestWidth(最小寬度) 限定符 來進行適配,使用這種方式只需要少量 dimens.xml 文件即可達到適配,而且根本不用考慮虛擬按鍵的問題。如果只適配手機,dimens.xml 文件所佔的體積只有 100 多 KB,即使加上平板和 TV,也就 500 多 KB,完全可以接收。這種方案已經在自己多個項目中應用過了,經過幾十台手機測試過,基本不會出現適配有問題的情況。製作生成對應 dimens.xml 文件插件(後面會講)的作者也說過他在待過的兩家大公司實踐過,所以請放心使用。
關於為什麼要進行屏幕適配,什麼是 dp、dpi 這些概念我就不去一一講解了,網上很多文章。這里我推薦幾篇講的比較好的:
屏幕解析度限定符適配需要在 res 文件夾下創建各種屏幕解析度對應的 values-xxx 文件夾,如下圖:
然後根據一個基準解析度,例如基準解析度為 1280x720,將寬度分成 720 份,取值為 1px~720px,將高度分成 1280 份,取值為 1px~1280px,生成各種解析度對應的 dimens.xml 文件。如下分別為解析度 1280x720 與 1920x1080 所對應的橫向 dimens.xml 文件:
假設設計圖上的一個控制項的寬度為 720px,那麼布局中就寫 android:layout_width="@dimen/x720" ,當運行程序的時候,系統會根據設備的解析度去尋找對應的 dimens.xml 文件。例如運行在解析度為 1280x720 的設備上,系統會自動找到對應的 values-1280x720 文件夾下的 lay_x.xml 文件,由上圖可知 x720 對應的值為
720.px,可鋪滿該屏幕寬度。運行在解析度為 1920x1080 的設備上,系統會自動找到對應的 values-1920x1080 文件夾下的 lay_x.xml 文件,由上圖可知 x720 對應的值為 1080.0px,可鋪滿該屏幕寬度。這樣就達到了屏幕適配的要求!
smallestWidth 限定符適配原理與屏幕解析度限定符適配原理一樣,系統都是根據限定符去尋找對應的 dimens.xml 文件。例如程序運行在最小寬度為 360dp 的設備上,系統會自動找到對應的 values-sw360dp 文件夾下的 dimens.xml 文件。區別就在於屏幕解析度限定符適配是拿 px 值等比例縮放,而 smallestWidth 限定符適配是拿 dp 值來等比縮放而已。需要注意的是「最小寬度」是不區分方向的,即無論是寬度還是高度,哪一邊小就認為哪一邊是「最小寬度」。如下分別為最小寬度為 360dp 與最小寬度為 640dp 所對應的 dimens.xml 文件:
ScreenUtils——> ScreenUtils
既然原理都一樣,都需要多套 dimens.xml 文件,那為什麼要選擇 smallestWidth 限定符適配呢?
大多數 UI 設計師提供的設計圖無非就幾種,它們對應的獲取方式如下:
這些文件當然不會手動去寫,網上已經有大神提供了自動生成這些文件的插件 ScreenMatch 。但是這個插件還是有點問題的:
基於以上問題,我在該插件的源碼上優化生成了新的插件 ScreenMatch ,由於插件庫已經有原作者的插件了,所以我就不重復造輪子上傳到插件庫了,你直接用本地安裝的方式安裝即可。
工具使用步驟:
然後選擇在哪個 mole 下執行適配。即基於哪個 mole 下的 res/values/dimens.xml 文件作為基準 dimens.xml 文件,生成的其他尺寸 dimens.xml 文件放在哪個 mole 下。例如選擇 app,然後點擊 OK ,出現如下界面表示生成文件成功。如下圖:
然後再看看 res 目錄下會自動生成一堆 dimens.xml 文件,如下圖:
通過上面的步驟就已經生成了所有設備對應的 dimens.xml 文件。
步驟 3 是以插件默認的最小寬度基準值為 360dp,適配的設備最小寬度為
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(包含了平板和 TV )生成的文件,但實際情況要根據設計圖和需求設置。
例如設計圖的最小寬度為 375dp,則需要更改最小寬度基準值為 375dp。如果項目只需要適配手機的話,適配的設備最小寬度保留 320,360,384,392.7272,400,410,411.4285,432,480 即可,若發現手機還有其他最小寬度自行加上即可,也麻煩把該最小寬度提供給我,我們一起來完善該份適配。
以上修改需要在配置文件里修改,即 screenMatch.properties 文件,該配置文件是執行完上面第 3 步後自動生成在項目的跟目錄下的。如下圖:
打開配置文件,修改下圖中 1、3、4 的值即可。(圖中單位均為 dp)
1:最小寬度基準值,填寫設計圖的最小寬度值即可。
2:插件默認適配的最小寬度值,即默認情況下會生成如下值的 dimens.xml 文件。
3:需要適配的最小寬度值(如果是小數,則保留 4 位小數。例如 392.727272...,則取 392.7272),即你想生成哪些 dimens.xml 文件。
4:忽略不需要適配的最小寬度值,即忽略掉插件默認生成的 dimens.xml 文件。
配置文件修改完成後,重新執行第 3 步,生成新的 dimens.xml 文件。
當然!如果你的設計圖也是標準的 360dp,那麼上面的步驟你可以忽略。直接復制我 github 上你需要的 dimens.xml 文件到你的項目即可, 默認的 values 文件夾下也需要一份 。
設計圖標注多少 dp,布局中就寫多少 dp ,非常方便!
大多數 UI 設計師提供的設計圖無非就幾種,它們對應的使用方式如下:
說了這么多,其實只需要簡單的 2 步:
很多人肯定會有疑問,難道我用了這套適配方案就可以全部直接寫死寬高了?那肯定不是的,如果一些好用的適配技巧能實現的,那就不要用直接寫死寬高的方式。這套適配方案搭配下面這些適配技巧可以讓你的屏幕適配更完美。
絕對布局(AbsoluteLayout)直接使用 X、Y 坐標來控制控制項的位置,對於屏幕碎片化這么嚴重的今天,使用絕對布局對於屏幕適配來說就是災難性的,所以 Google 已經廢棄了該控制項。
相對布局(RelativeLayout)或者約束布局(ConstraintLayout)就不一樣了,相對布局的子控制項之間使用 相對位置 的方式排列,即使屏幕的大小改變,控制項的相對位置也不會變化,與屏幕大小無關,靈活性很強。約束布局也是類似的,通過對某些控制項進行約束來確定它們之間的位置。
Nine-Patch 圖片是一種被特殊處理過的 PNG 圖片,你可以指定哪些區域可以拉伸而哪些區域不可以。例如聊天界面中的聊天氣泡背景圖就需要做成 Nine-Patch 圖片,因為每條消息的字數不是固定的,如果背景圖片不能隨著字數的長短進行縮放,那麼就會導致背景圖片變形。
因為各種屏幕高寬比並不是固定的,有 16:9、4:3,還有全面屏的 19.5:9 等等,如果強行將寬高都適配那隻會導致布局變形。
例如一個控制項的寬高為 360dp 和 640dp,如果將它顯示在寬高為 360dp 和 640dp 的設備上是正常鋪滿整個屏幕的,但是顯示在寬高為 360dp 和 780dp 的設備上高度則不能鋪滿,如果你讓高度鋪滿,而寬度又保持不變,那就會出現變形的情況。所以這也就是為什麼目前市面上的屏幕適配方案只能以寬或高一個維度去適配,另一個方向用滑動或權重的方式去適配的原因。
那你為什麼說高度也能適配呢?
這里說的高度也能適配指的是在不同解析度和密度的手機上能達到等比縮放的適配,其他屏幕適配方案也是一樣的。
注意:smallestWidth 限定符適配的效果是讓不同解析度和密度的設備上能達到以設計圖等比縮放的適配,如果設備與設計圖相差太大時並不能達到很好的適配效果,需要單獨出圖,其他屏幕適配方案也是一樣的。
同橫屏道理一樣,平板、TV 與手機的寬高差距太大,想要平板、TV 也能完全適配,那就只能讓設計師出一套平板、TV 的設計圖,然後單獨寫一套平板、TV 的布局文件。
注意:再說一遍,smallestWidth 限定符適配的效果是讓不同解析度和密度的設備上能達到以設計圖等比縮放的適配,如果設備與設計圖相差太大時並不能達到很好的適配效果,需要單獨出圖,其他屏幕適配方案也是一樣的。
github 地址: ScreenAdaptation
參考資料:
④ Android屏幕適配—被偷走的dp
DPI概念自行網路
Android手機按照不同DPI分為:ldpi、mdpi、 hdpi、 xhdpi、 xxhdpi等。
在不同的DPI上,px和dp有不同的比例關系,關系如下
由上表可知:
目前主流的解析度一般為720x1280和1080x1920,所以一般設計師在設計Android應用時會選擇720x1280的畫布進行設計,如果只切一套圖,工程師會把圖放到xhdpi的資源文件夾中,此時,在xhdpi和xxhdpi的屏幕上都可以正常適配,但是在hdpi的屏幕上就會出現問題。
從上面的表格可以知道在xhdpi和xxhdpi時,屏幕的dp寬都是360dp;而在480x800的hdpi時,屏幕的dp寬度是320dp,少了40個dp,如果屏幕的dp寬度保持360dp的話,需要的像素寬度應該是540px,但市面上大部分的hdpi的手機都是480px的像素寬度。
為了適配480x800的手機屏幕,需要設計師在切圖的時候也要切出一套hdpi的圖,並且是480*800解析度下的hdpi的圖。
另外在寫布局文件設置寬度的時候,也要需要考慮這個差值,hdpi下的dp寬度應該是xhdpi或xxhdpi下的dp寬度的0.8~0.9倍
⑤ vivos9最小寬度是多少dp
S9機型最小寬度值是360dp,建議不要使用代碼操作手機,也不要修改開發者模式中的設置,以免手機使用出現異常;在手機的使用過程中有疑惑,可進入vivo官網--我的--在線客服--輸入人工,咨詢在線客服反饋。
⑥ android的gridview的問題
layout_height被設定後是不會按比例縮小的,若想按比例變化高度,可設置layout_weight比重的值
⑦ Android屏幕適配-應用篇
Android屏幕適配-基礎篇
Android屏幕適配-應用篇
從兩個大方面闡述一下Android的屏幕適配:
Android推薦使用dp作為尺寸單位來適配UI ,通過dp加上自適應布局和weight比例布局可以基本解決不同手機上適配的問題,這基本是最原始的Android適配方案。
缺點 :
(1)這種方案只能保證我們寫出來的界面適配絕大部分手機,部分手機仍然需要單獨適配,但dpi的不同,還是會存在差異。
(2)一般的設計稿都是以px為單位的,所以我們在寫layout文件的時候需要將px轉為dp,影響開發效率。
為了高效的實現UI開發,出現了新的適配方案,我把它稱作寬高限定符適配。簡單說,就是窮舉市面上所有的Android手機的寬高像素值,設定一個基準的解析度,其他解析度都根據這個基準解析度來計算,在不同的尺寸文件夾內部,根據該尺寸編寫對應的dimens文件:
鴻洋大神的作品 ,使用也超級簡單,核心功能就是在繪制的時候在onMeasure裡面做變換,重新計算px。
缺點 :我們自定義的控制項可能會被影響或限制,可能有些特定的控制項(框架沒有做適配的控制項),需要單獨適配。
小結:上述幾種適配方案都是實際開發中用過的方案,但隨著技術不斷的更新,出現了更好的適配方案。
實現原理 :Android會識別屏幕可用高度和寬度的最小尺寸的dp值( 其實就是手機的寬度值 ),然後根據識別到的結果去資源文件中尋找對應限定符的文件夾下的資源文件。
sw限定符適配 和 寬高限定符適配 類似,區別在於,前者有很好的容錯機制,如果沒有value-sw360dp文件夾,系統會向下尋找,比如離360dp最近的只有value-sw350dp,那麼Android就會選擇value-sw350dp文件夾下面的資源文件。這個特性就完美的解決了上文提到的寬高限定符的容錯問題。
優點: 1.非常穩定,極低概率出現意外
2.不會有任何性能的損耗
3.適配范圍可自由控制,不會影響其他三方庫
缺點 :就是多個dimens文件可能導致apk變大,幾百k。
附件: 生成sw文件的工具
實現原理 : 修改系統的density值 (核心)
今日頭條適配是以設計圖的寬或高進行適配的,適配最終是改變系統density實現的。
過程:
AndroidAutoSize 是基於今日頭條適配方案,該開源庫已經很大程度上解決了今日頭條適配方案的兩個缺點,可以對activity,fragment進行取消適配。也是目前我的項目中所使用的適配方案。
使用也非常簡單只需兩步:
(1)引入:
(2)在 AndroidManifest 中填寫全局設計圖尺寸 (單位 dp),如果使用副單位,則可以直接填寫像素尺寸,不需要再將像素轉化為 dp,詳情請查看 demo-subunits
⑧ 榮耀30最小寬度多少dp最好
榮耀30最小寬度360dp最好。
開發者選項裡面有個最小寬度顯示,很多人沒搞懂,dp是安卓開發裡面用來替代直接使用屏幕像素的一個單位,用它比直接用像素px。具體網路,它和像素換算關系為px=dp*(dpi/160)開發者選項裡面這個其實這個不是ppi,改完之後自己看看顯示那裡就知道了,等於四屏幕寬度為1080px,換算一下432dp對應400dpi,數字越小dpi越大。
首先打開 ,設置,然後找到 開發者選項 點擊打開。最後找到 最小寬度 ,隨著智能手機的進化手機屏幕也跟著越來越精緻,每款手機都有一個最佳最小寬度值;一般這個都是手機系統默認的,可以自行調控。
調控前最好記住手機系統默認值,以便後期自行改回初始值。
⑨ oppok3最小寬度360dp是啥意思
個人更喜歡OPPO K3手機哦。
OPPO硬核少年K3高能來襲~全系標配6.5 英寸的全景屏,搭載高通驍龍710處理器,全新光感屏幕指紋+升降式攝像頭+VOOC閃充3.0,前後1600萬像素AI拍照,更有超清夜景2.0,拍出夜的美。更多信息敬請關注OPPO官網。
本回答適用於OPPO所有機型。