史上最簡單易懂的Android Pad手機屏幕適配方案


Android屏幕千奇百怪,大小種類繁多。如果要適配所有的Android設備,不懂原理逐一適配的話確實是個吃力不討好的力氣活。下面的文章將分享一種超好用的Android屏幕適配方案,以及屏幕適配種需要注意的事項和適配原理

用dp和px的區別

  1. 大多數手機最小寬度的dp數都是360dp;但是屏幕的分辨率卻不盡相同,主流的分辨率(單位px)為:1080x1920,720x1280,480x800等
  2. 舉個例子解釋用dp和px的差異:
    • 需要通過xml實現的效果是:在分辨率為720x1280設備中實現一個充滿寬度屏幕的Button。
    • 在xml里寫一個ButtonA將寬度設為720px,另一個ButtonB寬度設為360dp;
    • 結果:安裝在分辨率720x1280的設備ButtonA,ButtonB效果相同,在1080x1920的設備ButtonA只占寬度的2/3,ButtonB充滿屏幕。
    • 分析:
    • 在1080x1920的設備中,1080/360=3;也就是1dp = 3px;
    • 在720x1080的設備中,720/360=2;也就是1dp = 2px;
    • 所以在分辨率為1080x1920的設備中,360dp =360*3px=1080,ButtonB充滿屏幕,ButtonA只占2/3;

用dp和sp的區別

如果app需要實現字體大小根據手機設置而改變的話用字體單位用sp表示,如果不需要實現這個功能的話可以直接用dp來表示字體大小。

如何根據ui設計圖將px轉為dp

綜上所述可以知道dp在android設備里的重要性了。

  • 在日常開發中為了方便適配其他設備需要將dp值寫在value/dimen文件中,而不是直接寫在布局中。
  • 如果設計師的設計圖是720*1080的話:1dp=2px;(720/360=2)
  • 下面將演示如何實現一個設計圖中寬為 60px 高為40px的按鈕:(60px=30dp,40px=20dp)
        <Button android:id="@+id/button1" android:layout_width="@dimen/dimen_30dp" android:layout_height="@dimen/dimen_20dp" /> 

注意 :ImageView 大小設置不要用wrap_content也轉為dp,圖片的加載與屏幕密度有關

適配pad和其他設備

  • 適配的原因:從理論上來講有了上面的適配,按鈕在dpi小的設備上占的px比較小,在dpi大的設備占的px比較大通過這種縮放后可以完成適配。但是安裝在pad或者一些特殊設備上,會發現ui比例會很奇怪。
  • 分析:在pad和其他設備中最小dp數不是上面所說的360dp了。從而導致寬為360dp的ButtonB,不能完全充滿屏幕。
  • 解決方案:如果您要適配的設備最小寬度是720dp:
    • 則新建values-sw720dp文件夾;
    • 然后在該文件夾中新建dimen.xml文件;
    • 拷貝之前在values文件夾下面的dimen值做值的映射,比如在values文件夾下是10dp則在values-sw720dp中改為20dp;
    • 根據以上步驟得到了values和values-720文件夾。將apk安裝在設備,如果該設備最小dp數大於720則取values-720dp文件夾下的dimen。如果小於則取values文件夾下的dimen值。
    • 缺陷:在上述操作中,如果遇到最小寬度為480的設備,適配還是會取values文件夾下面的dimen。目前的解決方案就是新建values-480dp的文件夾重新做映射但是操作起來比較麻煩。

介紹一個自動計算的插件:ScreenMatch

dimen插件的使用簡介

1. 安裝:setting——》plugins搜索插件ScreenMatch;安裝並重啟Android studio

 
屏幕快照 2018-05-29 下午6.39.56.png

2.一鍵適配
如果你是老項目:
1) 在任意文件夾下面右鍵點擊ScreenMatch。
 
屏幕快照 2018-05-29 下午6.42.28.png

 

2)選擇您要適配的項目。(確保該項目有dimen.xml文件)
3) 點擊OK生成, 會看到
* 在res文件夾下面增加了很多values-swxxdp的文件夾。里面的dimen是根據values文件夾下的dimen計算出的結果,運行到所有Android設備會看到一個比較好的適配效果。


 
屏幕快照 2018-05-29 下午6.45.27.png

* 項目根目錄增加了兩個文件:
- screenMatch_example_dimen.xml文件:是一個通用的dimen文件。
- screenMatch.properties文件:是ScreenMatch插件的配置文件可查看注解。

如果您是新項目

可以直接將screenMatch_example_dimen.xml該文件里的內容拷貝的values下面的dimen文件里做開發。然后通過ScreenMatch插件適配其他設備。

至此可以輕輕松松的適配所有的Android設備了

適配原理分析:

density: 1dp占當前設備多少像素

設備系統dpi:是系統內置的(在嵌入式板子設置——顯示——屏幕密度里可以設置它的值)##

  • ldpi: 120 density:1dp=0.75px 代表尺寸 240*320
  • mdpi: 160 density:1dp=1px 代表尺寸 320*480
  • hdpi: 240 density:1dp=1.5px 代表尺寸 480*800
  • xhdpi: 320 density:1dp=2px 代表尺寸720*1280
  • xxhdpi: 480 density:1dp=3px 代表尺寸1080*1920

當前設備的dp數:屏幕寬度(px)/density

使用swdp的原因:默認設備swdp數是360,當設備的swdp大於360時才有存在的意義。從而固定dp大小的控件,顯示不會太小。

swdp:屏幕的最小寬度dp大於這個值的時候啟用

  • 修改dpi之后會修改屏幕dp的數量。
    • 比如1080 在dpi 160時 swdp =1080dp,屏幕有1080個dp。 取sw1080dp中的dimen
    • 比如1080 在dpi 240時 swdp =720dp,屏幕有720個dp。取sw720dp中的dimen
  • 當不設置sw值時:
    • 會默認從value(mdpi)里取一個值。然后px = values里的值*density。
  • 當設置sw值時:
    • 會默認從swxx && xx小於你的屏幕swdp。然后px = xx里的值*density。

drawable選圖規則

當前為xhdpi(240)設備,並且只有以下幾個目錄,則drawable的尋找順序為:

- xhdpi->xxhdpi->xxxhdpi(如果沒有更高的了)->nodpi(如果有的話)->hdpi->mdpi(先向上到最大——再到nodpi——再往下去找) 

anyDensity

  • android:anyDensity="true",系統會依據屏幕密度
  • android:anyDensity="false"
    • 如果drawable-hdpi,drawable-mdpi,drawable-ldpi三個文件夾中有同一張圖片資源的不同密度表示,那么系統會去加載drawable_mdpi文件夾中的資源
    • 如果drawable-hpdi中有高密度圖片,其它兩個文件夾中沒有對應圖片資源,那么系統會去加載drawable-hdpi中的資源。
    • 如果drawable-hdpi,drawable-mdpi中有圖片資源,drawable-ldpi中沒有對應的圖片資源,那么系統會加載drawable-mdpi文件夾中的資源
  

作者:阿怪Sir
鏈接:https://www.jianshu.com/p/5078c53819ce
來源:簡書
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM