99偷拍视频精品区一区二,口述久久久久久久久久久久,国产精品夫妇激情啪发布,成人永久免费网站在线观看,国产精品高清免费在线,青青草在线观看视频观看,久久久久久国产一区,天天婷婷久久18禁,日韩动漫av在线播放直播

android像素,android像素計量單位

屏幕適配那些事(02)Android邏輯像素刨根問底

屏幕適配是一個老生常談的問題了,我用這三篇博客和大家討論點屏幕適配相關(guān)的干貨。

石首ssl適用于網(wǎng)站、小程序/APP、API接口等需要進(jìn)行數(shù)據(jù)傳輸應(yīng)用場景,ssl證書未來市場廣闊!成為創(chuàng)新互聯(lián)的ssl證書銷售渠道,可以享受市場價格4-6折優(yōu)惠!如果有意向歡迎電話聯(lián)系或者加微信:18980820575(備注:SSL證書合作)期待與您的合作!

iOS的屏幕規(guī)格可以列舉處理,iPhone4及更新的設(shè)備,只有4種規(guī)格,他們的邏輯分辨率像也是固定的。Android這邊就比較復(fù)雜了,理論上可以出現(xiàn)無數(shù)種邏輯分辨率。Android的邏輯分辨率可以通過三個步驟推導(dǎo)得到:

以Nexus 5為例:

你可能會問,按照上面的推導(dǎo),屏幕像素密度越低(像素分辨率相同,尺寸越大),邏輯分辨率應(yīng)該越高。但是上一節(jié)討論中,為什么說“三星S7和三星S7 edge,屏幕尺寸分別為5.1和5.5英寸,但是他們顯示的內(nèi)容是一樣多的(邏輯分辨率一致)”?

是的,顯然S7和S7 edge的屏幕像素密度是不同的(尺寸不同但是像素分辨率一致),但是為什么邏輯像素密度會一樣呢?下面進(jìn)行解釋:

Android SDK 中:

我們可以總結(jié)出一個 結(jié)論:Android設(shè)備,雖然屏幕分辨率不同,但是通常相同大小屏幕的設(shè)備具有相同的邏輯分辨率。

有什么指導(dǎo)意義呢?Android設(shè)備雖然有數(shù)不清的屏幕規(guī)格,但是邏輯分辨率的規(guī)格就沒有那么多啦,而且可以方便的找到幾個參考值:360×640(大部分720P及以上手機屏幕)、411×731(部分2K屏幕)等,基準(zhǔn)設(shè)計稿就可以參考這些值啦。

下一篇文章給出一點我對屏幕適配的建議。

Android機型適配總結(jié)

分辨率對應(yīng)DPI

ldpi? QVGA (240×320)

mdpi? HVGA (320×480)

hdpi? WVGA (480×800),FWVGA (480×854)

xhdpi? 720P(1280*720)

xxhdpi 1080p(1920*1080 )

xxxhdpi 4K(3840×2160)

機型適配方面常規(guī)處理方法:

1、開發(fā)之前UI給出不同尺寸標(biāo)準(zhǔn)的多套素材,一般情況下給出:hdpi、xhdpi、xxxhdpi 三種尺寸類型的素材。

2、特殊類型圖片使用Android Studio內(nèi)置draw9path工具進(jìn)行制作,例如聊天界面中內(nèi)容背景圖片。

3、布局編寫時盡量使用 Linearlayout 與 ?RelativeLayout,LinearLayout內(nèi)部可以使用weight(權(quán)重)屬性將子控件的尺寸按比例進(jìn)行設(shè)置。RelativeLayout 內(nèi)部可以使用layout_align...(相對于xxx)屬性將子控件的尺寸相對于父控件或相對于其他子控件進(jìn)行設(shè)置。

4、設(shè)置尺寸的時候長度單位 ?布局使用 dp ?字符使用 ?sp。 其實字體大小的尺寸使用 ?dp 也可以,但是sp的情況下 用戶使用系統(tǒng)設(shè)置字體大小的時候可以改變控件中字體的大小,但是使用dp設(shè)置的字體就不會產(chǎn)生變化。

5、針對每一個屏幕的尺寸生成一套px與dp的轉(zhuǎn)換方案,詳情見博客: Android機型適配方案 。

6、google推出了一個百分比布局庫,可以使用百分比的方式進(jìn)行布局尺寸的設(shè)置,詳情見博客: Android百分比布局庫(percent-support-lib)解析與擴展

7、利用自定義View的方式去解決,其實原理也是,在繪制View的時候,獲取屏幕的尺寸然后按照一定的比例去設(shè)置控件的尺寸

還有一些瑣碎知識點需要了解并記住:

1. px (pixels)像素 :

一個像素通常被視為圖像的最小的完整采樣,這個用的比較多,特別是web開發(fā),頁面基本都是使用像素作為單位的.

2.dp:

這個是最常用但也最難理解的尺寸單位。它與“像素密度”密切相關(guān),所以首先我們解釋一下什么是像素密度。假設(shè)有一部手機,屏幕的物理尺寸為1.5英寸x2英寸,屏幕分辨率為240x320,則我們可以計算出在這部手機的屏幕上,每英寸包含的像素點的數(shù)量為240/1.5=160dpi(橫向)或320/2=160dpi(縱向),160dpi就是這部手機的像素密度,像素密度的單位dpi是Dots Per Inch的縮寫,即每英寸像素數(shù)量。橫向和縱向的這個值都是相同的,原因是大部分手機屏幕使用正方形的像素點。

不同的手機/平板可能具有不同的像素密度,例如同為4寸手機,有480x320分辨率的也有800x480分辨率的,前者的像素密度就比較低。Android系統(tǒng)定義了四種像素密度:低(120dpi)、中(160dpi)、高(240dpi)和超高(320dpi),它們對應(yīng)的dp到px的系數(shù)分別為0.75、1、1.5和2,這個系數(shù)乘以dp長度就是像素數(shù)。例如界面上有一個長度為“80dp”的圖片,那么它在240dpi的手機上實際顯示為80x1.5=120px,在320dpi的手機上實際顯示為80x2=160px。如果你拿這兩部手機放在一起對比,會發(fā)現(xiàn)這個圖片的物理尺寸“差不多”。

3.dip:

與dp完全相同,只是名字不同而已。在早期的Android版本里多使用dip,后來為了與sp統(tǒng)一就建議使用dp這個名字了。

4.sp:

與縮放無關(guān)的抽象像素(Scale-independent Pixel)。sp和dp很類似但唯一的區(qū)別是,Android系統(tǒng)允許用戶自定義文字尺寸大小(小、正常、大、超大等等),當(dāng)文字尺寸是“正常”時1sp=1dp=0.00625英寸,而當(dāng)文字尺寸是“大”或“超大”時,1sp1dp=0.00625英寸。類似我們在windows里調(diào)整字體尺寸以后的效果——窗口大小不變,只有文字大小改變。

還有一些詳細(xì)的情況需要了解,都在這個博客里: 點擊進(jìn)入

Android 屏幕分辨率適配

Android屏幕分辨率千奇百怪,怎么讓app在不同的分辨率的設(shè)備上“看起來一樣”呢?

你也許還有以下疑惑:

這篇文章將會針對以上問題一一解答。

Pixels 我們看到屏幕上的圖像由一個個像素組成,像素里包含色彩信息。

如常說的手機分辨率:1080 x 1920 指的是手機寬度可展示1080像素,高度可展示1920像素。

Pixels Per Inch 每英寸長度所具有的像素個數(shù),單位面積內(nèi)像素越多,圖像顯示越清晰。

ppi一般用在顯示器、手機、平板等描述屏幕精細(xì)度。

Dots Per Inch 每英寸長度所具有的點數(shù)。

dpi一般用來描述打印(書本、雜志、電報)的精細(xì)度

density-independent pixels (device-independent pixels 我查了一下,官網(wǎng)更多時候使用前者,有的時候也顯示后者),dip是縮寫,也可以更簡單些稱作dp。該單位的目的是屏蔽不同設(shè)備密度差異,后面細(xì)說。

Scalable pixels 用于設(shè)置字體,在用戶更改字體大小時候會適配。

澄清了基本概念,我們現(xiàn)在從一個例子開始說明以上單位之間的區(qū)別與聯(lián)系。

布局文件里有個View,長寬都是200px,分別在分辨率為480(寬)x800(高)簡稱A設(shè)備、1080(寬)x1920(高)簡稱B設(shè)備,效果如下:

左邊是A設(shè)備,右邊是B設(shè)備。問題出來了,同樣長寬都是200px,為啥A設(shè)備顯示很大,B設(shè)備顯示很小呢?你可能會說B設(shè)備的橫向分辨率1080比A設(shè)備的480大,所以在B設(shè)備上看起來比較小。來看看A、B設(shè)備橫向到底是多少英寸,怎么來計算呢?這時候就需要用到ppi了,既然知道橫向的像素點個數(shù),也知道每英寸能容納的像素點,當(dāng)然可以得知橫向的尺寸了。

其中一種方式獲取DisplayMetrics對象:

A設(shè)備寬度尺寸:480(px)/240(ppi)=2inch

B設(shè)備寬度尺寸:1080(px)/420(ppi)=2.5inch

可以看出,A、B設(shè)備尺寸差別不大。A設(shè)備ppi=240 B設(shè)備ppi=420,明顯地看出B設(shè)備單位長度上比A設(shè)備能夠容納更多的像素,因此同樣的200px,B設(shè)備只需要較小的尺寸就能夠顯示,因此在B設(shè)備上的view看起來比A設(shè)備小很多。

知道了問題的原因,然而顯示的效果卻不能接受。

我們總不能自己判斷每個設(shè)備的ppi,然后計算實際需要多少像素,再動態(tài)設(shè)置view的大小吧,那layout里的靜態(tài)布局大小就無法動態(tài)更改適應(yīng)了。想當(dāng)然的能有一個統(tǒng)一的地方替我們轉(zhuǎn)換,沒錯!Android系統(tǒng)已經(jīng)幫我們實現(xiàn)了轉(zhuǎn)換。接下來就是dpi、dp出場了。

Android系統(tǒng)使用dpi來描述屏幕的密度,使用dp來描述密度與像素的關(guān)系。

A設(shè)備dpi=240

B設(shè)備dpi=420

Android系統(tǒng)最終識別的單位是px,怎么將dpi和px關(guān)聯(lián)起來呢?,答案是dp。

Android規(guī)定當(dāng)dpi=160時,1dp=1px,當(dāng)dpi=240時,1dp=1.5px,依此類推,并且給各個范圍的dpi取了簡易的名字加以直觀的識別,如120dpi=160,稱作為mdpi,120dpi=240 稱作hdpi,最終形成如下規(guī)則:

現(xiàn)在知道了dp能夠在不同dpi設(shè)備上對應(yīng)不同px,相當(dāng)于中間轉(zhuǎn)換層,我們只需要將view長寬單位設(shè)置為合適的dp,就無需關(guān)注設(shè)備之間密度差異,系統(tǒng)會幫我們完成dp-px轉(zhuǎn)換。將我們之前的例子稍微更改,再看看效果驗證一下:

通過上面對dp的了解,我們知道在設(shè)定view大小、間距時使用dp能最大限度地屏蔽設(shè)備密度之間的差異。可能你就會問了,那bitmap展示的時候如何適配不同密度的設(shè)備呢?

自定義view從磁盤上加載一張圖片,并將之顯示在view上,view的大小決定于bitmap大小。依舊以上述A、B設(shè)備為例,展示結(jié)果如下:

左邊是A設(shè)備,右邊是B設(shè)備。

明顯地看出,在A設(shè)備顯示比B設(shè)備大很多,實際上和我們之前用px來描述view的大小原理是一樣的,bitmap的寬、高都是px在描述,而bitmap決定了view的寬、高,最終導(dǎo)致A設(shè)備和B設(shè)備上的view大小(寬、高像素)是一樣的,而它們屏幕密度又不相同,因此產(chǎn)生了差異。

那不會每次都需要我們自己根據(jù)屏幕密度來轉(zhuǎn)換bitmap大小吧?幸運的是,Android已經(jīng)為我們考慮到了。

生成不同密度的目錄有什么作用?

A設(shè)備dpi=240,根據(jù)dpi范圍,屬于hdpi

B設(shè)備dpi=420,根據(jù)dpi范圍,屬于xxhdpi

圖片原始尺寸:photo1.jpg(寬高 172px-172px)

當(dāng)我們想要在不同密度設(shè)備上顯示同一張圖片并且想要“看起來一樣大時”。假設(shè)設(shè)計的時候以hdpi為準(zhǔn),放置photo1.jpg為172*172,那么根據(jù)計算規(guī)則在xxhdpi上需要設(shè)置photo1.jpg為:

現(xiàn)在hdpi和xxhdpi目錄下分別存放了同名圖片:photo1.jpg,只是大小不同。當(dāng)程序運行的時候:

來看看效果:

左邊A設(shè)備,右邊B設(shè)備

針對不同的密度設(shè)計不同的圖片大小,最大限度保證了同一圖片在不同密度設(shè)備上表現(xiàn)“看起來差不多大”。

來看看A、B設(shè)備上圖片占內(nèi)存大小:

說明在B設(shè)備上顯示photo1.jpg需要更多的內(nèi)存。

上邊只是列舉了hdpi、xxhdipi,同理對于mdpi、xhdpi、xxxhdpi根據(jù)規(guī)則放入相應(yīng)大小的圖片,程序會根據(jù)不同的設(shè)備密度從對應(yīng)的mipmap文件夾下加載資源。如此一來,我們無需關(guān)注bitmap在不同密度設(shè)備上顯示問題了。

在mipmap各個文件夾下都放置同一套資源的不同尺寸文件似乎有點太占apk大小,能否只放某個密度下圖片,其余的靠系統(tǒng)自己適配呢?

現(xiàn)在只保留hdpi下的photo1.jpg圖片,看看在A、B設(shè)備上運行情況如何:

看起來和上張圖差不多,說明系統(tǒng)會幫我們適配B設(shè)備上的圖片。

再來看看A、B設(shè)備上圖片占內(nèi)存大小:

先看A設(shè)備:

對比photo1.jpg 分別放在hdpi、xxhdpi和只放在hdpi下可以看出:B設(shè)備上圖片所占內(nèi)存變小了。為什么呢?接下來從源碼里尋找答案。

A、B設(shè)備同樣加載hdpi/photo1.jpg,返回的bitmap大小不相同,我們從這方法開始一探究竟。

上面涉及到的關(guān)鍵點是density,分別是TypedValue的density和Options的density。

先來看看TypedValue density:

再來看看Options density

現(xiàn)在分析B設(shè)備加載hdpi/photo1.jpg如何做的:

和我們之前調(diào)試的結(jié)果一致。

B設(shè)備是怎么決定使用hdpi下的圖片資源呢?

根據(jù)實驗(嘗試找了源碼,沒怎么看懂,因此只是做了實驗,可能在不同密度設(shè)備上找尋規(guī)則不一樣):B設(shè)備先找屬于自己密度范圍文件夾下的圖片,B設(shè)備屬于xxhdpi,先查看xxhdpi有沒有photo1.jpg,如果沒有則往更高的密度找,比它高的密度是xxxhdpi,還是沒有,則往低密度找,找xhdpi,沒有再找hdpi,找到了則返回構(gòu)造好的TypedValue,剩下的就是我們前面分析的。

既然我們只想放某個密度下的一份切圖,該放哪個密度下呢?從系統(tǒng)尋找規(guī)則看,更推薦放置在更高密度下的,因為如果放在低密度下,那么當(dāng)運行在高密度設(shè)備上時,圖片會進(jìn)行放大,可能導(dǎo)致不清晰。我一般習(xí)慣放在xxhdpi下。

Android Studio默認(rèn)創(chuàng)建了不同密度的mipmap文件夾,默認(rèn)放置了ic_launcher.png。我們普通的切圖該放drawable還是mipmap下呢?對于這個問題網(wǎng)上也是眾說紛紜,實際上對于我們來說,關(guān)注的重點是圖片放在drawable或者mipmap,加載出來bitmap是否有差異,如果沒有差異放在哪就看習(xí)慣了。通過實踐,普通的切圖放drawable和mipmap下加載出來的bitmap是沒有差異的,只不過用drawable的話需要自己創(chuàng)建不同密度的文件夾。我習(xí)慣于放在drawable下(啟動圖標(biāo)logo還是放在mipmap下)。

前邊 [注1] 留了個問題,我們使用dp來表示view的大小了,為啥兩個看起來還是有些差距?下面我們更加直觀地看一個例子。

A設(shè)備dpi=240 密度1.5 分辨率(寬高px):480 * 800

B設(shè)備dpi=420 密度2.625 分辨率(寬高px):1080 * 1794

換算成dp

A設(shè)備分辨率:320dp * 533dp

B設(shè)備分辨率:411dp * 683dp

依舊是上邊的例子:

將view寬高分別設(shè)置為320dp,看看效果:

左邊A設(shè)備,右邊B設(shè)備

可以看出同樣的320dp大小,A設(shè)備鋪滿了屏幕,而B設(shè)備沒有。這效果顯然是不能接受的,Android考慮到不同設(shè)備寬高不同,推出了"寬高限定符"。以A、B設(shè)備為例:

在res文件夾下創(chuàng)建文件夾:

假設(shè)設(shè)計師出圖是按照800x480,那么我們創(chuàng)建dimen文件的時候

該文件放在values-800x480文件夾下。

根據(jù)分辨率比例算出1794x1080的dimen值

這樣子,A、B設(shè)備加載資源的時候使用對應(yīng)分辨率限定符下的px,如果找不到再找默認(rèn)值,可以在一定程度上解決屏幕寬高碎片化適配問題。

但是這樣子的限定比較嚴(yán)格,需要測試各種分辨率,后來Android又推出了"smallest-width"簡稱最小寬度限制。

A設(shè)備寬320dp

B設(shè)備寬411dp

假設(shè)設(shè)計師切圖標(biāo)準(zhǔn)屏幕寬是320dp(A設(shè)備),那么可以定義如下dimen.xml文件

該文件放在values-sw320dp文件夾下

根據(jù)規(guī)則,計算B設(shè)備dimen.xml

現(xiàn)在我們繼續(xù)來看之前的view

通過對dimen引用,A設(shè)備尋找和自己寬度一樣的dimen文件,找到values-sw320dp,dp320=320dp。B設(shè)備尋找和自己寬度一樣的dimen文件,找到values-sw411dp,dp320=410dp。這樣子同樣的dp320,得出不同的值,就適配了屏幕寬度不同的問題。

看看效果:

這次B設(shè)備也鋪滿了屏寬。

綜上,為了適配不同屏幕大小,推薦使用dp+smallest-width。

獲取設(shè)備dpi最終都是從這方法獲取的,實際上就是讀取系統(tǒng)的配置文件。因此我們也可以通過adb shell 獲取:

可以看出dpi是系統(tǒng)配置好的,當(dāng)然有些手機是可以設(shè)置分辨率的,設(shè)置之后我們查看分辨率:

分辨率變低了,dpi也變小了。

Android中分辨率,DPI,DP與PX對應(yīng)關(guān)系

分辨率就是手機屏幕的像素點數(shù)。一般為屏幕的“寬×高”,例如分辨率有720×1280的手機設(shè)備,表示此屏幕在寬度方向有720個像素點,在高度方向有1280個像素點。

按屏幕對角測量的實際物理尺寸。為簡便起見,Android 將所有實際屏幕尺寸分組為四種通用尺寸:小、 正常、大和超大,以英寸(inch)為單位。例如有個5寸的手機設(shè)備,是指對角線的尺寸,5寸×2.54厘米/寸=12.7厘米。

就是每英寸的像素點數(shù),數(shù)值越高當(dāng)然顯示越清晰,通常 與“正常”或“高”密度屏幕相比,“低”密度屏幕在給定物理區(qū)域的像素較少。

在定義 UI 布局時應(yīng)使用的虛擬像素單位,用于以密度無關(guān)方式表示布局維度 或位置。

密度無關(guān)像素等于 160 dpi 屏幕上的一個物理像素,這是 系統(tǒng)為“中”密度屏幕假設(shè)的基線密度。在運行時,系統(tǒng) 根據(jù)使用中屏幕的實際密度按需要以透明方式處理 dp 單位的任何縮放 。dp 單位轉(zhuǎn)換為屏幕像素很簡單: px = dp * (dpi / 160)。 例如,在 240 dpi 屏幕上,1 dp 等于 1.5 物理像素。在定義應(yīng)用的 UI 時應(yīng)始終使用 dp 單位 ,以確保在不同密度的屏幕上正常顯示 UI。

大多數(shù)情況下,確保應(yīng)用中的屏幕獨立性很簡單,只需以適當(dāng)?shù)拿芏泉毩⑾袼兀?dp 單位)或 "wrap_content" 指定所有 布局尺寸值。系統(tǒng)然后根據(jù)適用于當(dāng)前屏幕密度的縮放比例適當(dāng)?shù)乜s放位圖可繪制對象,以 適當(dāng)?shù)拇笮★@示。

如上表所示,現(xiàn)在我們在mdpi下設(shè)計了一個48x48的應(yīng)用圖標(biāo),那么在ldip下大小縮小0.75倍為36x36,在hdip下放大1.5倍為72x72,在xhdpi下放大2倍為96x96,在xxhdpi下放大3倍為144x144,在xxxhdpi下放大4倍為192x192.

android對于不同dpi設(shè)備提供了5個目錄存放圖片,使開發(fā)人員根據(jù)實際需要對圖片適配。一般情況需要UI根據(jù)一種DPI密度、或分辨率的設(shè)備設(shè)計UI,根據(jù)不同dpi的比例出圖,一般需要xhdpi、xxhdpi兩套圖,即2x、3x圖。

計算相關(guān)公式:

px = dpValue * density + 0.5f;

dp = pxValue / density + 0.5f;

Android的基本數(shù)據(jù)單位

1.在Android里邊設(shè)置控件的大小一般用dp,字體用sp,當(dāng)然字體大小也可以用dp來表示,不過這樣APP中的字體大小就不會隨著系統(tǒng)設(shè)置的字體大小而改變了。

2.dp不會隨著手機系統(tǒng)的不一樣,而改變。

3.Android還有一個數(shù)據(jù)單位是px(像素),在layoutparams里邊設(shè)置的變量都是已px來定義的。

4.像素會隨著屏幕密度的改變而有不同的顯示效果,所以要想在不同的系統(tǒng)、機型中擁有相同的大小,就需要px與dp之間的轉(zhuǎn)化,dp*系統(tǒng)像素密度就是px。

網(wǎng)站欄目:android像素,android像素計量單位
分享路徑:http://www.yijiale78.com/article28/dschscp.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站內(nèi)鏈品牌網(wǎng)站制作服務(wù)器托管動態(tài)網(wǎng)站微信公眾號網(wǎng)頁設(shè)計公司

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

成都網(wǎng)站建設(shè)