Ⅰ 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版本、屏幕解析度、廠商機型
其中,Android版本和屏幕解析度是Android標準的適配內容,Google提供了詳細的文檔。很多廠商都對系統做了不同程度的定製,可能因為各種各樣的原因修改了Android系統的API,由此會帶來一些兼容問題,甚至有部分機型存在一些惡心的問題。這部分通常沒有文檔,只能摸著石頭過河。
對於這三項條件,適配原則都是**性價比優先**。在資源許可的條件下,為盡可能多的用戶提供服務。
所以只要列出Android版本、解析度、廠商機型的優先順序,通過排列組合即可確認適配順序和目標。
這里還有個坑,對開發者來說,廠商的出貨量不重要,有多少設備聯網活躍才是最核心的數據。只有聯網活躍設備才可能成為用戶。
Ⅲ 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的適配器的學習和使用(整理)
在開發中我們需要綁定一些數據展現到桌面上,這是就需AdapterView。AdapterView是ViewGroup的子類,它決定了怎麼展現視圖通過Adapter來綁定特
殊的數據類型。AdapterView是非常有幫助的當你展現數據在你的布局中。Gallery,ListView和
Spinner是AdapterView的子類。
顧名思義,就是把一些數據給弄得適當,適合以便於在View上顯示。可以看作是
界面數據綁定的一種理解。它所操縱的數據一般都是一些比較復雜的數據,如數組,鏈表,
資料庫,集合等。
適配器就像顯示器,把復雜的東西按人可以接受的方式來展現。
那麼適配器是怎麼處理得到的數據,並把它顯示出來的呢。其實很簡單,說白了適配器它也
是一個類,在類裡面它實現了父類的這幾個方法:
publicint getCount() //得到數據的行數
public Object getItem(int position)//根據position得到某一行的記錄
public long getItemId(int position)//的到某一條記錄的ID
//下面這個方法是最重要的相比於其它幾個方法,它顯式的定義了,適配器將要 以什麼樣的
//方式去顯示我們所填充的數據,在自定義的適配器裡面我們通常會給它寫個布局文件
publicView getView(int position, View convertView, ViewGroup parent)
我們常用的適配器一共有三個:ArrayAdapter,SimpleAdapter,SimpleCursorAdapter 這三個,他們都是繼承於BaseAdapter 。
Ⅳ 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屏幕適配的哪些事
為了保證用戶獲得一致的用戶體驗效果,使得某一元素在Android不同尺寸、不同解析度的手機上具備相同的顯示效果,則需要我們進行屏幕適配。
基礎概念
屏幕尺寸
屏幕尺寸是指屏幕對角線的長度,單位是英寸,1 inch=2.54 cm
屏幕解析度
手機在橫向和縱向上的像素點數總和,單位是像素(pixel),1px = 1像素點,舉個栗子,1080x1920,即寬度方向上有1080個像素點,在高度方向上有1920個像素點。
屏幕像素密度
每英寸像素點個數,單位是dpi,dots per inch。為簡便起見,Android 將所有屏幕密度分組為六種通用密度: 低、中、高、超高、超超高和超超超高。
ldpi(低)~120dpi
mdpi(中)~160dpi
hdpi(高)~240dpi
xhdpi(超高)~320dpi
xxhdpi(超超高)~480dpi
xxxhdpi(超超超高)~640dpi