Android屏幕適配方案

先講述一些屏幕適配相關概念,而後介紹下3種主要的適配方案以及優缺點。android

一.基本概念

1. 像素(px)

  • 像素是手機屏幕的最小構成單元。

2. 分辨率 (px)

  • 手機在橫向、縱向上的像素點數總和,通常描述成 寬高 ,即橫向像素點個數縱向像素點個數。
  • 例如:1080x1920,即寬度方向上有1080個像素點,在高度方向上有1920個像素點。

3.屏幕尺寸(inch)

  • 手機對角線的物理尺寸,單位 英寸(inch),一英寸大約2.54cm,
  • 例如:常見的尺寸有4.7寸、5寸、5.5寸、6寸

4.屏幕像素密度 (dpi)

  • 每英寸長度上像素點個數。"dot per inch":
  • 例如每英寸內有160個像素點,則其像素密度爲160dpi。
以上四者之間關係
  • √((寬px)²+(高px)²)  /  (屏幕尺寸inch) = (屏幕像素密度dpi)

5. dp,dip,sp

  • dip和dp是一個意思,都是Density Independent Pixels的縮寫,即密度無關像素。
  • 例如:在Android中,規定以160dpi爲基準,1dip=1px,若是密度是320dpi,則1dip=2px,以此類推。
  • android中的dp在渲染前會將dp轉爲px,計算公式: px = density * dp; density = dpi / 160; px = dp * (dpi / 160);
  • 注意:dp與px不必定都是2倍的關係,與屏幕像素密度dpi有關。

6. hdpi,mdpi,xhdpi,xxhdpi,xxxhdpi

  • 用來修飾Android中的drawable文件夾及values文件夾,用來區分不一樣像素密度下的圖片和dimen值。
  • 在設計圖標時,對於五種主流的像素密度(mdpi、hdpi、xhdpi、xxhdpi 和 xxxhdpi)應按照 2:3:4:6:8 的比例進行縮放。

2.適配方案

主要介紹一些適配方案,至於佈局編碼注意的問題,不詳細介紹了。api

  • 使用 「wrap_content」 和 「match_parent」 尺寸值而不是硬編碼的尺寸,視圖就會相應地僅使用自身所需的空間或展開以填滿可用空間。
  • weight是線性佈局的一個獨特的屬性,咱們可使用這個屬性來按照比例對界面進行分配。
  • 使用相對佈局,禁用絕對佈局。等等...

適配目的是使得某一元素在Android不一樣尺寸、不一樣分辨率的手機上具有相同的顯示效果。佈局

1.屏幕分辨率限定符(寬高限定符)

設定一個基準的分辨率,也就是設計圖對應的分辨率,其餘分辨率都根據這個基準分辨率來計算,在不一樣的尺寸文件夾內部,根據該尺寸編寫對應的dimens文件。ui

  • 屏幕分辨率限定符適配須要在 res 文件夾下建立各類屏幕分辨率對應的 values-xxx 文件夾。
  • 而後根據一個基準分辨率,例如基準分辨率爲 1280x720,將寬度分紅 720 份,取值爲 1px~720px,將高度分紅 1280 份,取值爲 1px~1280px,生成各類分辨率對應的 dimens.xml 文件。

基準分辨率 1280x720 對應的dimes文件:編碼

  • 寬度爲720,將任何分辨率的寬度整分爲720份,取值爲x1-x720
  • 高度爲1280,將任何分辨率的高度整分爲1280份,取值爲y1-y1280

那麼對於1080*1920的分辨率的dimens文件來講,寬度以下:.net

  • x1=(1080/720)*1=1.5px
  • x2=(1080/720)*2=3px
    ...
  • x719=(1080/720)*719=1078.5px
  • x720=(1080/720)*720=1080px

以下分別爲分辨率 1280x720 與 1920x1080 所對應的橫向dimens.xml 文件: 插件

分辨率 1280x720 與 1920x1080 所對應的橫向dimens

  • 缺點 這個方案有一個致命的缺陷,那就是須要精準命中才能適配,好比1920x1080的手機就必定要找到1920x1080的限定符,不然就只能用統一的默認的dimens文件了。而使用默認的尺寸的話,UI就極可能變形,簡單說,就是容錯機制不好。

2. smallestWidth 限定符

smallestWidth適配,或者叫sw限定符適配。指的是Android會識別屏幕可用高度和寬度的最小尺寸的dp值(其實就是手機的寬度值),而後根據識別到的結果去資源文件中尋找對應限定符的文件夾下的資源文件。 smallestWidth 限定符 和寬高限定符適配原理上是同樣的,都是系統經過特定的規則來選擇對應的文件。設計

  • smallestWidth 限定符屏幕適配方案 只是把 dimens.xml 文件中的值從 px 換成了 dp,原理和使用方式都是沒變的。

分辨率 1280x720 與 1920x1080 所對應的橫向dimens

  • smallestWidth 限定符比屏幕分辨率限定符須要少許 dimens.xml 文件
  • smallestWidth 限定符適配採用的單位是 dp 和 sp。屏幕分辨率限定符采用px。
  • 屏幕分辨率限定符須要精準命中才能適配,而 smallestWidth 限定符適配尋找 dimens.xml 文件的原理是從大往小找,即便沒有徹底匹配也能達到不錯的適配效果。
  • 缺點:
  • 侵入性高,在全部地方都須要引用。
  • 仍是沒有辦法覆蓋全部的機型分辨率,部分機型可能適配效果仍是不佳。
  • 不能以高度爲基準進行適配。
  • 生成不少文件,增大APP體積1~2M。

3. 今日頭條適配方案

今日頭條屏幕適配方案的核心原理在於,動態計算density,經過系統api,將density賦值給系統,拋棄掉系統默認計算density的計算公式。 公式: density = 屏幕寬度px / 設計圖寬度(375dp)

  • 使用成本很是低,操做很是簡單
  • 侵入性很是低
  • 可適配三方庫的控件和系統的控件
  • 缺點
  • 會全局影響APP的控件大小,例如一些第三方庫控件,他們設計的時候可能設計圖尺寸並非像咱們同樣是375dp,這樣就會致使控件大小變形等一些問題。 當某個系統控件或三方庫控件的設計圖尺寸和和咱們項目自身的設計圖尺寸差距很是大時,這個問題就越嚴重。

參考:Android屏幕適配方案分析

相關文章
相關標籤/搜索