@[TOC](文章目錄)
珠暉網(wǎng)站建設(shè)公司成都創(chuàng)新互聯(lián)公司,珠暉網(wǎng)站設(shè)計制作,有大型網(wǎng)站制作公司豐富經(jīng)驗。已為珠暉上千提供企業(yè)網(wǎng)站建設(shè)服務(wù)。企業(yè)網(wǎng)站搭建\外貿(mào)網(wǎng)站建設(shè)要多少錢,請找那個售后服務(wù)好的珠暉做網(wǎng)站的公司定做!
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 提示:以下是本篇文章正文內(nèi)容,下面案例可供參考
# 一、概念
1.屏幕分辨率單位是px,例如Android手機常見的分辨率:320x480px、480x800px、720x1280px、1080x1920px。
2.手機屏幕的密度:每英寸的像素點數(shù),單位是dpi。
| 密度類型 |代表的分辨率(px)| 屏幕像素密度(dpi) | 1dp轉(zhuǎn)換為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","安卓系統(tǒng):"+android.os.Build.VERSION.RELEASE);
Log.e("123","手表型號:"+android.os.Build.PRODUCT);
```
# 三、SmallestWidth適配
**smallestWidth適配,或者叫sw限定符適配。指的是Android會識別屏幕可用高度和寬度的最小尺寸的dp值(其實就是手機的寬度值),然后根據(jù)識別到的結(jié)果去資源文件中尋找對應(yīng)限定符的文件夾下的資源文件。**
**sw計算公式:sw = 屏幕寬度 / (dpi/160)? 注:160是默認的**
**例如:屏幕寬度為1080px、480dpi 的sw = 1080/(480/160)**
# 四、生成 dimens 文件
1、 首先在 res 目錄下新建各種尺寸的 values 文件 。文件名為:values-sw(你要適配屏幕的sw值)dp。
例如:
![code23]()
注意: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; //這里控制對應(yīng)轉(zhuǎn)換的值,如果是標準尺寸就一對一轉(zhuǎn)換
? ? ? ? ? ? //value = (i + 1) * 需要生成的sw值/標準的sw值; //這里控制對應(yīng)轉(zhuǎn)換的值
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"
# 總結(jié)
font color=#999999 提示:這里對文章進行總結(jié):
如果你的app需要適配dpi較低的屏幕,最好以最小dpi的sw為適配的標準。
在進行應(yīng)用開發(fā)和展示的時候,經(jīng)常需要將Android手機投影到PC屏幕或者投影儀上。豌豆莢或者91手機助手雖然能夠通過USB將手機屏幕投影至PC,但是在手機上切換屏幕時,PC上相應(yīng)的影像切換速度太慢,不能滿足展示要求。借助于droidVN這款軟件和隨身WiFi能夠更快速地將手機屏幕投影至PC,進而投影至投影儀上。
同時droidVNC還是一款遠程控制的軟件,在PC上安裝droidVNC客戶端,除了可以將手機屏幕投影至PC上,還能對手機進行遠程控制。具體步驟如下
方法/步驟
1下載并安裝droidVNC
2下載并安裝VNC Viewer
3在PC上安裝VNC viewer,VNC viewer的'軟件有許多,其中realVNC,TightVNC是比較見得比較多的兩種。Tight VNC是免費的,可以從g網(wǎng)獲得和安裝,因此這里使用Tight VNC進行連接。
4安裝小度WiFi
5第一次使用小度WiFi,則需要在從g網(wǎng)下載并安裝驅(qū)動;第二次使用的話,插入小度WiFi后,直接點擊桌面圖標打開小度WiFi軟件,小度WiFi自動創(chuàng)建熱點WiFi熱點。
6手機關(guān)聯(lián)小度WiFi創(chuàng)建熱點
7啟動手機上droidVNC軟件
8在開始欄中輸入tightvnc搜索出tight VNC viewer并打開
9在tight VNC viewer界面輸入地址和端口信息,中間用兩個冒號隔開。如果沒有做特殊設(shè)置,直接輸入192.168.123.11::5901
10在tight VNC中保存連接為vnc文件,放到桌面上。以方便下一次使用
1、打開安卓手機的應(yīng)用商店,輸入魯大師,在查詢的結(jié)果中點擊安裝。
2、打開手機桌面上的魯大師軟件。
3、進入魯大師軟件以后點擊右下角的工具箱按鈕。
4、在出現(xiàn)的界面中找到屏幕檢測,點擊打開。
5、在出現(xiàn)的界面中點擊壞點檢測。
6、頁面跳轉(zhuǎn)后點擊開始檢測。
7、點擊開始檢測之后,手機屏幕會呈現(xiàn)藍色,點擊屏幕。
8、屏幕的顏色會開始變換,仔細查看屏幕上的顏色是否存在壞點。
9、繼續(xù)點擊屏幕依次出現(xiàn)紅色、灰色、白色和黑色按鈕,顏色變換中可以查看屏幕是否有壞點。
10、最終點擊屏幕結(jié)束壞點檢測,即完成了安卓手機的屏幕壞點檢測。
5 年前,蘋果的「全面屏」手機 iPhone X 正式問世。
iPhone X 與小米 MIX2.
它既為此前延續(xù)四代 iPhone 的外觀劃上了句號,也開啟了 iPhone 新一輪不變的設(shè)計風格。
不論是圓滑過渡,還是直角邊。不論是 OLED 材質(zhì),還是 LCD 材質(zhì)。以 iPhone X 為起點的話,后續(xù)的 iPhone 幾乎都遵循了一個堅持,即是「四邊等寬」。
iPhone 12 與 iPhone 13.
同樣在 5 年前,Android 手機同樣在 探索 「全面屏」,它們不像直接亮出答案的 iPhone,反而給出了很多的答案,其中也包括屏幕的黑邊。
俗話說,錢能解決的都不是問題。四邊等寬的「關(guān)鍵」之一便是先進的 COP 封裝,成為了 Android 廠商們追求的技術(shù)。
華為 P50 Pro.
不過,隨著屏幕 COP 封裝成為主流選擇,但依然很少見與 iPhone 類似的「四邊等寬」設(shè)計。
反而,Android 手握 COP 封裝開始追逐曲面屏、極窄邊框,進而打出差異化與視覺沖擊力上來。
三星 Galaxy S22 與 Galaxy S22+.
一直到三星 Galaxy S22 系列的出現(xiàn),準確的說是 Galaxy S22 和 S22 Plus 這兩臺真 S 序列。
延續(xù) Galaxy S 系列設(shè)計風格的同時,還用上了「四邊等寬」的屏幕,甚至要比現(xiàn)在 iPhone 13 系列的邊框還要窄上一圈,稱之為「四邊等窄」。
四邊等窄與非曲面屏的設(shè)計,反而讓 Galaxy S22 系列在 Android 陣營里有了足夠的沖擊力和差異性。
似乎,四邊等寬、曲面屏這些形態(tài)無法等同于沖擊力、差異性。如此來說,Galaxy S22 的出現(xiàn)是否會讓 Android 廠商們把四邊等寬引入到各自產(chǎn)品的設(shè)計之中?
在分析 Android 廠商們之前,我們還是回到 iPhone 上來,畢竟它們是四邊等寬設(shè)計的忠實擁躉。
四邊等寬的 iPad mini 6.
從 iPhone X 開始,到現(xiàn)在的 iPhone 13 系列,甚至到 iPad、MacBook Pro、Apple Watch,都有四邊等寬元素的體現(xiàn)。
科技 博主 John Gruber 在《設(shè)計即品牌(design as branding)》的一篇博客中,極力推崇了蘋果的「制定一個目標,并堅定地朝著這個方向精進」這種設(shè)計哲學。
iPhone 的過去十年,與未來十年.
值得注意的是,這篇關(guān)于蘋果設(shè)計的播客有兩個背景,一是發(fā)布于 iPhone X 之前 ,二實則是 Gruber 反駁紐約時報的《蘋果失去尖端設(shè)計》的專欄。
彼時來看,iPhone 7 系列的亮黑色已經(jīng)是金屬后蓋的工藝頂峰,并非停滯不前,失去了尖端設(shè)計。
iPhone 7 亮黑色.
到了引領(lǐng) iPhone 進入下一個形態(tài)穩(wěn)定期的 iPhone X,與 iPhone 4、iPhone 6 類似,它們都預(yù)示著不同時期 iPhone 的終極形態(tài)。
正面全是屏幕,毫無遮擋,只剩下邊框,便是蘋果認為在全面屏時代下 iPhone 該有樣子。
傳聞中的 iPhone 14 Pro,距離真全面屏又近了一小步.
而在 iPhone X,甚至到現(xiàn)在的 iPhone 13 系列中,蘋果僅完成了四邊等寬,如今它們正在跟劉海(FaceID)較勁,已經(jīng)有了一些成果。
同樣地,四邊等寬(加劉海)的形態(tài)也延續(xù)到后續(xù)的 Apple Watch、iPad Pro、iPad mini、MacBook Pro 等一系列蘋果產(chǎn)品上。
Design as branding,設(shè)計是為品牌服務(wù),而非單一的產(chǎn)品。好的品牌設(shè)計,就像保齡球一樣筆直向前。不好的品牌設(shè)計,就好像鐘擺一般來回搖擺。
相對于所謂的「秩序感」,屏幕四邊等寬的設(shè)計信條實際更接近與為品牌服務(wù),也可以說是一種「家族化」設(shè)計。
嚴格追求「四等寬」設(shè)計,為 iPhone 帶來的就是一種品牌認知度,以及拋開 Logo 的一種品牌辨識度。(甚至你也可以說劉海也是如此。)
大概分為兩個時期,一個是工藝成本決定,另一個則是對產(chǎn)品線的考慮。
iPhone X 的發(fā)布大概突出了三件事,一是過萬的售價,二是 Face ID 結(jié)構(gòu)光生物解鎖,三是 COP 先進的封裝工藝(在消費層面則是四等邊、窄下巴)。
當時 iPhone X 上的這塊異形屏成本大概在 80 美元左右,而同代的 iPhone 8 Plus 的屏幕成本只有 50 美元。
屏幕成本,以及為此而設(shè)計的邊框,內(nèi)部結(jié)構(gòu)等等硬件成本也不斷攀升,讓 iPhone X 敲開了 iPhone 的萬元時代。
與此同時,隨著異形屏幕成為主流,Android 廠商也逐步入局,但面對定制屏幕和 COP 封裝工藝的雙高成本,它們只能取其一,也出現(xiàn)了「下巴」問題。
倘若以「下巴」為基準,再去做四等邊的話,設(shè)計師可能會提刀去見產(chǎn)品開發(fā)。此時,「非四等邊」的設(shè)計風格便成為大家心照不宣的一個選擇。
并且,為了極具沖擊力的視覺,雙曲面屏、瀑布屏等設(shè)計,也漸漸成為一個選擇。
隨著 COP 封裝的成熟,異形屏幕成本的降低,全面屏的 iPhone 也逐步下放至入門機型,Android 陣營們?nèi)匀徊豢夏贸觥杆牡冗叀沟脑O(shè)計,反而更愿意去做曲面屏了。
其實,這里還有一個節(jié)點,那就是 5G 網(wǎng)絡(luò)。
在擁抱超速的 5G 網(wǎng)絡(luò)之時,也為終端設(shè)備帶來了一些煩惱,發(fā)熱和續(xù)航,需要更大的機身來中和,雙曲面屏幕、弧形機身恰好是一個解決方案,更加堅定了「曲面屏」的選擇。
另外,如同 iPhone,很多設(shè)計風格會在一年兩年之后下放到中端設(shè)備。Android 們也會在旗艦產(chǎn)品上布局新技術(shù)、設(shè)計和規(guī)格,幾次更迭之后逐步下放到中端產(chǎn)品里。
蘋果的中端、入門設(shè)備可能會在 4000 或者 5000 價位,而 Android 可能涵蓋 1000 到 3000 的價位段,相對來說,Android 所覆蓋到的人群更看重規(guī)格配置,而非四等寬、COP 封裝帶來的隱形成本上。
為了厚度、手感,視覺、設(shè)計風格,以及產(chǎn)品線的綜合考量,各路權(quán)衡下來,致使 Android 陣營里很少出現(xiàn)四等邊的產(chǎn)品出現(xiàn)。
對于「四等邊」的呼吁,其實也是在 iPhone X 發(fā)布之后,和 Android 陣營五花八門的「劉?!鼓7?,有點東施效顰,劉海學來了,但四等邊的美感卻不在。
彼時,很多 Android 產(chǎn)品對全面屏的設(shè)計還處于「 探索 階段」,整體的設(shè)計風格就好像鐘擺一般,讓人捉摸不定。
這個時候,學習 iPhone 的設(shè)計風格和設(shè)計元素是許多 Android 廠商的做法。
隨著屏幕封裝工藝的成熟,許多廠商在這個過程里也開始重新思考能代表品牌的設(shè)計,以及如何讓設(shè)計元素來成為品牌的名片。
就好像四等寬之于 iPhone,F(xiàn)ace ID 之于 iPhone,誕生出,晶鉆工藝之于 OPPO,火山口之于 Find,云階之于 vivo,星環(huán)設(shè)計之于華為。
硬件上,Android 們也打出了與 iPhone 不同的牌,高功率充電,更大的電池,更多的攝像頭等等。
倘若說,iPhone X 時期的 Android 向 iPhone 看齊的話,那之后的 Android 已經(jīng)徹底與 iPhone 分道揚鑣。
即使現(xiàn)在屏幕的技術(shù)、工藝和成本,做出四等邊的難度大幅降低,Android 廠商們也礙于產(chǎn)品層面的考量而并未跟進,反而依然去按照自己的節(jié)奏設(shè)計和詮釋產(chǎn)品。
設(shè)計為品牌服務(wù),而不是為了「炫技」或者說跟隨,很多 Android 廠商也在逐步地發(fā)現(xiàn)自己的傳承風格,至于用不用「四等邊」還是用不用直屏可能并不是重點了。
Android屏幕適配-基礎(chǔ)篇
Android屏幕適配-應(yīng)用篇
從兩個大方面闡述一下Android的屏幕適配:
? Android推薦使用dp作為尺寸單位來適配UI ,通過dp加上自適應(yīng)布局和weight比例布局可以基本解決不同手機上適配的問題,這基本是最原始的Android適配方案。
缺點 :
(1)這種方案只能保證我們寫出來的界面適配絕大部分手機,部分手機仍然需要單獨適配,但dpi的不同,還是會存在差異。
(2)一般的設(shè)計稿都是以px為單位的,所以我們在寫layout文件的時候需要將px轉(zhuǎn)為dp,影響開發(fā)效率。
?為了高效的實現(xiàn)UI開發(fā),出現(xiàn)了新的適配方案,我把它稱作寬高限定符適配。簡單說,就是窮舉市面上所有的Android手機的寬高像素值,設(shè)定一個基準的分辨率,其他分辨率都根據(jù)這個基準分辨率來計算,在不同的尺寸文件夾內(nèi)部,根據(jù)該尺寸編寫對應(yīng)的dimens文件:
鴻洋大神的作品 ,使用也超級簡單,核心功能就是在繪制的時候在onMeasure里面做變換,重新計算px。
缺點 :我們自定義的控件可能會被影響或限制,可能有些特定的控件(框架沒有做適配的控件),需要單獨適配。
??小結(jié):上述幾種適配方案都是實際開發(fā)中用過的方案,但隨著技術(shù)不斷的更新,出現(xiàn)了更好的適配方案。
?? 實現(xiàn)原理 :Android會識別屏幕可用高度和寬度的最小尺寸的dp值( 其實就是手機的寬度值 ),然后根據(jù)識別到的結(jié)果去資源文件中尋找對應(yīng)限定符的文件夾下的資源文件。
?? sw限定符適配 和 寬高限定符適配 類似,區(qū)別在于,前者有很好的容錯機制,如果沒有value-sw360dp文件夾,系統(tǒng)會向下尋找,比如離360dp最近的只有value-sw350dp,那么Android就會選擇value-sw350dp文件夾下面的資源文件。這個特性就完美的解決了上文提到的寬高限定符的容錯問題。
?? 優(yōu)點: 1.非常穩(wěn)定,極低概率出現(xiàn)意外
????2.不會有任何性能的損耗
????3.適配范圍可自由控制,不會影響其他三方庫
?? 缺點 :就是多個dimens文件可能導(dǎo)致apk變大,幾百k。
?? 附件: 生成sw文件的工具
?? 實現(xiàn)原理 : 修改系統(tǒng)的density值 (核心)
??今日頭條適配是以設(shè)計圖的寬或高進行適配的,適配最終是改變系統(tǒng)density實現(xiàn)的。
?? 過程:
??AndroidAutoSize 是基于今日頭條適配方案,該開源庫已經(jīng)很大程度上解決了今日頭條適配方案的兩個缺點,可以對activity,fragment進行取消適配。也是目前我的項目中所使用的適配方案。
使用也非常簡單只需兩步:
(1)引入:
(2)在 AndroidManifest 中填寫全局設(shè)計圖尺寸 (單位 dp),如果使用副單位,則可以直接填寫像素尺寸,不需要再將像素轉(zhuǎn)化為 dp,詳情請查看 demo-subunits