android機型適配
A. Android切圖適配知識點匯總
對於在工作中沒有接觸過安卓版本app,或是面試的時候會被問到安卓解析度等問題,可以通過本文對安卓切圖有所了解。我在以往的工作中也沒有接觸過安卓設計等一系列問題,但是看完一些文章後,大致對安卓解析度等知識點有所了解。此文是對自己所了解到的知識做一個總結,也希望能幫助到不了解安卓一系列問題的同行們,好啦,馬上進入正題!
基本概念
1、手機屏幕尺寸計算方式:對角線尺寸/2.54(1英寸=2.54厘米)
2、解析度:屏幕上顯示的像素個數,單位尺寸內像素點越多,顯示的圖像就越清楚。
上圖中紅框框出來的是現在市場上主流的解析度,只要記這三個就可以。其他的已被淘汰。
3、屏幕密度:屏幕每英寸有多少個像素。
4、單位:dp是開發中用於描述尺寸和間距。
sp是用於描述字型大小和行距。
用哪種解析度來設計?
原則上需要為不同的解析度去單獨設計效果圖,但由於實際情況,只需要採用一種解析度去設計,目前多數採用720*1280的解析度。
需要提供幾套切圖?
只需要一套切圖即可
720*1280尺寸的切圖可以適配其他機型,有些特殊的切圖需要單獨適配的,比如icon等。
適配480 800的機型,只需要把切圖/1.5即可。
適配1080 1920的機型,只需要把切圖*1.5即可。適配此解析度的時候,需要在720 1280下畫圖的時候,盡量採用矢量圖形來畫圖。
例如,圖標是48 48的時候,適配1080 1920點時候,48px*1.5=72px.把矢量圖形調整為72px即可。開發會把切圖放到xxhdpi的文件目錄下,就會自動適配1080 1920
同樣,適配480 800的時候,48px/1.5=32px.開發把切圖放到hdpi文件目錄中,會自動適配。
720 1280的切圖,開發放到xhdpi的目錄下。
註:設計圖片的時候盡量採用偶數。
需要提供幾套標注?
在720*1280解析度下進行設計,此解析度下1dp=2px.
可以直接使用dp標注尺寸,sp標注文字大小
註:使用dp標注尺寸。使用sp標注文字大小
該使用什麼字體及字型大小?
中文字體:思源
英文字體:Android 4.x及以上採用Roboto,Android 2.x和3.x採用Droid Sans.
字型大小:12sp、14sp、18sp、22sp(也可根據實際情況調整)
目前掌握以上知識點,可能多少也有些小問題,歡迎有經驗的大神指正、指導。謝謝啦~
B. oppo手機安卓12適配名單
手機升級ColorOS12招募信息相關信息如下,不同機型升級時間有所差異,具體時間請以社區官方公告為准哦~
打開手機端「「OPPO社區」APP>圈子>(發現更多)>(發現圈子)>(全部圈子/我的圈子)>ColorOS圈>升級嘗鮮或關注「版本經理」>找到「ColorOS12適配進度公告集合帖」或「ColorOS12xAndroid12適配進度公告集合帖」」,進行查看。
C. Android屏幕配適、版本配適與多語言支持
目前主流的屏幕密度:240dpi (480 * 800px) , 320dpi (720*1280px) , 480dpi(1080*1920px)現在新出的手機幾乎全是全高清屏(1080*1920px)
Android圖片資源目錄
mdpi [1倍]160dpi
hdpi [1.5倍] 240dpi
xhdpi [2倍] 320dpi
xxhdpi [3倍] 480dpi
xxxhdpi [4倍] 640dpi
因此對其他圖片資源的建議是:
a.一般採用720 * 1280的屏幕尺寸設計,這樣切圖可以直接適配720 * 1280的機型。
b.720 * 1280下切的圖基本可以適配大部分機型。
d.適配480 * 800的機型,只需要把切圖 * 0.75。
e.適配1080 * 1920 的機型,只需要把切圖 * 1.50即可。
a.以720 * 1280作為設計標准,畫布大小定位720 * 1280 (以後1080*1920px做標准亦可,類推)
b.只使用偶數單位的尺寸
c.盡量只使用 24pt, 28pt , 32pt, 44pt大小的字體
d.設計完成之後,所有尺寸的px值除以2作為dp數據交給開發人員
e.三份切圖,分別是:xhdpi,hdpi,mdpi的資源,如果要切一份就使用xhdpi
柵格系統的最小單位是8dp,一切距離、尺寸都應該是8dp的整數倍,所有可操作元素最小點擊區域尺寸為48dp X 48dp。以下是一些常見的尺寸與距離:
有時候在自定義view,draw的時候單位往往是px,要做一個dpi的轉換,需要通過該類獲取屏幕的信息,如:屏幕密度,寬高等。
a.盡量使用線性布局(LinearLayout)和相對布局(RelateLayout),盡量不使用絕對布局(AbsoluteLayout)和幀布局(FrameLayout)。
b.盡量使用wrap_content、mach_parent讓view自適應或最大化,盡量不要寫寬高的值。
c.使用線下布局的百分比weight權重時,要把能伸縮方向的寬度寫成「0dp「,如果寫成wrap_coent會使布局效果不佳等問題。
d.盡量使用android的Shape自定義view背景,這樣會隨之自適應。
e.ImageView的ScaleType有幾種方式:matrix(默認)、center、centerCrop、centerInside、fitCenter、fitEnd、fitStart、fitXY;盡量使用fitCenter按比例擴大至view寬度,能取得較好適配和顯示效果。(更多請參考: Android中的ImageView配適 )
f.獲取屏幕解析度信息,進行動態適配。(參考第三大點)
a.把屏幕設置成單一的橫屏或豎屏:
b.根據橫豎屏載入不同布局(android: screenOrientation="sensor")
通過this.getResources().getConfiguration().orientation來判斷當前是橫屏還是豎屏,然後在onCreate方法中載入不同的布局
採用第二種方式要注意的有兩點
布局問題:
需要在res目錄先建立layout-land和layout-port目錄相應的xml文件名字相同,然後在兩個文件夾下創建相同名字的兩套xml,系統就會根據不同的屏幕來進行自動尋找。
切換時activity的生命周期:
activity生命周期在切換橫豎屏會有一些有趣的變化
a.不設置activity的android:configChanges時,切換橫屏,activity的生命周期會重新調用一次,但是切換豎屏時,生命周期會重新調用兩次。
b.當設置activity的android:configChanges=「orientation」時,切換橫豎屏都會重新調用各生命周期一次。
c.當設置activity的android:configChanges=「orientation|keyboardHidden」(大於api13時,需要設為「orientation|screenSize」)時,切換橫豎屏不會重新調用各生命周期,只會調用onConfigurationChanged方法。
一般設為b或者c
平板應用的特性:
對於大屏幕的平板8英寸以上(參考ipad mini,現在很多高端手機都是5-6英寸了,8英寸以上視為平板吧),基與平板應用的特性,平板應用開發一般採取如下兩種策略
1)兼容模式
採用單activity(或者盡量少activity)+多fragment的結構開發應用,在layout資源文件中創建三套布局:手機布局、平板橫屏布局、平板豎屏布局。
優點:
只需要維護一個app
缺點:
設計及實現的難度變大,更復雜,有時候需要採取折衷方案
手機apk上由於含有平板的大解析度圖片資源(設計上可以減少內置資源)
2)開發另一套只適配平板的app
優點:
與手機app分離獨立。不會因為要兼容而採用一些折衷方案,影響其性能、內存
設計和實現更加自由
缺點:
需要維護兩套app
目前谷歌推薦第一種方案,但是國內很多應用是採取第二種方案。
可以通過判斷sdk的版本(Build.VERSION.SDK_INT),來為能夠使用的版本進行個性化設置
例如:沉浸式狀態欄配適
在Android系統4.4以前,狀態欄的背景色和字體顏色都是不能改變的。但是4.4以後Google增加了改變狀態欄背景透明的方法。可以通過判斷sdk的版本,來為能夠使用的版本進行個性化設置:
沉浸式狀態欄是Android在5.0中引入的,在5.0之前是沒有的,並且在Android6.0中沉浸式狀態欄的使用方法和5.0不一樣,因此需要做到版本兼容,針對於不同的Android進行適配,同樣也是通過判斷Build.VERSION.SDK_INT來區分版本,進行個性化配適
沉浸式狀態欄的實現方式有好幾種,更多請參考 沉浸式狀態欄的實現
原則:內置圖片資源不應該出現文字(如果出現文字需要具備)、所有的文字需要放在res資源目錄特定語言目錄下。
D. android 屏幕適配
@[TOC](文章目錄)
<hr style=" border:solid; width:100px; height:1px;" color=#000000 size=1">
# 前言
<font color=#999AAA >使用工具Android studio,利用values文件下dimens.xml界面適配安卓屏幕</font>
<hr style=" border:solid; width:100px; height:1px;" color=#000000 size=1">
<font color=#999AAA >提示:以下是本篇文章正文內容,下面案例可供參考
# 一、概念
1.屏幕解析度單位是px,例如Android手機常見的解析度:320x480px、480x800px、720x1280px、1080x1920px。
2.手機屏幕的密度:每英寸的像素點數,單位是dpi。
| 密度類型 |代表的解析度(px)| 屏幕像素密度(dpi) | 1dp轉換為px |
|:--------|:--------|:--------|:--------|
| 低密度(ldpi) |240x320|120|0.75|
| 中密度(mdpi) |320x480|160|1|
| 高密度(hdpi)|480x800|240| 1.5|
| 超高密度(xhdpi)|720x1280|320|2|
| 超超高密度(xxhdpi) |1080x1920|480|3|
3.由於android的機型屏幕大小品類太多了,有一些是不標準的,這時我們就需要單獨去獲取屏幕的解析度和密度了。
# 二、獲取屏幕的解析度和密度
```java
DisplayMetrics displayMetrics = getResources().getDisplayMetrics();
float density = displayMetrics.density;
int densityDpi = displayMetrics.densityDpi;
int width = displayMetrics.widthPixels;
int height = displayMetrics.heightPixels;
Log.e("123","密度:"+density+"---"+densityDpi);
Log.e("123","屏幕解析度:"+width+"x"+height);
Log.e("123","安卓系統:"+android.os.Build.VERSION.RELEASE);
Log.e("123","手錶型號:"+android.os.Build.PRODUCT);
```
# 三、SmallestWidth適配
**smallestWidth適配,或者叫sw限定符適配。指的是Android會識別屏幕可用高度和寬度的最小尺寸的dp值(其實就是手機的寬度值),然後根據識別到的結果去資源文件中尋找對應限定符的文件夾下的資源文件。**
**sw計算公式:sw = 屏幕寬度 / (dpi/160) 註:160是默認的**
**例如:屏幕寬度為1080px、480dpi 的sw = 1080/(480/160)**
# 四、生成 dimens 文件
1、 首先在 res 目錄下新建各種尺寸的 values 文件 。文件名為:values-sw(你要適配屏幕的sw值)dp。
例如:

注意:values文件下也生成 dimens文件
**生成dimens值工具類**
1、先生成標準的值。//value = (i + 1) * 1;
2、再用生成其他的值。 //value = (i + 1) * 需要生成的sw值/標準的sw值;
例如:value = (i + 1) * 160 / 320;
```java
public static void genDimen() {
StringBuilder stringBuilder = new StringBuilder();
try {
double value;
for (int i = 0; i < 500; i++) {
//value = (i + 1) * 1; //這里控制對應轉換的值,如果是標准尺寸就一對一轉換
//value = (i + 1) * 需要生成的sw值/標準的sw值; //這里控制對應轉換的值
value = (i + 1) * 1
//value = (i + 1) * 160 / 320;
value = Math.round(value * 100) / 100;
//dp可改成sp
stringBuilder.append("<dimen name=\"size_" + (i + 1) + "\">" + value + "dp</dimen>\r\n");
}
if (stringBuilder.length() > 4000) {
for (int i = 0; i < stringBuilder.length(); i += 4000) {
if (i + 4000 < stringBuilder.length())
Log.e("123", stringBuilder.substring(i, i + 4000));
else
Log.e("123", stringBuilder.substring(i, stringBuilder.length()));
}
} else {
Log.e("123", stringBuilder.toString());
}
} catch (Exception e) {
e.printStackTrace();
} finally {
}
}
```
示例:(我這是以sw320為適配的標準的,你們可改自己的標准)
1、sw320的樣例
```java
<resources>
<dimen name="dimen_1">1.0dp</dimen>
<dimen name="dimen_2">2.0dp</dimen>
<dimen name="dimen_3">3.0dp</dimen>
<dimen name="dimen_4">4.0dp</dimen>
<dimen name="dimen_5">5.0dp</dimen>
<dimen name="dimen_6">6.0dp</dimen>
<dimen name="dimen_7">7.0dp</dimen>
<dimen name="dimen_8">8.0dp</dimen>
<dimen name="dimen_9">9.0dp</dimen>
<dimen name="dimen_10">10.0dp</dimen>
<dimen name="size_1">1.0sp</dimen>
<dimen name="size_2">2.0sp</dimen>
<dimen name="size_3">3.0sp</dimen>
<dimen name="size_4">4.0sp</dimen>
<dimen name="size_5">5.0sp</dimen>
<dimen name="size_6">6.0sp</dimen>
<dimen name="size_7">7.0sp</dimen>
<dimen name="size_8">8.0sp</dimen>
<dimen name="size_9">9.0sp</dimen>
<dimen name="size_10">10.0sp</dimen>
</resources>
```
2、sw160的樣例
```java
<resources>
<dimen name="dimen_1">0.0dp</dimen>
<dimen name="dimen_2">1.0dp</dimen>
<dimen name="dimen_3">1.0dp</dimen>
<dimen name="dimen_4">2.0dp</dimen>
<dimen name="dimen_5">2.0dp</dimen>
<dimen name="dimen_6">3.0dp</dimen>
<dimen name="dimen_7">3.0dp</dimen>
<dimen name="dimen_8">4.0dp</dimen>
<dimen name="dimen_9">4.0dp</dimen>
<dimen name="dimen_10">5.0dp</dimen>
<dimen name="size_1">0.0sp</dimen>
<dimen name="size_2">1.0sp</dimen>
<dimen name="size_3">1.0sp</dimen>
<dimen name="size_4">2.0sp</dimen>
<dimen name="size_5">2.0sp</dimen>
<dimen name="size_6">3.0sp</dimen>
<dimen name="size_7">3.0sp</dimen>
<dimen name="size_8">4.0sp</dimen>
<dimen name="size_9">4.0sp</dimen>
<dimen name="size_10">5.0sp</dimen>
</resources>
```
3、xml界面控制項使用樣例
```java
<TextView
android:layout_width="@dimen/dimen_30"
android:layout_height="@dimen/dimen_30"
android:textSize="@dimen/size_20"
android:layout_margin="@dimen/dimen_10"
android:padding="@dimen/dimen_10">
```
<hr style=" border:solid; width:100px; height:1px;" color=#000000 size=1">
# 總結
<font color=#999999 >提示:這里對文章進行總結:
如果你的app需要適配dpi較低的屏幕,最好以最小dpi的sw為適配的標准。
E. Android機型適配總結
解析度對應DPI
ldpi QVGA (240×320)
mdpi HVGA (320×480)
hdpi WVGA (480×800),FWVGA (480×854)
xhdpi 720P(1280*720)
xxhdpi 1080p(1920*1080 )
xxxhdpi 4K(3840×2160)
機型適配方面常規處理方法:
1、開發之前UI給出不同尺寸標準的多套素材,一般情況下給出:hdpi、xhdpi、xxxhdpi 三種尺寸類型的素材。
2、特殊類型圖片使用Android Studio內置draw9path工具進行製作,例如聊天界面中內容背景圖片。
3、布局編寫時盡量使用 Linearlayout 與 RelativeLayout,LinearLayout內部可以使用weight(權重)屬性將子控制項的尺寸按比例進行設置。RelativeLayout 內部可以使用layout_align...(相對於xxx)屬性將子控制項的尺寸相對於父控制項或相對於其他子控制項進行設置。
4、設置尺寸的時候長度單位 布局使用 dp 字元使用 sp。 其實字體大小的尺寸使用 dp 也可以,但是sp的情況下 用戶使用系統設置字體大小的時候可以改變控制項中字體的大小,但是使用dp設置的字體就不會產生變化。
5、針對每一個屏幕的尺寸生成一套px與dp的轉換方案,詳情見博客: Android機型適配方案 。
6、google推出了一個百分比布局庫,可以使用百分比的方式進行布局尺寸的設置,詳情見博客: Android百分比布局庫(percent-support-lib)解析與擴展
7、利用自定義View的方式去解決,其實原理也是,在繪制View的時候,獲取屏幕的尺寸然後按照一定的比例去設置控制項的尺寸
還有一些瑣碎知識點需要了解並記住:
1. px (pixels)像素 :
一個像素通常被視為圖像的最小的完整采樣,這個用的比較多,特別是web開發,頁面基本都是使用像素作為單位的.
2.dp:
這個是最常用但也最難理解的尺寸單位。它與「像素密度」密切相關,所以首先我們解釋一下什麼是像素密度。假設有一部手機,屏幕的物理尺寸為1.5英寸x2英寸,屏幕解析度為240x320,則我們可以計算出在這部手機的屏幕上,每英寸包含的像素點的數量為240/1.5=160dpi(橫向)或320/2=160dpi(縱向),160dpi就是這部手機的像素密度,像素密度的單位dpi是Dots Per Inch的縮寫,即每英寸像素數量。橫向和縱向的這個值都是相同的,原因是大部分手機屏幕使用正方形的像素點。
不同的手機/平板可能具有不同的像素密度,例如同為4寸手機,有480x320解析度的也有800x480解析度的,前者的像素密度就比較低。Android系統定義了四種像素密度:低(120dpi)、中(160dpi)、高(240dpi)和超高(320dpi),它們對應的dp到px的系數分別為0.75、1、1.5和2,這個系數乘以dp長度就是像素數。例如界面上有一個長度為「80dp」的圖片,那麼它在240dpi的手機上實際顯示為80x1.5=120px,在320dpi的手機上實際顯示為80x2=160px。如果你拿這兩部手機放在一起對比,會發現這個圖片的物理尺寸「差不多」。
3.dip:
與dp完全相同,只是名字不同而已。在早期的Android版本里多使用dip,後來為了與sp統一就建議使用dp這個名字了。
4.sp:
與縮放無關的抽象像素(Scale-independent Pixel)。sp和dp很類似但唯一的區別是,Android系統允許用戶自定義文字尺寸大小(小、正常、大、超大等等),當文字尺寸是「正常」時1sp=1dp=0.00625英寸,而當文字尺寸是「大」或「超大」時,1sp>1dp=0.00625英寸。類似我們在windows里調整字體尺寸以後的效果——窗口大小不變,只有文字大小改變。
還有一些詳細的情況需要了解,都在這個博客里: 點擊進入
F. Android程序接聽及掛斷電話,適配所有Android版本
接聽來電
拒接來電:
其中文中的接聽電話android6-android7的處理方案是利用了監聽通知使用權,所以還要新建一個NotificationListenerService的子類,叫ListenerService,需要在AndroidManifests中配置
另外需要提示用戶打開通知使用權才可以正常使用
已測試通過了android6-android9各種機型,注意拒接來電在android9以上才有官方支持,所以需要設置compileSdkVersion=28。
需要的許可權為:Manifest.permission.CALL_PHONE,Manifest.permission.READ_PHONE_STATE
8.0以上需要Manifest.permission.ANSWER_PHONE_CALLS,Manifest.permission.READ_CALL_LOG。
還不行的請注意三點:
1:檢查許可權是否都申請及在manifests里注冊了
2:compileSdkVersion是否為28
3:android6到android7的手機的接聽來電要依賴通知使用權,所以通知使用權打開才可以正常工作。
G. android 屏幕適配基礎知識
最近參考 今日頭條演算法 ,優化了項目的屏幕適配策略。下面是適配過程中的一些心得,部分內容來源於網路。
舉個例子:屏幕解析度為:1920*1080,屏幕尺寸為5吋的話,那麼dpi為440。
dp就是密度自適應的像素。1dp表示 在dpi為160的設備上的一顆像素
px與dp的換算公式px = dp * (dpi / 160),很顯然,由於相同解析度但不同屏幕大小的設備dpi是不同的,導致px和dp的基本不存在一個固定的換算關系,為了方便屏幕適配,Android設置了6個通用的密度,換算px與dp時採取通用密度計算,而非設備實際的密度。
以下為6種通用密度,以及其最小的解析度
得到上面通用密度之後,我們換算dp與px多了一種簡便方式。Android系統用mdpi(160dpi)作為基準,此時1px = 1dp,又有px = dp * (dpi / 160),所以我們可以很容易的得到以下換算:
sp在dp的基礎上引入了scaleFactor變數,一般用於字型大小,可在系統設置里調大。
同一張圖片放到以上4個解析度類型的文件夾里,在頁面上呈現的效果如下
實際呈現的演算法為: 圖片尺寸 * 系統density / 文件夾 density
因為圖片尺寸、系統density都是固定的,因此圖片最終尺寸表現為: 圖片放的位置越"low",呈現的尺寸越大
比如 圖片寬度200px,系統 density =3,則圖片寬度
下面是詳細的解釋
我們知道,不管在布局文件中填寫的是什麼單位,它最後都會被系統轉化為 px。系統的轉換演算法如下:
可以看到 px = dp*density 。
橫向適配的最終目的:讓100dp的寬度,在各個機型上,在屏幕上所佔的 比例相同 。
其核心演算法是px = dp* density。通過修改density這個變數,我們可以讓px和畫布標注的px值一致,達到適配的效果。
美工同學提供的畫布寬度為 750px(iphone6) ,開發中,我們對這些px標注 除2 得到dp值進行使用。
那麼density如何求出呢? 根據系統演算法px = dp*density,反推 density =px/dp
拿橫向適配畫布, density對於不同解析度的手機修改後如下:
375是我們拿UI畫布橫向解析度750/2得出。
H. Android劉海屏適配
劉海屏幕的適配,在全面屏設置下,頂部有劉海的區域,有的會導致劉海把標題欄等內容遮蓋如下圖,這是美團的統一版本在小米和華為上的適配,可以看到小米的未遮擋內容,但在華為設備上,明顯劉海遮住了一部分內容,目前手裡只有這兩台設備,所以沒有更多機型測試,不過根據上線APP反饋,目前這個方法可以滿足。此博文為筆記內容,所以內容不多
如果統一留出固定的高度,會在不同設備上造成不同的效果,現在使用動態計算頂部狀態欄高度然後預留高度,防止被異形屏遮擋情況,使用之後的效果如下圖
使用方法,在布局上設置一個佔位條,需要適配的引用進來,因為有些布局是不用設置的