*****
**dp + dimens 適配**
[TOC=6]
我們總是在xml布局里寫dp,dp到底是什么意思呢?
這是Android開發中特有的一種度量,稱作屏幕無關像素,它不表示任何具體的長度或者像素點,這個值只有在具體屏幕密度的手機上,才會被轉換為具體的像素值。
它跟px不一樣,咱們在xml里面寫上px,那無論運行到任何設備上,就是固定的px,不會發生什么變化,但是dp就不一樣了。
比如拿以下幾種來說明一下。
| 分辨率(px) | 系統密度(dpi) |
| --- | --- |
| 240x320 | 120 |
| 320x480 | 160 |
| 480x800 | 240 |
| 720x1280 | 320 |
| 1080x1920 | 480 |
1dp轉換的px是多少呢?
其實就跟dpi有關,而基準線是160dpi,這就意味著1dp在320x480這款手機上就是1px,在480x800是1.5px,720x1280上是2px,1080x1920上是3px。
這就是dp。
比如現在有這么個需求,要求一個控件的寬度占屏幕的一半,我們用dp怎么來實現呢?
首先進行計算,比如320x480,它的寬是320個px,那我們就要寫160px,用dp來表示就是160dp。所以我們可以在xml布局里寫160dp就可以了,同樣的方式試一試其他的手機:
比如240x320,你寫160dp在這種手機上轉換的px就是 160dp\*120/160 = 120px,所以在這種手機上160dp代表的就是120px,剛好是240的一半,也能適配。 再來試一試480x800,想在這種手機上也占一半,必須是240px,而咱們寫的是160dp,它轉換的px就是 160dp\*240/160=240px,剛好也能符合需求。
其實Google出dp這個東西本身就能達到適配的概念,你看,咱們寫了一個160dp,跑到這幾種手機上都能達到需求,這不就是適配了嗎?
但是我之所以提出來了,就說明dp并不能保證完美適配,比如咱們試試720x1280。
720的一半是360px,而咱們寫的160dp,轉換的px是160dp\*320/160=320px,明顯就不是一半,差了40px。也就是說咱們的代碼運行到這種手機上的時候就沒有適配好,沒有達到需求。
再試試1080x1920的,同樣的計算,160dp\*480/160=480,而1080的一半是540,480跟540差了60px,也不行,沒有達到需求。
由此可見,當在240x320,320x480,480x800上面的時候寫160dp是正常的,可以滿足需求。而在720x1280,1080x1920上面卻不能完美適配。
問題拋出來了,該怎么解決這個問題呢?

- 班規
- 第一單元 Git
- 1.1 Git簡介
- 1.2 Git安裝
- 1.3 版本控制
- 1.4 遠程倉庫
- 1.5 分支管理
- 1.6 Git命令總結
- 1.7 在Android Studio中使用Git
- 第一單元 作業
- 第二單元 項目立項
- 2.1 需求文檔
- 2.2 原型圖
- 2.3 接口文檔
- 2.4 項目實現
- 2.5 制定開發計劃
- 第二單元 作業
- 第三單元 MVP搭建項目框架
- 3.1 代碼架構模式
- 3.2 普通方式寫代碼
- 3.3 使用MVC重構代碼
- 3.4 使用MVP重構代碼
- 3.5 使用接口提高代碼通用性
- 3.6 內存泄漏
- 3.7 使用契約統一管理接口
- 第三單元 作業
- 第四單元 MVP架構優化
- 4.1 MVP基類封裝與泛型應用
- 4.3 BaseActivity的封裝
- 第五單元 Volley網絡框架
- 5.1 Volley網絡框架
- 第六單元 Glide實現圖片異步加載
- 6.1 開始使用
- 6.2 占位符
- 6.3 Glide緩存
- 6.4 GlideGifVideo與色彩模式
- 第七單元 傳統屏幕適配
- 7.1 相對布局
- 7.1 權重
- 7.3 .9Patch
- 7.4 dimens適配
- 7.5 國際化
- 7.6 shape實現自定義樣式
- 7.7 自定義樣式
- 7.8 沉浸式狀態欄
- 第八單元 RecyclerView
- 8.1 RecycleView
- 第九單元 自定義View
- 第十單元 自定義View實戰
- 第十一單元 自定義View進階
- 第二十單元 屬性動畫
- 第十三單元 異常捕獲機制
- 第十四單元 原生登錄、注冊模塊
- 第十五單元 第三方登錄、分享、統計
- 第十六單元 HTML5新特性
- 第十七單元 CSS3新特性
- 第十八單元 WebView與JS交互
- 第一周周考
- 第二周周考
- 第三周周考
- 月考