當前位置:首頁 » 安卓系統 » android適配屏幕

android適配屏幕

發布時間: 2025-02-13 19:40:30

1. android屏幕適配有哪些方法

Android 資源文件夾有其中兩種方式支持屏幕適配:
一、方法:
1.XXX XXX-ldpi XXX-mdpi XXX-hdpi XXX-xhdpi XXX-xxhdpi 這種方式 (推薦使用)
2.XXX XXX-123x456 後面是具體值(不推薦使用這種方式!)
當我們做適配處理時通常會在以上一堆文件夾中定義 xxx.xml 例如 定義一個 : <dimen name="list_item_height">100dip</dimen>
二、適配舉例:
Android的匹配機制和手機系統有關:
規則一:Android4.0 以上的手機,先尋找和設備吻合的文件夾里的相應文件里的資源,如果沒有找到會繼續匹配它下面(比它解析度或密度小)的一些文件夾,最後去XXX 默認文件夾中匹配。
eg1: 小米2s (4.1 1280x720) 有文件夾 XXX XXX-320x240 XXX-800x480 XXX-1280x719 XXX-1280x720 XXX-1280x721 XXX-xhdpi
1.匹配XXX-xhdpi
2.匹配XXX-1280x720
3.匹配XXX-1280x719
4.匹配XXX-480x800
5.匹配XXX-320x240
6.匹配XXX
eg2:HTC ONE (4.2 1920×1080)
規則二:Android4.0 以下的手機,先尋找和設備吻合的文件夾里的相應文件里的資源,如果沒有找到會繼續匹配它下面(比它密度小)的一些文件夾。
eg:三星m250L(同三星9100 2.3.7 800x480) 有文件夾 XXX XXX-320x240 XXX-800x479 XXX-480x800 XXX-ldpi XXX-mdpi XXX-hdpi
1.匹配XXX-hdpi
2.匹配XXX-mdpi
3.匹配XXX-480x800
4.匹配XXX
5.匹配XXX-ldpi
6.程序退出
eg3:華為U8860(2.3.6 854x480)
所以在項目中<dimen name="list_item_height">50dip</dimen> 分別定義在
values : <dimen name="list_item_height">50dip</dimen> 和
values-320x240 : <dimen name="list_item_height">42dip</dimen> 中.
小米2s 會取 values-320x240 中42dip 的值。

2. 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


  • dimen_example2.png


  • 即使使用dp,依然不能解決屏幕解析度的適配問題,我們可以針對不同的屏幕創建不同的dimen值。

3. 怎麼樣讓Android實現全屏幕適配

一、關於布局適配

1、不要使用絕對布局

2、盡量使用match_parent 而不是fill_parent 。

3、能夠使用權重的地方盡量使用權重(android:layout_weight)

4、如果是純色背景,盡量使用android的shape 自定義。

5、如果需要在特定解析度下適配,可以在res目錄上新建layout-HxW.xml的文件夾。比如要適配1080*1800的屏幕(魅族MX3採用此解析度)則新建layout-1800x1080.xml的文件夾,然後在下面定義布局。Android系統會優先查找解析度相同的布局,如果不存在則換使用默認的layout下的布局。

二、關於圖片製作

1、關於設計:

設計圖先定下一個要設計的尺寸,而且盡量採用在目前最流行的屏幕尺寸(比如目前占屏幕比重比較多的是480系列,也即是480*800或者400*854,下面的圖標製作也在次基礎上進行比例的換算)上設計。

先了解一下屏幕的級別:

屏幕級別:

注意屏幕級別是按照密度分級,和像素沒有關系。如果非要讓密度和像素扯上關系,則需要一個參照系,android使用mdpi級別作為標准參照屏幕,也就是說在320*480解析度的手機上一個密度可以容納一個像素。然後其他密度級別則在此基礎上進行對比。如果理想情況下,480*800的屏幕一個密度可以容納1.5個像素。

物理大小:

單位是英寸而不是像素,也就說一個英寸在任何解析度下顯示的大小都是一樣的,但是像素在密度不同的手機裡面顯示的實際的大小是不一樣的(這就是為什麼android手機需要適配的原因)。

然後就是重點。

假設1像素在160密度下顯示1英寸,則1像素在240密度基礎上顯示大約0.67英寸,在320密度下顯示0.5英寸。於是就出現一種情況,在電腦上的一個像素,在不同的手機上看實際的大小不一樣。那麼怎麼讓「設計效果」在不同的手機上看起來顯示的區域一樣呢?

還是假設一個像素在160密度下的顯示在一個密度內,也假設就是一英寸。那麼需要幾個像素才能在240密度級別下顯示在一英寸范圍內呢?答案是1.5個像素(根據上圖的比率換算)。

了解了這個關系,接下來就是圖標的製作。

2、關於切圖。

關於切圖有幾個建議:

第一,長寬最好是3的倍數(根據android的推薦logo圖標的大小是48(mdpi),72(hdpi),96(xhdpi)得出的最小公約數)。

第二,長寬最好是偶數。因為奇數在進行等比壓縮的時候可能有問題。

第三,根據上面兩條,如果長寬是6的倍數最理想。

第四,如果可以拉伸而不改變設計意圖的情況下,比如純色背景,則使用android的9path工具製作成.9的圖片。

3、關於圖標的適配。

然後接下來的一切就和設計稿沒什麼關系。在切好圖的基礎上,根據屏幕密度、像素和實際大小的比例關系。假如設計司在480*800的解析度下做好了設計圖,並且切好圖,如果你需要適配720*1280屏幕,該怎麼做?根據比例,他們的關系是2:3,於是你需要按照1.5倍比例製作圖標,比如你在480*800的設計稿上切下來一個20*20像素的圖,那麼你就需要製作一個等比放大成30*30像素的圖標,這樣同一個圖標在480*800的屏幕和720*1280的屏幕上顯示的實際大小才一樣。同理,如果你需要適配xxhdpi則需要在20*20的基礎上製作一個等比放大成40*40像素的圖標。

4、關於圖標的目錄,480*800切下來的圖我們放在drawable-hdpi目錄下,按照2:3放大的圖標放在drawable-xhdpi目錄下,按照2倍放大的圖標放在drawable-xxhdpi目錄下。

android會根據手機的密度優先查找對應的目錄的資源,

比如408*800解析度下的手機如果密度是160,則自動載入drawable-hdpi這個目錄下的圖標,

如果720*1280密度是240的手機自動載入drawable-xhdpi這個目錄下的圖標。如果沒有這個文件夾,則查找和240最接近的對應密度文件夾。

三、其它

接下來要說的估計會讓你失望,根據上面的步驟也不能完全解決適配的問題,只能是大概適配,而就算根據上面的步驟大概適配了,實際在手機上的效果也有出入。

比如魅族MX3的解析度是1080*1800,標准情況下密度是480,但是他的密度大約是524,和480接近,也就是會查找drawable-xxhdpi這個資源下的文件。也就是說你在480*800解析度下切圖然後按兩倍放大的圖標在這台手機上顯示的效果還是比實際的小。

而另一個要說的問題是540*960或者640*960,他們的密度很可能是或者接近240也可能是320。於是在480*800的設計稿上切下來的圖並且進行的適配製作,在這些手機上顯示的實際大小也可能或大或小。

4. 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為適配的標准。

5. Android屏幕適配-應用篇

Android屏幕適配-基礎篇
Android屏幕適配-應用篇

從兩個大方面闡述一下Android的屏幕適配:

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

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

鴻洋大神的作品 ,使用也超級簡單,核心功能就是在繪制的時候在onMeasure裡面做變換,重新計算px。
缺點 :我們自定義的控制項可能會被影響或限制,可能有些特定的控制項(框架沒有做適配的控制項),需要單獨適配。

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

   實現原理 :Android會識別屏幕可用高度和寬度的最小尺寸的dp值( 其實就是手機的寬度值 ),然後根據識別到的結果去資源文件中尋找對應限定符的文件夾下的資源文件。
   sw限定符適配 寬高限定符適配 類似,區別在於,前者有很好的容錯機制,如果沒有value-sw360dp文件夾,系統會向下尋找,比如離360dp最近的只有value-sw350dp,那麼Android就會選擇value-sw350dp文件夾下面的資源文件。這個特性就完美的解決了上文提到的寬高限定符的容錯問題。
   優點: 1.非常穩定,極低概率出現意外
    2.不會有任何性能的損耗
    3.適配范圍可自由控制,不會影響其他三方庫
   缺點 :就是多個dimens文件可能導致apk變大,幾百k。

   附件: 生成sw文件的工具

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

  AndroidAutoSize 是基於今日頭條適配方案,該開源庫已經很大程度上解決了今日頭條適配方案的兩個缺點,可以對activity,fragment進行取消適配。也是目前我的項目中所使用的適配方案。
使用也非常簡單只需兩步:
(1)引入:

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

6. 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遍......

熱點內容
和平精英安卓版怎麼調成中文 發布:2025-02-13 22:16:10 瀏覽:36
混沌起源需要什麼配置玩 發布:2025-02-13 22:14:33 瀏覽:277
vs引入文件夾 發布:2025-02-13 22:05:52 瀏覽:127
安卓手機如何調無限電量 發布:2025-02-13 22:05:50 瀏覽:113
phppost長度 發布:2025-02-13 22:05:45 瀏覽:626
烈火戰神源碼 發布:2025-02-13 22:04:51 瀏覽:619
源碼貓交易 發布:2025-02-13 22:04:49 瀏覽:756
廣告腳本鏡頭 發布:2025-02-13 22:04:48 瀏覽:986
安卓手機哪個app自拍更真實 發布:2025-02-13 22:00:19 瀏覽:194
安卓系統密碼忘了怎麼辦 發布:2025-02-13 21:49:28 瀏覽:972