導航:首頁 > 操作系統 > android50適配

android50適配

發布時間:2023-01-02 13:18:52

『壹』 android 屏幕適配

Android的屏幕大同小異,解析度也是各種各樣,手機App上的差異性還沒那麼明顯,基本用Dp & weight就可以比較好的適配各種手機。但是在Pad上的表現就不盡如意,而且發現像華為Pad Pro這種高端設備,是可以通過系統設置去設置修改系統的density值,導致整個如果只用一套DpUI布局去實現,會出現很奇怪的UI效果,基本不能適配。這時候就需要對UI進行適配。通過資料查詢,需要了解如下的幾個概念

1.px,pixel 就是像素,最基本的真實顯示單位
2.dp,dip, Density-independent pixel,設備的獨立像素,1dp表示在屏幕像素點密度為160ppi時1px長度
3.ppi, pixel per inch ,每英寸對角像素點,這個是物理上的
4.dpi, dot per inch ,每英寸多少個點,這個是軟體上的,這里的點跟像素點不同
5.sp: scale-independent pixel, 字體大小單位

簡單換算就是
ppi =根號( 橫屏像素點平方+縱屏像素點平方)➗對角線的長度,這個長度是一英寸

1dp = (dpi/160) px
然後有些不同尺寸手機的ppi可能是420, 430, 440, 450, 460.,由於物理ppi上是固定的,改變不了,為了適配,通過人為設置一個dpi,來規范這些差不多ppi值,使得這些相差差不多的屏幕都是通用一個dpi,也就是使用同一套設計方案。
一開始通過dp值來實現適配,是可以解決大部分適配問題,但是在遇到pad這種設備,由於是橫屏,而且系統設置還可以修改density值,使得用一套固定屏幕(比如1280 * 800)的方向變得不是那麼合適。

這時候想到可以通過Android中 dimens中定義dimen值,Android中可以通過sw去搜索對應的dimen值表來獲取對應的配置,smallestWidth適配,sw限定符適配,只要我們把對應的表通過換算,得到一個新值,就可以得到在不同的density值中得到對應的dp值表,解決華為上一個設備對應不同density值的問題。
那麼問題來了,如果去得到sw不同的dimens呢,網上的方法很多,有些自己寫腳本,有些自己寫程序生成,為了就是列舉所有的值,一般1-1000dp,然後基於一個基準,比如360dp寬度,去換算出不同屏幕寬度的dimens值,這里我推薦Android Studio的插件ScreenMatch,先安裝插件

然後在values中創建dimens文件夾,並創建dimens.xml,其中寫上自己定義的dp值,如下

然後在該文件右鍵,選擇screenmatch

插件就會生成一堆其他屏幕的dimens文件,並且自動生成1-800的其他dp值,基本滿足開發中的定義,如果沒有的話,就自行在這里定義,然後重新生成。
關於ScreenMatch的生成還有一個基準,就是基於那個dpi來生成,通過插件生成,在根目錄會多出了兩個文件,一個example, 一個config文件

這里我們看看properties文件,內容如下

其中base_dp=850就是基於850,然後可以通過match_dp去調整要適配的dpi值。
通過這方方式,會在dimens文件自動生成dimen文件

在網上看到,還可以通過修改density去修改,這種方式有空我在試試

『貳』 Android的國際化語言適配(系統語言適配+APP內部適配)

Android國際化語言適配分為兩種

1.更改手機系統語言後,APP的語言也會跟著變化

2.只改變自己APP的語言,不受手機系統語言的影響,不影響其他APP的語言,可以參考微信的切換語言的效果。

只需要創建不同語言的values即可

具體操作參考  簡單的Android客戶端國際化(語言適配)方案

操作的時候要注意: 當選擇所要切換的語言後,則進行修改Config以及重啟APP,一定要將選擇的語言保存到SP中,且在activity中的oncreate中將SP中存儲的語言取出來重新設置Config,否則當重啟APP後,還是會跟系統語言一樣。 

具體操作參考  Android應用程序內部切換語言及自定義語言

『叄』 Android 屏幕適配

1: dp: android 尺寸的基本單位。 在不同的解析度的手機裡面,1dp對應著不同數量的px, 這樣就實現了dp定義一個控制項大小的時候,在不同解析度手機里表現出相應大小的像素值。
2: 屏幕解析度: 1080下160, 表示寬度有1080個像素點而高度有2160個像素點。常見的解析度有320x480, 480x800, 720x1280, 1080x1920等。
3: 屏幕尺寸: 以寸為單位, Android設備對角線的長度
4: 像素密度: 每英寸的像素點
5: 屏幕尺寸, 解析度,像素密度 三者之間的關系:
密度(dpi)= √(寬2 + 高2)/屏幕尺寸

6: px:像素,是屏幕上顯示數據的最基本的點
7: dpi:屏幕像素密度,每英寸上的像素點數
8: sp:與dp類似,通常用於指定字體的大小,當用戶修改手機顯示的字體時,字體大小會隨之改變。

1: dp適配方案: Android自帶的原始的適配方案, 在不同的解析度手機裡面表現出相應大小的像素點。
缺點: Android的碎片化嚴重, 如果生產廠家沒有根據屏幕尺寸、解析度和像素密度的關系來規則定義, 或者出一些亂七八糟的屏幕大小,這樣的適配方案就不在適合了。

2: 寬高限定符:枚舉所有的屏幕寬高像素值,根據等比縮放去適配。如果沒有找到對應的屏幕, 則取默認的。 目前這種方案已經被棄用。

缺點:
1: 佔用資源大,會增加APK的體積。
2: 容錯機制大需要精準命中資源文件才能適配,比如1920x1080的手機就一定要找到1920x1080的限定符,否則就只能用統一的默認的dimens文件了。而使用默認的尺寸的話,UI就很可能變形。

3:AndroidAutoLayout適配方案(停止維護)

4: SW限定符適配方案:(smallestWidth最小寬度適配)
Android 會去識別屏幕可用高度或者寬度的最小尺寸的dp值。然後根據識別到的結果去對應的資源文件裡面去找尋相應的結果。
如何生成:ScreenMatch插件

此方案跟寬高限定的適配方案相比,有很好的容錯機制, 如果沒有找到對應的適配寬度, 那麼會在vlues文件裡面去找跟他最接近的寬度。

5:今日頭條適配方案:
1>: px 轉 dp 的公式 dp = px / density.不管我們設定的單位是什麼, 最終我們都會將這些單位長度轉化為px的。density就是他們的轉化比, 所以,動態改變這個轉化比也是可以達到我們適配屏幕的目的的。
2>: 通過修改density值,強行把所有不同尺寸解析度的手機的寬度dp值改成一個統一的值(在清單文件中定義),這樣就解決了所有的適配問題。
3>: Density = 當前設備屏幕總寬度(單位為像素)/ 設計圖總寬度(單位為 dp) ;
4>:引入了AndroidAutoSize屏幕適配框架:
https://github.com/JessYanCoding/AndroidAutoSize

最後, 最重要的................
點贊 點贊 點贊, 不重要的事情也就說3遍......

『肆』 Android 圖片適配件如何充滿ImageView

有以下兩種方式:
1. 在layout xml中定義android:scaleType="FIT_XY"
2. 或在代碼中調用imageView.setScaleType(ImageView.ScaleType.FIT_XY);
FIT_XY:不按比例縮放圖片,目標是把圖片塞滿整個View。

『伍』 Android兼容性適配(一)—— 設備兼容性概覽

Android 適用於眾多類型的設備,從手機到平板電腦和電視都能搭載使用。作為開發者,如此廣泛的設備類型能為您的應用帶來廣大的潛在受眾群體。為了能在所有這些設備上順利運行,應用應該容許部分設備功能的變化,並提供可適應不同屏幕配置的靈活界面。

隨著您進一步閱讀 Android 開發相關內容,您可能會在各種語境下遇到「兼容性」一詞。兼容性有兩種類型:設備兼容性和應用兼容性。

作為應用開發者,您無需擔心設備是否兼容 Android,因為只有與 Android 兼容的設備才會附帶 Google Play 商店或該設備的官方手機應用市場。因此,您可以放心,通過Google Play 商店和官方手機應用市場安裝您的應用的用戶使用的是 Android 兼容設備。

不過,您確實需要考慮您的應用是否兼容每一種可能的設備配置。由於 Android 以各種設備配置運行,因此部分功能並不適用於所有設備。例如,某些設備可能未配備羅盤感測器。如果應用的核心功能需要使用羅盤感測器,那麼應用只能與帶有羅盤感測器的設備兼容。

應用可通過平台 API 利用 Android 支持的各種功能。有些功能基於硬體(例如羅盤感測器),有些功能基於軟體(如應用窗口微件),有些功能則依賴於平台版本。並非每台設備都支持所有功能,因此您可能需要根據應用所需的功能控制應用在設備上的可用性。

要盡可能擴大應用的用戶群,您應設法使用單個 APK 支持盡可能多的設備配置。在大多數情況下,要實現這一目標,您可以在運行時停用可選功能,並為應用資源提供針對不同配置的替代選項(例如針對不同屏幕尺寸的不同布局)。不過,如果需要,您可以根據以下設備特徵,通過 Google Play 商店限制應用在設備上的可用性:

為了讓您根據設備功能管理應用的可用性,Android 為可能並不適用於所有設備的任何硬體或軟體功能定義了功能 ID。例如,羅盤感測器的功能 ID 為 FEATURE_SENSOR_COMPASS,而應用微件的功能 ID 為 FEATURE_APP_WIDGETS。

根據需要,要在用戶的設備不具備特定功能時阻止用戶安裝您的應用,您可以通過應用清單文件中的<uses-feature>元素聲明這一點。

例如,如果您的應用在沒有羅盤感測器的設備上沒有意義,您可以使用以下清單標記聲明需要羅盤感測器:

Google Play 商店會將您的應用所需的功能與每個用戶的設備上可用的功能進行比較,以確定您的應用是否與每台設備兼容。如果設備不具備您的應用所需的所有功能,則用戶無法安裝您的應用。

但是,如果應用的主要功能不需要某項設備功能,則應將required屬性設置為 "false"並在運行時檢查是否有該設備功能。如果應用功能在當前設備上不可用,請適當降級相應的應用功能。例如,您可以通過調用hasSystemFeature()來查詢功能是否可用,如下所示:

java

Kotlin

不同的設備可能會運行不同版本的 Android 平台,例如 Android 4.0 或 Android 4.4。每個後續的平台版本通常會添加之前版本中不可用的新 API。為表明可用的 API 集,每個平台版本都會指定API 級別。例如,Android 1.0 是 API 級別 1,而 Android 4.4 是 API 級別 19。

通過 API 級別,您可以使用<uses-sdk>清單標記及其minSdkVersion屬性來聲明應用兼容的最低版本。例如,Android 4.0(API 級別 14)中添加了 日歷提供程序 API。如果您的應用在沒有這些 API 的情況下無法運行,您應將 API 級別 14 聲明為應用的最低支持版本。

minSdkVersion屬性聲明應用兼容的最低版本,targetSdkVersion屬性聲明應用經過優化後適用的最高版本。

不過,請注意<uses-sdk>元素中的屬性會被替換為build.gradle文件中的相應屬性。因此,如果您使用的是 Android Studio,則必須在其中指定minSdkVersion和targetSdkVersion值:

要詳細了解build.gradle文件,請參閱 如何配置編譯版本 。

每個後續版本的 Android 都為使用之前平台版本的 API 構建的應用提供兼容性,因此您的應用應始終與未來版本的 Android 兼容,同時使用已記錄的 Android API。

注意 : targetSdkVersion 屬性不會阻止您的應用安裝在高於指定值的平台版本上,但它很重要,因為它向系統指示您的應用是否應繼承較新版本中的行為更改。如果您不將 targetSdkVersion 更新到最新版本,則系統會認為您的應用在最新版本上運行時需要一些向後兼容性行為。例如,在 Android 4.4 中的行為更改 中,使用 AlarmManager API 創建的鬧鍾現在默認不精確,因此系統可以批量處理應用鬧鍾並節省系統電量,但如果您的目標 API 級別低於「19」,則系統會為您的應用保留之前的 API 行為。

不過,如果您的應用使用的是較新平台版本中添加的 API,但其主要功能並不需要這些 API,則應在運行時檢查 API 級別,並在 API 級別過低時適當降級相應的功能。在這種情況下,請將 minSdkVersion 盡量設置為適用於應用主要功能的最低值,然後將當前系統的版本 SDK_INT 與 Build.VERSION_CODES 中對應於您要檢查的 API 級別的一個代號常量進行比較。例如:

Android 可在各種尺寸的設備上運行,包括手機、平板電腦和電視。為了按照屏幕類型對設備進行分類,Android 為每種設備定義了兩個特徵:屏幕尺寸(屏幕的物理尺寸)和屏幕密度(屏幕上像素的物理密度,稱為 DPI)。為了簡化不同的配置,Android 將這些變體歸納成組,使它們更容易作為定位目標:

四種廣義的尺寸:小、標准、大和特大。
還有幾種廣義的密度:mdpi(中)、hdpi(高)、xhdpi(超高)、xxhdpi(超超高)等。
默認情況下,您的應用會兼容所有屏幕尺寸和密度,因為系統會根據需要對各個屏幕的界面布局和圖片資源進行相應的調整。不過,您應針對不同的屏幕尺寸添加專門的布局,針對常見的屏幕密度添加優化的點陣圖圖片,以優化每種屏幕配置的用戶體驗。

『陸』 Android 屏幕適配

摘自: https://www.jianshu.com/p/ec5a1a30694b
摘自: https://www.jianshu.com/p/337c47721690
摘自: https://www.jianshu.com/p/4669814362ee

因為ui設計師給你的設計圖是以px為單位的,Android開發則是使用dp作為單位的,那麼我們需要進行轉換:

擴展:
Android屏幕適配-基礎篇

   Android推薦使用dp作為尺寸單位來適配UI ,通過dp加上自適應布局和weight比例布局可以基本解決不同手機上適配的問題,這基本是最原始的Android適配方案。
   缺點:
  (1)這種方案只能保證我們寫出來的界面適配絕大部分手機,部分手機仍然需要單獨適配,但dpi的不同,還是會存在差異。
  (2)一般的設計稿都是以px為單位的,所以我們在寫layout文件的時候需要將px轉為dp,影響開發效率。

  為了高效的實現UI開發,出現了新的適配方案,我把它稱作寬高限定符適配。簡單說,就是模仿市面上所有的Android手機的寬高像素值,設定一個基準的解析度,其他解析度都根據這個基準解析度來計算,在不同的尺寸文件夾內部,根據該尺寸編寫對應的dimens文件:

   鴻洋大神的作品 ,使用也超級簡單,核心功能就是在繪制的時候在onMeasure裡面做變換,重新計算px。

   缺點:
  我們自定義的控制項可能會被影響或限制,可能有些特定的控制項(框架沒有做適配的控制項),需要單獨適配。

小結:上述幾種適配方案都是實際開發中用過的方案,但隨著技術不斷的更新,出現了更好的適配方案。

   1.SmallestWidth適配(sw限定符適配)
   實現原理:
  Android會識別屏幕可用高度和寬度的最小尺寸的dp值(其實就是手機的寬度值),然後根據識別到的結果去資源文件中尋找對應限定符的文件夾下的資源文件。

   sw限定符適配 寬高限定符適配 類似,區別在於,前者有很好的容錯機制,如果沒有value-sw360dp文件夾,系統會向下尋找,比如離360dp最近的只有value-sw350dp,那麼Android就會選擇value-sw350dp文件夾下面的資源文件。這個特性就完美的解決了上文提到的寬高限定符的容錯問

   優點:
    1.非常穩定,極低概率出現意外
    2.不會有任何性能的損耗
    3.適配范圍可自由控制,不會影響其他三方庫
   缺點:
    就是多個dimens文件可能導致apk變大,幾百k。

    這里有個問題:
    在項目的其他 mole 中怎麼實現適配?難道也要多套 dimens 文件?

    解答:
    並不需要多套 dimens 文件,只需要在 values 文件夾下有一套與 app mole 一樣的 dimens 文件即可達到適配。因為經過編譯,所有 mole 中的 dimen 數據都會統一歸類到主 mole(即 app mole)中的 values/dimens.xml 文件中了,然後系統又會根據你設置的值去找對應 values-swxxxdp 文件夾下的dimens.xml 文件中的值。

附件: [生成sw文件的工具]( https://links.jianshu.com/go ?

to=https%3A%2F%2Fgithub.com%2Fladingwu%2Fdimens_sw)

實現原理:修改系統的density值(核心)
  今日頭條適配是以設計圖的寬或高進行適配的,適配最終是改變系統density實現的。
過程:

缺點:
   1.只需要修改一次 density,項目中的所有地方都會自動適配,這個看似解放了雙手,減少了很多操作,但是實際上反應了一個缺點,那就是只能一刀切的將整個項目進行適配,但適配范圍是不可控的。
   2.這個方案依賴於設計圖尺寸,但是項目中的系統控制項、三方庫控制項、等非我們項目自身設計的控制項,它們的設計圖尺寸並不會和我們項目自身的設

  AndroidAutoSize 是基於今日頭條適配方案,該開源庫已經很大程度上解決了今日頭條適配方案的兩個缺點,可以對activity,fragment進行取消適配。也是目前我的項目中所使用的適配方案。

   使用也非常簡單只需兩步:
     第一步: 導入依賴

     第二步: 配置AndroidManifest
     在 AndroidManifest 中填寫全局設計圖尺寸 (單位 dp),如果使用副單位,則可以直接填寫像素尺寸,不需要再將像素轉化為 dp,詳情請查看 demo-subunits

老師給的UI設計是在藍湖上的,因為還沒工作,接觸就藍湖,SW個人感覺好處就是藍湖上尺寸多少你就寫多少就行

『柒』 Android-屏幕適配全攻略(絕對詳細)(一)

關鍵字: 屏幕適配 px dp dpi sp large限定符 .9.png

前言: 這篇文章依然是我在 [慕課網 ][h]學習 凱子哥 的同名視頻 Android-屏幕適配全攻略 ,所記錄下來的筆記---凱子哥講得真的超詳細。
[h]: http://www.imooc.com/ "MOOC"

從上圖可以看出,主流的解析度是前六種:1280×720、1920×1080、800×480、854×480、960×540、1184×720,不過我們有解決方案。看完這篇文章,想必你就可以解決常見的屏幕適配問題。

接下來正式進入正題。

介紹幾個在Android屏幕適配上非常重要的名詞:

屏幕尺寸 是指屏幕對角線的長度。單位是英寸,1英寸=2.54厘米
屏幕解析度 是指在橫縱向上的像素點數,單位是px,1px=1像素點,一般是縱向像素橫向像素,如1280×720
屏幕像素密度 是指每英寸上的像素點數,單位是dpi,即「dot per inch」的縮寫,像素密度和屏幕尺寸和屏幕解析度有關

dip: Density Independent Pixels(密度無關像素)的縮寫。以 160dpi 為基準,1dp=1px
dp: dip
dpi: 屏幕像素密度的單位,「dot per inch」的縮寫

px: 像素,物理上的絕對單位

sp: Scale-Independent Pixels的縮寫,可以根據文字大小首選項自動進行縮放。Google推薦我們使用12sp以上的大小,通常可以使用12sp,14sp,18sp,22sp,最好不要使用奇數和小數。

用於區分不同的像素密度。

在Google官方開發文檔中,說明了 ** mdpi:hdpi:xhdpi:xxhdpi:xxxhdpi=2:3:4:6:8 ** 的尺寸比例進行縮放。例如,一個圖標的大小為48×48dp,表示在mdpi上,實際大小為48×48px,在hdpi像素密度上,實際尺寸為mdpi上的1.5倍,即72×72px,以此類推。

我們可以通過以下幾種方式來支持各種屏幕尺寸:

wrap_content: 根據控制項的內容設置控制項的尺寸
math_parent: 根據父控制項的尺寸大小設置控制項的尺寸
weight: 權重,在線性布局中可以使用weight屬性設置控制項所佔的比例

例如,我們要實現下圖所顯示的效果:當屏幕尺寸改變時,new reader控制項兩邊的控制項大小不變,new reader控制項會占完剩餘的空間。

具體布局文件如下:

小插曲: 關於 android:layout_weight 屬性

一般情況,我們都是設置要進行比例分配的方向的寬度為0dp,然後再用權重進行分配。如下:

效果為:

效果為:

button1寬度=L+(L-2L)×1/3=2/3L
button2寬度=L+(L-2L)×2/3=1/3L

當然,還有其他的方式,都可以運用此公式進行計算。
在實際開發中,我們一般使用0dp的方式,而不使用其他方式。

簡單的布局一般都使用 線性布局 ,而略微復雜點的布局,我們使用 相對布局 ,大多數時候,我們都是使用這兩種布局的嵌套。

我們使用 相對布局 的原因是, 相對布局 能在各種尺寸的屏幕上保持控制項間的相對位置。

res/layout/main.xml 單面板:

res/layout-large/main.xml 雙面板:

如果這個程序運行在屏幕尺寸大於7inch的設備上,系統就會載入 res/layout-large/main.xml 而不是 res/layout/main.xml ,在小於7inch的設備上就會載入 res/layout/main.xml 。

需要注意的是,這種通過 large 限定符分辨屏幕尺寸的方法,適用於android3.2之前。在android3.2之後,為了更精確地分辨屏幕尺寸大小,Google推出了最小寬度限定符。

res/layout-sw600dp/main.xml ,雙面板布局: Small Width 最小寬度

這種方式是不區分屏幕方向的。這種最小寬度限定符適用於android3.2之後,所以如果要適配android全部的版本,就要使用 large 限定符和 sw600dp 文件同時存在於項目 res 目錄下。

這就要求我們維護兩個相同功能的文件。為了避免繁瑣操作,我們就要使用布局別名。

由於後兩個文具文件一樣,我們可以用以下兩個文件代替上面三個布局文件:

res/layout/main.xml 單面板布局
res/layout/main_twopanes.xml 雙面板布局

然後在 res 下建立
res/values/layout.xml 、
res/values-large/layout.xml 、
res/values-sw600dp/layout.xml 三個文件。

默認布局
res/values/layout.xml :

Android3.2之前的平板布局
res/values-large/layout.xml :

Android3.2之後的平板布局
res/values-sw600dp/layout.xml :

這樣就有了 main 為別名的布局。
在activity中 setContentView(R.layout.main);

這樣,程序在運行時,就會檢測手機的屏幕大小,如果是平板設備就會載入 res/layout/main_twopanes.xml ,如果是手機設備,就會載入 res/layout/main.xml 。我們就解決了只使用一個布局文件來適配android3.2前後的所有平板設備。

如果我們要求給橫屏、豎屏顯示的布局不一樣。就可以使用 屏幕方向限定符 來實現。
例如,要在平板上實現橫豎屏顯示不用的布局,可以用以下方式實現。
res/values-sw600dp-land/layouts.xml :橫屏

res/values-sw600dp-port/layouts.xml :豎屏

自動拉伸點陣圖,即android下特有的 .9.png 圖片格式。

當我們需要使圖片在拉伸後還能保持一定的顯示效果,比如,不能使圖片中的重要像素拉伸,不能使內容區域受到拉伸的影響,我們就可以使用 .9.png 圖來實現。

要使用 .9.png ,必須先得創建 .9.png 圖片,androidSDK給我們提供了的工具就包含 .9.png 文件的創建和修改工具。雙擊 SDK安裝目錄 oolsdraw9patch.bat ,就會打開下圖所示的窗口。

下面是一個例子:

Button屬性設置:

如果我們選擇的內容區域偏差太大,可能就不會顯示出text值 BUTTON 。

好了,這篇文章寫的有點多了,剩下的內容放在 下篇文章 記錄吧。
內容提要:
解決方案-支持各種屏幕密度
解決方案-實施自適應用戶界面流程

未完待續

『捌』 如何解決android設備的適配問題

一、一些基本概念
1、長度(真實長度):英寸、inch
2、解析度:density 每英寸像素數 dpi(密度)
3、像素:px
4、dip的公式:px /dip=dpi/160 所以 dip 類似於英寸、長度(dp=dip,sp類似於dip) dip=160*inch
dip= 160/dpi * px
當dip一定時,dpi 越大,px就越大
5、廣義解析度=長px*寬px
二、常用規律
1、平時我們說 手機的解析度是 320*480的,其實的這里的解析度是相對解析度
意思是:水平方向上的像素數是320,垂直方向上像素數是480,
解析度是160(默認是160,意思是每英寸像素數160)
那麼水平方向:320 /160=2英寸
垂直方向:480/160=3英寸
於是乎 屏幕對角線 是根號下4*9=3.6(這就是常說的3.6英寸屏幕)

2、說一個手機的屏幕參數有三個:長寬像素之積(相對解析度)、真實解析度(dpi)、對角線長度

3、模擬器的解析度都是160,所以像素越大,屏越大

4、l、m、h 三個文件夾是按 真是解析度dpi 來對應找文件的。

5、有三種方案解決屏幕適配
(1)按像素比 y/開發時用的屏幕像素=x/用戶設備像素
(2)按長度 用dip(假設屏幕尺寸基本不變)
(3)按密度 放在l、m、h文件夾(假設屏幕尺寸基本不變,dpi越大 px越大)

6、如果手機是hdpi,但hdpi里沒有東西,l里有東西,程序就會去l里找圖片並且把它按比例放大。

7、最全的辦法:單獨適配
屏幕解析度:1024x600
density:1(160)
文件夾:values-mdpi-1024x600

屏幕解析度:1024x600
density:1.5(240)
文件夾:values-hdpi-683x400 由1024/1.5 600/1.5得到,需要四捨五入。

屏幕解析度:800x480
density:1(160)
文件夾:values-mdpi-800x480

屏幕解析度:800x480
density:1.5(240)
文件夾:values-hdpi-533x320 由800/1.5 480/1.5得到,需要四捨五入。

以此類推
一般情況下需要創建出values 、values-mdpi 、 values-hdpi文件夾,以備在一些沒有規定的尺寸屏幕上找不到資源的情況。

『玖』 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。

例如:

![code23](https://img-blog.csdnimg.cn/2020111311092374.PNG#pic_center)

注意: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為適配的標准。

『拾』 Android 國際化適配總結

只需要創建對應的values-xxx文件夾,再裡面創建string文件,這是最基本的適配國際化。

這也是比較細節的地方,首頁在設計布局的時候一定要有一種思維,去思考如果以後你這個布局要做國際化,方不方便擴展和優美的展示, 因為國外的語言比如英文,基本都會比中文長,如果你寫布局的時候基本都寫死寬高為多少dp,那就很難做適配
如果翻譯出來的結果實在太長,也可以使用一些技巧,例如使用中文的近義詞再翻譯,總之,你要站在老外的角度去看,你就會發現有些中文表現成其它語言的時候,可以換個簡短的詞。比如說你有個賬號密碼輸入提示框,有提示「請輸入您要設置的密碼」,那你是不是可以翻譯成「passwork」 (可能這個例子舉的不是很好,但是大概就是能做一個轉變的意思)

文字拼接翻譯的時候,一般如果做翻譯語序會混亂。比如說 「您已登陸了10天,總共虧損了6666元」。這種情況下最直接的方式是用String.format。
但是也會存在無法使用String.format的情況,我舉一個極端的例子,假如這個 10 和 6666 兩個數字的樣式和其它文字的樣式不同,比其他文字大啊,顏色不同之類的,甚至可能是圖片。這樣就不好用String.format,但我們也不能蠢到對 「您已登陸了」,「天,總共虧損了」,「元」這3段單獨做翻譯然後拼起來,這樣語序就不對的。
其實這種情況也簡單,做個思維的轉變,我們需要根據變數去做分割,這里變數就是 10 和 6666 ,能把整段話分割成3段(翻譯還是全部一起翻譯,只是做國際化拆段做)。
我們就可以在string文件中定義

拼接就 result = getString(R.string.xxx_paragraph_1) + 10 + getString(R.string.xxx_paragraph_2) + 6666 + getString(R.string.xxx_paragraph_3)
英文就是(我用機翻,英語不太好)

結論就是先整體翻譯再根據變數去拆,而不是先拆再翻。

後台返回的東西也要做國際化,如果是使用了第三方的東西,就要考慮別人有沒有提供,別人沒提供的話就只能自己寫一個邏輯的adapter來做個簡單的適配。如果不方向,可以把第三方返回的數據傳給自己的後台,由我們的後台做翻譯,就相當於多做了一步請求,但是方便修改。

這也是我做海外翻譯覺得最痛的點,比如說某些地方用了成語或者歇後語之類的,「新年你的運勢是:虎虎生威」。這虎虎生威怎麼翻譯,這是比較蛋疼的一個點。

其它資源我們也可以像文字一樣做適配,在values-xxx文件夾下創建相應的資源。
舉幾個我比較常用的做法:
(1)圖片,如果有些圖片存在中文,可以在這個文件夾下放一張名字一模一樣的圖片。缺點就是多佔內存嘛,所以正確的做法是開發這種需求的時候盡可能圖文分離,分離不了就放兩張。
(2)尺寸,上面我說了有些翻譯後的內容普遍比中文長,處理想辦法改文字長度的方法外,我們還可以設多套長度,在使用的時候引用資源,這樣不同語音展示出來的長度就不同。我覺得這個還是比較常用的。

閱讀全文

與android50適配相關的資料

熱點內容
js如何運行時編譯 瀏覽:915
引力app在哪裡下載 瀏覽:607
編寫app如何得到錢 瀏覽:800
吉利汽車軟體放哪個文件夾安裝 瀏覽:223
多文件編譯c 瀏覽:541
頭頂加密後為什麼反而更稀疏 瀏覽:793
離心機壓縮機揚程高 瀏覽:658
xshell連接linux命令 瀏覽:5
把多個文件夾的內容合並在一起 瀏覽:483
基於單片機的澆花系統設計ppt 瀏覽:685
卷積碼編解碼及糾錯性能驗證實驗 瀏覽:354
請在刪除驅動器之前暫停加密什麼意思 瀏覽:787
光催化pdf 瀏覽:98
java字元串包含某字元 瀏覽:528
ssm身份認證源碼 瀏覽:466
預排序遍歷樹演算法 瀏覽:671
加密裝置如何打開ping功能 瀏覽:478
python下載372 瀏覽:901
u盤子文件夾隱藏 瀏覽:296
本地誤刪svn文件夾 瀏覽:686