真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

android屏幕,Android屏幕旋轉(zhuǎn)

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

關(guān)鍵字: 屏幕適配 px dp dpi sp large限定符 .9.png

專注于為中小企業(yè)提供成都網(wǎng)站建設(shè)、成都網(wǎng)站制作服務(wù),電腦端+手機端+微信端的三站合一,更高效的管理,為中小企業(yè)新縣免費做網(wǎng)站提供優(yōu)質(zhì)的服務(wù)。我們立足成都,凝聚了一批互聯(lián)網(wǎng)行業(yè)人才,有力地推動了1000+企業(yè)的穩(wěn)健成長,幫助中小企業(yè)通過網(wǎng)站建設(shè)實現(xiàn)規(guī)模擴充和轉(zhuǎn)變。

前言: 這篇文章依然是我在 [慕課網(wǎng) ][h]學(xué)習(xí) 凱子哥 的同名視頻 Android-屏幕適配全攻略 ,所記錄下來的筆記---凱子哥講得真的超詳細。

[h]: "MOOC"

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

接下來正式進入正題。

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

屏幕尺寸 是指屏幕對角線的長度。單位是英寸,1英寸=2.54厘米

屏幕分辨率 是指在橫縱向上的像素點數(shù),單位是px,1px=1像素點,一般是縱向像素橫向像素,如1280×720

屏幕像素密度 是指每英寸上的像素點數(shù),單位是dpi,即“dot per inch”的縮寫,像素密度和屏幕尺寸和屏幕分辨率有關(guān)

dip: Density Independent Pixels(密度無關(guān)像素)的縮寫。以 160dpi 為基準,1dp=1px

dp: 同 dip

dpi: 屏幕像素密度的單位,“dot per inch”的縮寫

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

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

用于區(qū)分不同的像素密度。

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

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

wrap_content: 根據(jù)控件的內(nèi)容設(shè)置控件的尺寸

math_parent: 根據(jù)父控件的尺寸大小設(shè)置控件的尺寸

weight: 權(quán)重,在線性布局中可以使用weight屬性設(shè)置控件所占的比例

例如,我們要實現(xiàn)下圖所顯示的效果:當(dāng)屏幕尺寸改變時,new reader控件兩邊的控件大小不變,new reader控件會占完剩余的空間。

具體布局文件如下:

小插曲: 關(guān)于 android:layout_weight 屬性

一般情況,我們都是設(shè)置要進行比例分配的方向的寬度為0dp,然后再用權(quán)重進行分配。如下:

效果為:

效果為:

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

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

當(dāng)然,還有其他的方式,都可以運用此公式進行計算。

在實際開發(fā)中,我們一般使用0dp的方式,而不使用其他方式。

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

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

res/layout/main.xml 單面板:

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

如果這個程序運行在屏幕尺寸大于7inch的設(shè)備上,系統(tǒng)就會加載 res/layout-large/main.xml 而不是 res/layout/main.xml ,在小于7inch的設(shè)備上就會加載 res/layout/main.xml 。

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

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

這種方式是不區(qū)分屏幕方向的。這種最小寬度限定符適用于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);

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

如果我們要求給橫屏、豎屏顯示的布局不一樣。就可以使用 屏幕方向限定符 來實現(xiàn)。

例如,要在平板上實現(xiàn)橫豎屏顯示不用的布局,可以用以下方式實現(xiàn)。

res/values-sw600dp-land/layouts.xml :橫屏

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

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

當(dāng)我們需要使圖片在拉伸后還能保持一定的顯示效果,比如,不能使圖片中的重要像素拉伸,不能使內(nèi)容區(qū)域受到拉伸的影響,我們就可以使用 .9.png 圖來實現(xiàn)。

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

下面是一個例子:

Button屬性設(shè)置:

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

好了,這篇文章寫的有點多了,剩下的內(nèi)容放在 下篇文章 記錄吧。

內(nèi)容提要:

解決方案-支持各種屏幕密度

解決方案-實施自適應(yīng)用戶界面流程

未完待續(xù)

Android 屏幕適配

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

1.px,pixel 就是像素,最基本的真實顯示單位

2.dp,dip, Density-independent pixel,設(shè)備的獨立像素,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上是固定的,改變不了,為了適配,通過人為設(shè)置一個dpi,來規(guī)范這些差不多ppi值,使得這些相差差不多的屏幕都是通用一個dpi,也就是使用同一套設(shè)計方案。

一開始通過dp值來實現(xiàn)適配,是可以解決大部分適配問題,但是在遇到pad這種設(shè)備,由于是橫屏,而且系統(tǒng)設(shè)置還可以修改density值,使得用一套固定屏幕(比如1280 * 800)的方向變得不是那么合適。

這時候想到可以通過Android中 dimens中定義dimen值,Android中可以通過sw去搜索對應(yīng)的dimen值表來獲取對應(yīng)的配置,smallestWidth適配,sw限定符適配,只要我們把對應(yīng)的表通過換算,得到一個新值,就可以得到在不同的density值中得到對應(yīng)的dp值表,解決華為上一個設(shè)備對應(yīng)不同density值的問題。

那么問題來了,如果去得到sw不同的dimens呢,網(wǎng)上的方法很多,有些自己寫腳本,有些自己寫程序生成,為了就是列舉所有的值,一般1-1000dp,然后基于一個基準,比如360dp寬度,去換算出不同屏幕寬度的dimens值,這里我推薦Android Studio的插件ScreenMatch,先安裝插件

然后在values中創(chuàng)建dimens文件夾,并創(chuàng)建dimens.xml,其中寫上自己定義的dp值,如下

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

插件就會生成一堆其他屏幕的dimens文件,并且自動生成1-800的其他dp值,基本滿足開發(fā)中的定義,如果沒有的話,就自行在這里定義,然后重新生成。

關(guān)于ScreenMatch的生成還有一個基準,就是基于那個dpi來生成,通過插件生成,在根目錄會多出了兩個文件,一個example, 一個config文件

這里我們看看properties文件,內(nèi)容如下

其中base_dp=850就是基于850,然后可以通過match_dp去調(diào)整要適配的dpi值。

通過這方方式,會在dimens文件自動生成dimen文件

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

android 屏幕適配基礎(chǔ)知識

最近參考 今日頭條算法 ,優(yōu)化了項目的屏幕適配策略。下面是適配過程中的一些心得,部分內(nèi)容來源于網(wǎng)絡(luò)。

舉個例子:屏幕分辨率為:1920*1080,屏幕尺寸為5吋的話,那么dpi為440。

dp就是密度自適應(yīng)的像素。1dp表示 在dpi為160的設(shè)備上的一顆像素

px與dp的換算公式px = dp * (dpi / 160),很顯然,由于相同分辨率但不同屏幕大小的設(shè)備dpi是不同的,導(dǎo)致px和dp的基本不存在一個固定的換算關(guān)系,為了方便屏幕適配,Android設(shè)置了6個通用的密度,換算px與dp時采取通用密度計算,而非設(shè)備實際的密度。

以下為6種通用密度,以及其最小的分辨率

得到上面通用密度之后,我們換算dp與px多了一種簡便方式。Android系統(tǒng)用mdpi(160dpi)作為基準,此時1px = 1dp,又有px = dp * (dpi / 160),所以我們可以很容易的得到以下?lián)Q算:

sp在dp的基礎(chǔ)上引入了scaleFactor變量,一般用于字號,可在系統(tǒng)設(shè)置里調(diào)大。

同一張圖片放到以上4個分辨率類型的文件夾里,在頁面上呈現(xiàn)的效果如下

實際呈現(xiàn)的算法為: 圖片尺寸 * 系統(tǒng)density / 文件夾 density

因為圖片尺寸、系統(tǒng)density都是固定的,因此圖片最終尺寸表現(xiàn)為: 圖片放的位置越"low",呈現(xiàn)的尺寸越大

比如 圖片寬度200px,系統(tǒng) density =3,則圖片寬度

下面是詳細的解釋

我們知道,不管在布局文件中填寫的是什么單位,它最后都會被系統(tǒng)轉(zhuǎn)化為 px。系統(tǒng)的轉(zhuǎn)換算法如下:

可以看到 px = dp*density 。

橫向適配的最終目的:讓100dp的寬度,在各個機型上,在屏幕上所占的 比例相同 。

其核心算法是px = dp* density。通過修改density這個變量,我們可以讓px和畫布標(biāo)注的px值一致,達到適配的效果。

美工同學(xué)提供的畫布寬度為 750px(iphone6) ,開發(fā)中,我們對這些px標(biāo)注 除2 得到dp值進行使用。

那么density如何求出呢? 根據(jù)系統(tǒng)算法px = dp*density,反推 density =px/dp

拿橫向適配畫布, density對于不同分辨率的手機修改后如下:

375是我們拿UI畫布橫向分辨率750/2得出。

Android屏幕適配-應(yīng)用篇

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

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 提示:以下是本篇文章正文內(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的機型屏幕大小品類太多了,有一些是不標(biāo)準的,這時我們就需要單獨去獲取屏幕的分辨率和密度了。

# 二、獲取屏幕的分辨率和密度

```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、先生成標(biāo)準的值。//value = (i + 1) * 1;

2、再用生成其他的值。 //value = (i + 1) * 需要生成的sw值/標(biāo)準的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)換的值,如果是標(biāo)準尺寸就一對一轉(zhuǎn)換

? ? ? ? ? ? //value = (i + 1) * 需要生成的sw值/標(biāo)準的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為適配的標(biāo)準的,你們可改自己的標(biāo)準)

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為適配的標(biāo)準。


新聞名稱:android屏幕,Android屏幕旋轉(zhuǎn)
文章URL:http://weahome.cn/article/dsspscd.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部