mip源碼zblog mirai源碼

java 正則表達(dá)式怎樣用 邏輯運(yùn)算符啊 ! && ||

今天使用正則表達(dá)式是遇到一個(gè)問(wèn)題, 磨了半天, 發(fā)現(xiàn)犯了個(gè)低級(jí)錯(cuò)誤, 因此記錄下來(lái)加深印象

成都創(chuàng)新互聯(lián)公司是一家專業(yè)的成都網(wǎng)站建設(shè)公司,我們專注成都網(wǎng)站建設(shè)、成都做網(wǎng)站、網(wǎng)絡(luò)營(yíng)銷、企業(yè)網(wǎng)站建設(shè),買友情鏈接廣告投放為企業(yè)客戶提供一站式建站解決方案,能帶給客戶新的互聯(lián)網(wǎng)理念。從網(wǎng)站結(jié)構(gòu)的規(guī)劃UI設(shè)計(jì)到用戶體驗(yàn)提高,創(chuàng)新互聯(lián)力求做到盡善盡美。

問(wèn)題描述:

我需要把 ^drawable(-[a-zA-Z0-9]+)*$ 和 ^mipmap(-[a-zA-Z0-9]+)*$ 這兩個(gè)正則表達(dá)式用或的關(guān)系連接起來(lái)

我嘗試了一下方法都未成功!!

Pattern點(diǎn)抗 pile("^drawable(-[a-zA-Z0-9]+)*$ | ^mipmap(-[a-zA-Z0-9]+)*$")

Pattern點(diǎn)抗 pile("(^drawable(-[a-zA-Z0-9]+)*$) | (^mipmap(-[a-zA-Z0-9]+)*$)")

Pattern點(diǎn)抗 pile("^drawable(-[a-zA-Z0-9]+)* | mipmap(-[a-zA-Z0-9]+)*$")

Pattern點(diǎn)抗 pile("^(drawable | mipmap)(-[a-zA-Z0-9]+)*$")

源碼如下:

import java.util.regex.Pattern;

public class MyClass {

public static Pattern VALID_FOLDER_PATTERN = Pattern點(diǎn)抗 pile("^drawable(-[a-zA-Z0-9]+)*$ | ^mipmap(-[a-zA-Z0-9]+)*$");

//public static Pattern VALID_FOLDER_PATTERN = Pattern點(diǎn)抗 pile("(^drawable(-[a-zA-Z0-9]+)*$) | (^mipmap(-[a-zA-Z0-9]+)*$)");

//public static Pattern VALID_FOLDER_PATTERN = Pattern點(diǎn)抗 pile("^drawable(-[a-zA-Z0-9]+)* | mipmap(-[a-zA-Z0-9]+)*$");

//public static Pattern VALID_FOLDER_PATTERN = Pattern點(diǎn)抗 pile("^(drawable | mipmap)(-[a-zA-Z0-9]+)*$");

public static void main(String[] args) {

if(VALID_FOLDER_PATTERN.matcher("drawable-xhdpi").matches()) {

System.out.println("match");

} else {

System.out.println("no match");

}

if(VALID_FOLDER_PATTERN.matcher("mipmap-xhdpi").matches()) {

System.out.println("match");

} else {

System.out.println("no match");

}

}

}

糾結(jié)了半天發(fā)現(xiàn)自己畫蛇添足地把邏輯符號(hào)或(|) 的左右添加了一個(gè)空格(可能是寫代碼習(xí)慣了-_-!!)

去掉作用兩邊的空格, 其實(shí)上面四個(gè)正則表達(dá)式都是正確的

總結(jié): 在用邏輯符或連接正則表達(dá)式時(shí), 千萬(wàn)不要為了好看而在左右添加空格!! (其他符號(hào)也是一樣! 如^、$、*、.........不一而足...)

Android 屏幕分辨率適配

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

你也許還有以下疑惑:

這篇文章將會(huì)針對(duì)以上問(wèn)題一一解答。

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

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

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

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

Dots Per Inch 每英寸長(zhǎng)度所具有的點(diǎn)數(shù)。

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

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

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

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

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

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

其中一種方式獲取DisplayMetrics對(duì)象:

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è)備單位長(zhǎng)度上比A設(shè)備能夠容納更多的像素,因此同樣的200px,B設(shè)備只需要較小的尺寸就能夠顯示,因此在B設(shè)備上的view看起來(lái)比A設(shè)備小很多。

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

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

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

A設(shè)備dpi=240

B設(shè)備dpi=420

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

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

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

通過(guò)上面對(duì)dp的了解,我們知道在設(shè)定view大小、間距時(shí)使用dp能最大限度地屏蔽設(shè)備密度之間的差異??赡苣憔蜁?huì)問(wèn)了,那bitmap展示的時(shí)候如何適配不同密度的設(shè)備呢?

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

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

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

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

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

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

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

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

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

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

來(lái)看看效果:

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

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

來(lái)看看A、B設(shè)備上圖片占內(nèi)存大?。?/p>

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

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

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

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

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

再來(lái)看看A、B設(shè)備上圖片占內(nèi)存大?。?/p>

先看A設(shè)備:

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

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

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

先來(lái)看看TypedValue density:

再來(lái)看看Options density

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

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

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

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

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

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

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

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(niǎo)設(shè)備沒(méi)有。這效果顯然是不能接受的,Android考慮到不同設(shè)備寬高不同,推出了"寬高限定符"。以A、B設(shè)備為例:

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

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

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

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

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

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

A設(shè)備寬320dp

B設(shè)備寬411dp

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

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

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

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

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

看看效果:

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

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

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

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

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

Android 項(xiàng)目中軟件圖標(biāo)適配和mipmap文件夾的規(guī)則

參考: Android開(kāi)發(fā)使用mipmap文件夾的正確姿勢(shì): px 、dpi 、dp

Android應(yīng)用圖標(biāo)微技巧,8.0系統(tǒng)中應(yīng)用圖標(biāo)的適配

測(cè)試的在華為手機(jī)Android 9.0系統(tǒng)中,但是在切換 targetSdkVersion 大于26和小于26的時(shí)候,并沒(méi)有對(duì)圖標(biāo)進(jìn)行原型切換,26前后對(duì)應(yīng)的圖標(biāo)形狀一樣??赡苁侨A為對(duì)這部分源碼進(jìn)行了修改,將mask層修改為圓角矩形。

mipmap 中的文件夾分別為

新創(chuàng)建的項(xiàng)目都會(huì)有這幾個(gè)文件夾,那么這幾個(gè)文件夾是怎樣的呢??jī)?nèi)部的規(guī)則是什么呢?都是怎樣對(duì)應(yīng)的呢?

講解這些之前我們需要知道我們平常見(jiàn)到的一些尺寸單位的關(guān)系:

px (像素點(diǎn))和 dpi (像素單位密度)之間的換算公式是:

px,dpi 和 dp 之間關(guān)系:

上邊一些尺寸的基礎(chǔ)知識(shí),感覺(jué)很亂啊。。。

接下來(lái)就將一下 mipmap 下邊幾個(gè)文件夾的關(guān)系 表1-1:

上邊 dp 對(duì)應(yīng) px 的比值我起名為 (luffy) 。

我們?cè)陂_(kāi)發(fā)的過(guò)程中,對(duì)圖片的展示通常就兩種:固定寬高,不固定寬高。

固定寬高會(huì)遇到的問(wèn)題是放置的圖片可能會(huì)模糊;不固定寬高可能就會(huì)和自己想要的尺寸不一樣了。

我現(xiàn)在以不固定寬高的來(lái)說(shuō),比如給一個(gè) TextView 設(shè)置 dropLeft ,這樣就不能設(shè)置寬高,那么 ui 給的圖片我到底該放置到哪個(gè) dpi 文件夾里邊才合適呢。因?yàn)槲议_(kāi)發(fā)的是特定機(jī)器上的 app ,所以只需要一個(gè) mipmap 文件夾就行了。

我現(xiàn)在將一張 32 * 32 的圖片分別放到這六個(gè)文件夾里邊,不固定尺寸的顯示圖片,并通過(guò) 方法 獲取圖片的寬高,測(cè)試機(jī)器的 dpi 是 480 。

記住兩個(gè)數(shù)據(jù):圖片尺寸是 32 * 32 ;測(cè)試機(jī)是 480dpi 。

結(jié)果如下 表1-2:

結(jié)果是同一張圖片放到不同的文件夾中,顯示的尺寸是不一樣的,因?yàn)闇y(cè)試機(jī)是 480dpi ,對(duì)應(yīng)的本命 mipmap 文件夾是 mipmap-xxhdpi ,所以這個(gè)文件夾中的圖片在這個(gè)測(cè)試機(jī)上都會(huì)原尺寸顯示。其他的文件夾中的圖片都會(huì)根據(jù)1-2表格中的 dp 和px的換算比例進(jìn)行換算。比如,1-2表中 mipmap-xxhdpi 對(duì)應(yīng)的 luffy 是 3 , mipmap-hdpi 的 luffy 值是 1.5 ,如果我們將 32 * 32 的圖片放到 mipmap-hdpi 文件夾中,其他文件夾中不放置,軟件展示圖片的時(shí)候就會(huì)獲取 mipmap-hdpi 文件夾中的圖片,顯示的效果我們知道是 64 * 64 ,再看對(duì)應(yīng)著剛說(shuō)的 luffy 值,是不是看出點(diǎn)什么?好像不同文件夾中的圖片顯示的效果和luffy值有關(guān)啊。

比如 ,當(dāng)將圖片放置到mipmap-hdpi 文件夾中:

那么如果我們想不管從哪個(gè)文件夾獲取圖片,展示的都是 32*32 ,那好說(shuō)啊,按照這個(gè)公式,獲取不同文件夾中需要放置的圖片尺寸。比如 mipmap-hdpi 放置 16 * 16 的圖片,就可以在我的測(cè)試機(jī)上展示 32 * 32 的效果了。

我上邊一直說(shuō)的展示尺寸都是 px ,那么在不同的機(jī)器上同時(shí)展示 32 * 32 的效果,根據(jù)上邊的公式可以實(shí)現(xiàn),但是展示的效果肯定各不相同。

上邊的需求是我在做特定機(jī)器時(shí),只有一種分辨率,一種 dpi ,那我想把所有 mipmap 文件夾都塞滿,而且展示的效果都一樣,就需要上邊的公式。

當(dāng)手機(jī)上不同的機(jī)器,不同的 dpi 展示同一種效果時(shí),也就是占用屏幕相同的比例時(shí),那表示這個(gè)效果的值就是 dp ,相同的 dp 在不同的機(jī)器上展示的效果基本相同,比如我想在 480dpi 的機(jī)器上展示的效果要和 320dpi 一樣,那就需要它們展示的 dp 一樣,我們展示一個(gè) 32dp*32dp 的圖片。根據(jù)公式: px=dp*(dpi/160) 可以得到 32 * luffy=?px ;那么 480dpi 對(duì)應(yīng)的 luffy 值是 3 ,所以 480dpi 對(duì)應(yīng)的 mipmap 中的圖片尺寸是 96px * 96px , 320dpi 對(duì)應(yīng)的 mipmap 中的尺寸是 64 * 64 。

要在不同的機(jī)器上展示 32dp*32dp 的圖片一張表格展示: 1-3

其他 dp 的圖片都可以按照這個(gè)規(guī)則展示。

當(dāng)合適的 mipmap 文件夾中沒(méi)有對(duì)應(yīng)的圖片的時(shí)候,會(huì)優(yōu)先往高的找,會(huì)優(yōu)先找最近的

網(wǎng)站標(biāo)題:mip源碼zblog mirai源碼
文章網(wǎng)址:http://muchs.cn/article32/ddcgdpc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)頁(yè)設(shè)計(jì)公司、品牌網(wǎng)站制作、App開(kāi)發(fā)、網(wǎng)站維護(hù)定制網(wǎng)站、標(biāo)簽優(yōu)化

廣告

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

搜索引擎優(yōu)化