基于微信的 Android資源混淆工具 ,實(shí)現(xiàn)資源混淆。

站在用戶的角度思考問(wèn)題,與客戶深入溝通,找到龍鳳網(wǎng)站設(shè)計(jì)與龍鳳網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗(yàn),讓設(shè)計(jì)與互聯(lián)網(wǎng)技術(shù)結(jié)合,創(chuàng)造個(gè)性化、用戶體驗(yàn)好的作品,建站類型包括:成都網(wǎng)站設(shè)計(jì)、做網(wǎng)站、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣、空間域名、網(wǎng)絡(luò)空間、企業(yè)郵箱。業(yè)務(wù)覆蓋龍鳳地區(qū)。
Android的資源類型是很多的,比如說(shuō)drawable,string,layout等,aapt在打包時(shí),會(huì)將這些資源的名稱,id和位置打包進(jìn)一個(gè)resources.arsc包。
通過(guò)AndroidStudio可以查看resouces.arsc文件的內(nèi)容。
AndResGuard大致上做的就是修改資源的名稱和路徑,修改為a b c這種簡(jiǎn)短的名稱。
如果你的資源,存在使用插件化的方式加載的,即:使用名稱去找id,再用id去加載資源,由于資源的名稱已經(jīng)修改過(guò)了,所以會(huì)無(wú)法找到id。這種情況不能混淆。框架中提供了添加白名單的方法。
但是三方sdk中隱藏的插件化方式有點(diǎn)防不勝防。官方提供了常見的 sdk白名單
我使用的是gradle集成的方式
在寫前一篇文章 淺述Android Apk打包流程 的時(shí)候發(fā)現(xiàn)解壓后的apk里res的資源文件,有多于我本地項(xiàng)目中的res資源文件夾。
如果我的項(xiàng)目中依賴了Android的一些庫(kù),比如design庫(kù),design里面有自己的res,那么在打包我的項(xiàng)目的時(shí)候,這些res會(huì)合并一起打包。
我查看了下,我確實(shí)依賴了design等庫(kù)。
對(duì)比一下前三張圖,我本地項(xiàng)目沒(méi)有建anim、anim-v21、animator-v21(不再截圖了)等資源文件夾,但是design庫(kù)有,最終一并打包到我的項(xiàng)目中。
res目錄下的文件夾是有命名規(guī)則的,不能隨便起,為的是要適配不同的設(shè)備,而且是要做到最佳的資源匹配。
2.1、資源標(biāo)簽屬性及優(yōu)先級(jí)
除了分辨率外,同種資源之間可以有下面許多資源屬性標(biāo)簽,它們?cè)谄ヅ溥^(guò)程中是有優(yōu)先級(jí)順序的。大家可以快速瀏覽一下即可。以下資源標(biāo)簽修飾語(yǔ)按照優(yōu)先級(jí)從高到低的順序排列。
3、Locale(語(yǔ)言和區(qū)域)
例如en表示英語(yǔ),fr表示法語(yǔ),en-rUS表示英語(yǔ)和美國(guó)地區(qū)。不區(qū)分大小寫,r用于區(qū)分區(qū)域碼。
4、Layout Direction(布局方向)
ldrtl,布局方向從右到左(阿拉伯語(yǔ)等會(huì)這樣布局);ldltr,布局方向從左到右,是默認(rèn)的隱式值。(這就解答了我前面第二個(gè)提的問(wèn)題了)
5、Smallest Screen Width(最小寬度)
swNdp,屏幕的基本尺寸。
sw320dp:適用于320 320 ldpi、320 480 mdpi、480 480 hdpi
sw600dp:適用于600 1024mdpi (7英寸的平板電腦)
sw720dp:適用于720*1280 mdpi (10英寸平板電腦)
當(dāng)你的屏幕的絕對(duì)寬度大于600dp時(shí),屏幕就會(huì)自動(dòng)調(diào)用layout-sw600dp文件夾里面的布局。這里的絕對(duì)寬度是指手機(jī)的實(shí)際寬度,即與手機(jī)是否橫屏沒(méi)關(guān)系,也就是手機(jī)較小的邊的長(zhǎng)度。
6、Screen Width(屏幕寬度)
wNdp ,設(shè)備的可用寬度值隨著當(dāng)前是橫屏還是豎屏?xí)a(chǎn)生變化,即它表示的是當(dāng)前真實(shí)的寬度值。即當(dāng)手機(jī)豎屏?xí)r,為較小邊的長(zhǎng)度;當(dāng)手機(jī)橫屏?xí)r,為較長(zhǎng)邊的長(zhǎng)度。
7、Screen Height(屏幕高度)
hNdp,與lScreen Width的使用一樣,只是這里指的是相對(duì)的高度。指手機(jī)相對(duì)放置的高度;即當(dāng)手機(jī)豎屏?xí)r,為較長(zhǎng)邊的長(zhǎng)度;當(dāng)手機(jī)橫屏?xí)r,為較小邊的長(zhǎng)度。
8、Size(屏幕大小)
samll:低密度,最小布局尺寸為320 426dp
normal:中等密度,標(biāo)準(zhǔn)屏幕最小布局尺寸約為320 470dp
large:中等密度,大屏幕最小布局尺寸為480 640dp
xlarge:大于中等密度,最小布局尺寸為720 960dp。基本用于平板電腦。
該配置并不僅適用于指定設(shè)備,如果沒(méi)有匹配的資源,會(huì)選擇與之最近的。 如果所有資源均大于當(dāng)前屏幕的尺寸限定符,則系統(tǒng)不會(huì)使用這些資源,且應(yīng)用運(yùn)行時(shí)會(huì)崩潰。
9、Ratio(屏幕縱橫比)
long:寬屏
notlong:非寬屏
10、Orientation(屏幕方向)
port:豎向的
land:橫向的
square:正方形的(我也不知道這個(gè)是什么樣子的)
11、UI Mode(UI模式)
無(wú)、car、desk、 television、appliance、 watch6種模式。(其實(shí)我沒(méi)看明白是干嘛的,哈哈)
12、Night Mode(夜間模式)
night:夜間模式
notnight:非夜間模式
可以通過(guò)UiModeManager來(lái)開啟和關(guān)閉這一功能。
13、Density(屏幕像素密度)
ldpi:低密度,約120dpi;mdpi:中等密度,160dpi;hdpi:高密度,240dpi;xhdpi:超高密度,320dpi;xxhdpi:超超高密度,480dpi;xxxhdpi:超超超高密度,640dpi;nodpi:不希望以匹配設(shè)備密度的位圖資源;tvdpi:主要用于電視,約213dpi。anydpi:適用于所有密度,優(yōu)先級(jí)高于其他限定符。
14、Touch Screen(觸摸屏)
notouch:設(shè)備不帶觸摸屏
stylus:觸摸屏通過(guò)手寫筆操作
finger:觸摸屏通過(guò)手指操作
15、Keyboard(鍵盤可用性)
keysexposed:設(shè)備有可用鍵盤。如果當(dāng)前的軟鍵盤被啟用,那么即便設(shè)備沒(méi)有鍵盤或者鍵盤不可用,這個(gè)狀態(tài)仍可能有效。
keyshidden:設(shè)備有鍵盤,但當(dāng)前被隱藏,而且沒(méi)有軟鍵盤啟用。
keyssoft:設(shè)備當(dāng)前軟鍵盤啟動(dòng),即便它處于可見或不可見狀態(tài)。
16、Text Input(文本輸入法)
nokeys:設(shè)備不帶用用于文本輸入的按鍵
qwerty:設(shè)備具有標(biāo)準(zhǔn)硬鍵盤(無(wú)論是否對(duì)用戶可見)
12key:設(shè)備具有 12 鍵硬鍵盤(無(wú)論是否對(duì)用戶可見)
17、Navigation State(定位鍵可用性)
描述定位鍵是否可用,指的是光標(biāo)定位,非GPS導(dǎo)航的定位。
navexposed:定位鍵對(duì)用戶可用
navhidden:定位鍵對(duì)用戶不可用
18、Navigation Method(主要的非觸摸屏定位方式)
nonav:設(shè)備除了觸摸屏外沒(méi)有其他定位方式
dpad:設(shè)備具有用于導(dǎo)航的方向鍵
trackball:設(shè)備具有用于導(dǎo)航的軌跡球
wheel:設(shè)備有方向滾輪用于定位,不常用
19、Dimension(尺寸)
20、Version(平臺(tái)版本)
設(shè)備支持的 API 級(jí)別。例如v4 對(duì)應(yīng)于 API 級(jí)別 4,帶有 Android 1.6 或更高版本系統(tǒng)的設(shè)備。
2.2、怎么在AS中創(chuàng)建這些文件夾呢?
android的應(yīng)用資源包括 動(dòng)畫,圖像,字符串,布局文件等等 ,所有的資源文件都存放在 app/src/res目錄 下。但是,需要注意的是,不同的文件類型需要放在不同的資源目錄下,對(duì)應(yīng)的資源目錄的名稱也不相同。如存放圖片的目錄是drawable目錄;存放布局文件的目錄是layout目錄等等。下面具體介紹關(guān)于android應(yīng)用資源的相關(guān)知識(shí)要點(diǎn)
1、對(duì)于圖片,可以創(chuàng)建一個(gè)xml文件,然后在xml文件中通過(guò)bitmap節(jié)點(diǎn)引用到特定的圖片。如:
?xml version="1.0" encoding="utf-8"?
bitmap xmlns:android=" "
android:src="@drawable/icon_ca" /
2、布局文件,通過(guò)創(chuàng)建xml文件,然后在xml文件中通過(guò)merge節(jié)點(diǎn)引用其他布局文件,如:
?xml version="1.0" encoding="utf-8"?
merge
include layout="@layout/main_ltr"/
/merge
3、字符串及其他簡(jiǎn)單值:只需要將所需字符串的資源ID用作新字符串的值,對(duì)于顏色等其他簡(jiǎn)單值屬性,也是一樣的
?xml version="1.0" encoding="utf-8"?
resources
string name="hello"Hello/string
string name="hi"@string/hello/string
/resources
?xml version="1.0" encoding="utf-8"?
resources
color name="red"#f00/color
color name="highlight"@color/red/color
/resources
一直以來(lái)對(duì)于系統(tǒng)選擇資源文件的流程都模糊不清,每次定義資源的時(shí)候都戰(zhàn)戰(zhàn)兢兢,終于忍無(wú)可忍,無(wú)需再忍,決定掏出官方文檔來(lái)仔細(xì)瞧一瞧。摘要記錄,以防忘記。
官方文檔
一個(gè)簡(jiǎn)單的項(xiàng)目目錄如下所示:
其中資源文件放置在res目錄下,res支持的資源目錄和類型如下:
對(duì)于一個(gè)資源文件,針對(duì)設(shè)備的不同,需要提供一整套的資源文件供程序運(yùn)行時(shí)根據(jù)設(shè)備和運(yùn)行條件(橫屏或者豎屏、移動(dòng)還是聯(lián)通)的不同來(lái)選擇合適的資源文件。
資源文件必須名稱相同地放置到合適的資源文件夾下面,而 資源文件夾的命名至關(guān)重要 。資源文件夾必須嚴(yán)格按照“資源類型名稱-配置1-配置2-...”的方式進(jìn)行命名,如圖2中,drawable是資源類型,hdpi是一個(gè)分辨率的配置。在drawable-hdpi和drawble文件夾中分別放置相同名稱的高分辨率和默認(rèn)配置的2個(gè)資源文件。
設(shè)備在運(yùn)行時(shí)選擇資源的標(biāo)準(zhǔn)就是按照資源文件夾的命名來(lái)匹配選擇最優(yōu)的資源文件。 設(shè)備按如下表的配置順序依次匹配來(lái)選擇最佳的資源(注意: 下表的配置僅為主要配置,不是全部。 ):
對(duì)于資源文件夾的命名必須按照上表中的順序依次配置,切不可倒置。
android系統(tǒng)按照如圖3所示進(jìn)行資源的匹配選擇。
例如app有以下資源文件夾:
drawable/
drawable-en/
drawable-fr-rCA/
drawable-en-port/
drawable-en-notouch-12key/
drawable-port-ldpi/
drawable-port-notouch-12key/
系統(tǒng)配置:
運(yùn)營(yíng)商 = mcc400-mnc00
語(yǔ)言區(qū)域 = en-rGB
屏幕方向 = port
屏幕密度 = hdpi
觸屏類型 = nottouch
開始選擇:
請(qǐng)確保 每種配置都有一個(gè)默認(rèn)的資源可以進(jìn)行選擇 ,這樣在出現(xiàn)設(shè)備沒(méi)有任何匹配文件夾的情況下可以選擇默認(rèn)的文件夾中的資源而不至于導(dǎo)致系統(tǒng)崩潰。例如,如果我們只配置2種文件夾values-en,values-zh,那么在設(shè)備語(yǔ)言為法語(yǔ)(fr)的情況下,按照先移除沖突的資源文件夾的準(zhǔn)則,這2個(gè)資源文件夾都被移除了已經(jīng)沒(méi)有其他可以選擇的資源文件了,系統(tǒng)會(huì)崩潰, 所有任何資源文件夾都請(qǐng)保留一個(gè)默認(rèn)名稱的資源文件夾 。
有時(shí)候有些資源希望在不同的配置下可以服用,例如一個(gè)很大的背景圖片希望在語(yǔ)言為中文(zh)和英文(en)的情況下都使用,這時(shí)候如果在drawable-zh和drawable-en的文件夾下面都放置一種圖片當(dāng)然是可以的,只是這樣會(huì)造成apk的體積過(guò)大。這時(shí)候可以將此圖拷貝到drawable/文件夾下命名為icon_zh_en,而在
drawable-en和drawable-zh文件夾下分別保存下面的icon.xml文件,那么同樣載en和zh的配置下也可以通過(guò)引用R.drawable.icon引用到圖片,從而對(duì)apk瘦身。同樣對(duì)于資源文件、數(shù)組、布局文件都可以使用別名來(lái)引用以達(dá)到避免資源重復(fù)的問(wèn)題。
Android 資源類型
1.字符串資源
1.普通字符串
2.字符串?dāng)?shù)組
復(fù)制代碼
resources
string-array name="planets_array"
itemaaa/item
itembbb/item
/string-array
/resources
復(fù)制代碼
獲取方式:getResources().getStringArray(R.array.planets_array)
3.復(fù)數(shù)字符串資源
某些自然語(yǔ)言中,不同的數(shù)字在使用方法上會(huì)有所不同,比如one book,two books。當(dāng)數(shù)量大于1時(shí),會(huì)使用不同的名詞或其它復(fù)數(shù)形式;
復(fù)制代碼
resources
plurals name="numberOfp"
item quantity="one"one person/item
item quantity="other"more persons/item
/plurals
/resources
復(fù)制代碼
quantity屬性的值除了one和other外,還可以是zero,two,few,many;
引用復(fù)數(shù)字符串:
// 引用數(shù)字為1的復(fù)數(shù)字符串
getResources().getQuantityString(R.pluarlas.numberOfp,1);
// 引用數(shù)字為其它值的復(fù)數(shù)字符串
getResources().getQuantityString(R.pluarlas.numberOfp,10,10);
4.占位符格式化字符串
常用的格式化字符串三種方法:
1.在字符串中使用引號(hào)
字符串中的值雖然可以隨意指定,但是當(dāng)遇到特殊符號(hào)時(shí)(雙引號(hào),單引號(hào))就需要采取特殊的方法來(lái)處理這些符號(hào)。
如果是單引號(hào)(')可以使用轉(zhuǎn)義符(\)或用雙引號(hào)(")將整個(gè)字符串括起來(lái),如果是雙引號(hào),可以在雙引號(hào)前使用轉(zhuǎn)義符(\)。
resources
string name="str1""This'll work"/string This'll work
string name="str2"This\'ll work/string This'll work
string name="str3"\"apple\"/string "apple"
/resources
2.用占位符格式化字符串
使用String.format(String,Object...)方法可以格式化帶占位符的字符串,只需要在字符串中插入占位符,就可以使用String.format方法格式化字符串資源,format方法要求的占位符用%1,%,...,%n,其實(shí)第n個(gè)占位符與format方法的n+1個(gè)參數(shù)值對(duì)應(yīng);
resources
!-- $s表示該占位符被字符串替換,$d表示該占位符被整數(shù)替換 --
string name="str1"hello,%1$s!You have %2$d new message/string
/resources
String str1 =String.format(getResources().getString(R.string.str1), "ly", 17);
3.使用HTML標(biāo)簽格式化字符串資源
字符串資源支持一些HTML標(biāo)簽,因此可以直接在字符串資源中使用這些HTML標(biāo)簽格式化字符串
字符串資源支持如下的HTML標(biāo)簽
b粗體字
i斜體定
u帶下劃線的字
有時(shí)需要同時(shí)使用HTML標(biāo)簽和占位符格式化字符串,如果使用String.format方法格式化字符串,會(huì)忽略字符串中的所有HTML標(biāo)簽。為了使format方法可以格式化帶
HTML標(biāo)簽的確字符,需要使用Html.formHTML方法處理字符串;
resources
string name="hello_world"Welcome to bandroid/b/string
string name="str2"Hello,%1$s! You have b %2d new messages /b/string !--同時(shí)包含占位符和html標(biāo)簽的字符串--
/resources
由于需要使用Html.formHTML方法處理字符串,因此HTML標(biāo)簽中的 "" 需要使用 "" 表示 "" 并不需要處理
獲取字符串:
String text = String.format(getResources().getString(R.string.str2), "ly", 10);
CharSequence styledText = Html.fromHtml(text);
// 如果format的某個(gè)參數(shù)包含HTML的特殊字符,如"","",可以使用如下方式讀取字符串的值;
String escapedUsername = TextUtils.htmlEncode("");
String text1 = String.format(getResources().getString(R.string.str2), "ly", 20);
2.Layout資源
1、如果根節(jié)點(diǎn)是View,除了requestFocus標(biāo)簽外,不能添加任何子標(biāo)簽,requestFocus可能被添加到布局文件的任何View中,表示該標(biāo)簽對(duì)應(yīng)的控件在顯示時(shí)處于焦點(diǎn)狀態(tài),整個(gè)布局文件只能有一個(gè)requestFocus標(biāo)簽
2、根節(jié)點(diǎn)是ViewGroup,常用的布局都是ViewGroup的子類
3、重用布局文件
如果想重用某個(gè)布局文件,可以使用include標(biāo)簽
include layout="@layout/xx_layout" /
如果想讓一個(gè)布局文件被另一個(gè)布局文件引用(使用include標(biāo)簽),可以使用merge作為被引用布局文件的根節(jié)點(diǎn),由于merge并不會(huì)生成任何標(biāo)簽(在大量引用布局文件時(shí)不至于生成大量無(wú)用的標(biāo)簽),但是xml文件必須要有一個(gè)根節(jié)點(diǎn),因此merge所起的作用就是作為xml文件的根節(jié)點(diǎn),以使xml文件在編譯時(shí)不至于出錯(cuò),可以把merge當(dāng)成FrameLayout使用;
3.圖像資源
在圖像資源中可以存儲(chǔ)圖像文件,還可以使用xml格式的圖像資源來(lái)控件圖像的狀態(tài)和行為;
1.普通圖像資源
Drawable da = getResources().getDrawable(R.drawable.xxx);
2.xml圖像資源
xml圖像資源其實(shí)就是在drawable目錄中指定的xml文件,此種方式可以額外指定圖像的某些屬性,如圖像拉動(dòng)、排列方式;
bitmap xmlns:android=""
android:src="@drawable/ic_launcher"
android:tileMode="repeat"
/bitmap
3.Nine-Patch圖像資源
Nine-Patch圖像資源文件必須以9.png作為文件擴(kuò)展名,如abc.9.png
該圖像資源的主要作用是:防止圖像的某一部分被拉伸;確定將圖像作為背景圖的控件中內(nèi)容顯示的位置;
Android SDK本身提供了一個(gè)Draw 9-patch的工具,啟動(dòng)sdk目錄\tools\draw9patch.bat命令啟動(dòng)該工具;
可以通過(guò)此工具在png圖的四周繪制1個(gè)像素粗的直線,上邊緣和左邊緣的直線分別表示圖像在水平和垂直方向可位值的范圍。如果水平或垂直方向的某個(gè)區(qū)域不需要拉伸,則可不繪制相應(yīng)的直線;右邊緣和下邊緣的直線分別表示圖像所在控件中內(nèi)容的顯示范圍,內(nèi)容只在右邊緣和下邊緣繪制直線的區(qū)域顯示,表示內(nèi)容顯示范圍和拉伸范圍的兩給直線有一個(gè)重要區(qū)別就是表示內(nèi)容顯示范圍的直線中間不能斷開,而表示拉伸范圍的直線中間可以斷開;
Nine-Patch圖像資源與普通圖像資源引用方法相同,在引用時(shí)只寫文件名,活力.9.png;
4.XML Nine-Patch圖像資源
Nine-Patch圖像資源也有與其對(duì)應(yīng)的xml圖像資源,使用nine-patch標(biāo)簽來(lái)引用Nine-Patch格式的圖像,有一個(gè)設(shè)置抖動(dòng)的android:dither屬性;
5.圖層資源
圖層資源類似于FrameLayout不同的是FrameLayout標(biāo)簽中可以包含任意的控件,而圖層資源每一層都只有是圖像,定義圖層資源必須使用layer-list作為資源文件的根節(jié)點(diǎn),layer-list標(biāo)簽中包含多個(gè)item標(biāo)簽,每一個(gè)標(biāo)簽表示一個(gè)圖像,最后一個(gè)item標(biāo)簽顯示在最頂層;
默認(rèn)情況下,圖像會(huì)盡量充滿顯示圖像的范圍,圖像可能會(huì)有拉伸,為了避免圖像拉伸,可以在item標(biāo)簽中使用bitmap標(biāo)簽引用圖像;
復(fù)制代碼
layer-list xmlns:android=""
item
android:bottom="10dip" 底端偏移的像素
android:left="10dip" 左側(cè)偏移的像素
android:right="10dip" ...
android:top="10dip" ...
bitmap
android:gravity="center"
android:src="@drawable/hell" /
/item
/layer-list
復(fù)制代碼
某些情況下,可以使用圖層來(lái)代替FrameLayout
6.圖像狀態(tài)資源,處理控件不同狀態(tài)下的顯示狀態(tài)
復(fù)制代碼
selector xmlns:android=""
item android:drawable="@drawable/bm" android:state_focused="true"/item
item android:drawable="@drawable/bm" android:state_pressed="true"/item
item android:drawable="@drawable/bm"/item
/selector
// android:state_focused/pressed設(shè)置為true表示當(dāng)前item的drawable屬性為獲取焦點(diǎn)和按下時(shí)的drawable樣式
復(fù)制代碼
7.圖像級(jí)別(Level)資源
圖像資源狀態(tài)只能指定幾種有限的狀態(tài),可以通過(guò)圖像級(jí)別指定更多的狀態(tài);圖像級(jí)別是一個(gè)整數(shù)的區(qū)間,可以通過(guò)ImageView.setImageLevel或Drawable.setLevel方法切換不同狀態(tài)的圖像;圖像級(jí)別資源是xml文件,必須以level-list為根節(jié)點(diǎn),每一個(gè)item表示一個(gè)級(jí)別區(qū)間,下面是一個(gè)xml文件;通過(guò)ImageView.setImageLevel(level),根據(jù)level所在的區(qū)間設(shè)定顯示的圖像資源,如果level不在任一區(qū)間內(nèi)則清空ImageView當(dāng)前圖像;
level-list xmlns:android=""
item android:maxLevel="2" android:minLevel="0" android:drawable="@drawable/hell" /
item android:maxLevel="4" android:minLevel="3" android:drawable="@drawable/hell" /
/level-list
8.淡入淡出(Cross-fade)資源
也是切換兩個(gè)圖像(不支持多于兩個(gè)圖像的切換),并且使這兩個(gè)圖像以淡入淡出效果進(jìn)行切換,如電燈在開關(guān)時(shí)逐漸變亮或逐漸變暗;
transition xmlns:android=""
item android:drawable="@drawable/hell"/
item android:drawable="@drawable/hell"/
/transition
TransitionDrawable da = ...;
// 從第一張圖片切換到第二張圖片,時(shí)間效果為1秒
da.startTransition(1000);
// 從第二張圖片切換到第一張圖片,時(shí)間效果為1秒
da.reverseTransition(1000);
9.嵌入(insert)圖像資源
使用場(chǎng)景:要顯示的圖像要求要小于裝載圖像的View(圖小于View區(qū)域),也是通過(guò)xml資源定義,只有一個(gè)節(jié)點(diǎn)inset。
inset xmlns:android=""
android:drawable="@drawable/hell"
android:insetLeft="10dip" !--圖像距離左邊的距離,延伸--上/下/右的距離--
/inset
10.剪切(Clip)圖像資源,使用剪切圖像資源可以只顯示圖像的一部分,如可以通過(guò)此來(lái)制作進(jìn)度條;
clip xmlns:android=""
android:clipOrientation="horizontal" // 指定截取的方向
android:drawable="@drawable/hell" // 指定要截取的圖像
android:gravity="left" // 指定截取的方式,在此為從左側(cè)開始截取
/clip
ClipDrawable cd = ...;
cd.setLevel(1000);
上面ClipDrawable.setLevel(level)設(shè)置截取的圖像寬度,ClipDrawable預(yù)設(shè)了最大值10000(表示不進(jìn)行截取),最小值為0(表示不顯示);
11. 比例(Scale)圖像資源
scale xmlns:android=""
android:drawable="@drawable/hell"
android:scaleGravity="center" // 設(shè)置圖像顯示的位置
android:scaleHeight="70%" // 設(shè)置圖像顯示的高度
android:scaleWidth="80%" // 設(shè)置圖像顯示的寬度
/scale
12.形狀資源
復(fù)制代碼
shape xmlns:android=""
android:shape="rectangle" shape可以指定就矩形,oval(橢圓),line(直線),ring(圓)
corners 定義圓角
/corners
gradient
android:angle="45"
android:startColor="#000000"
android:endColor="#FFFFFF" 定義顏色漸變,從左下角到或上角
/gradient
padding 定義控件內(nèi)容到邊框的距離
/padding
stroke 定義邊線
/stroke
solid 定義填充
/solid
size 定義大小
/size
/shape
復(fù)制代碼
13.菜單資源
菜單不僅可以在onCreateContextMenu或onCreateOptionsMenu方法中通過(guò)代碼創(chuàng)建,還可以在res/menu目錄中建立相應(yīng)的菜單資源文件,并在上面兩個(gè)方法中加載菜單資源;
菜單資源文件必須以menu標(biāo)簽作為根節(jié)點(diǎn),每一個(gè)菜單項(xiàng)用一個(gè)item表示,如果要定義子菜單,可以在item標(biāo)簽中包含menu標(biāo)簽;如果想將多個(gè)菜單項(xiàng)劃為一組,可以使用group包含多個(gè)item標(biāo)簽;
復(fù)制代碼
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.main, menu);
return true;
}
復(fù)制代碼
查看MenuInflater.inflate(int,Menu)
復(fù)制代碼
/**
* Inflate a menu hierarchy from the specified XML resource.
*
* @param menuRes Resource ID for an XML layout resource to load (e.g., codeR.menu.main_activity/code)
* @param menu The Menu to inflate into. The items and submenus will be added to this Menu.
*/
public void inflate(int menuRes, Menu menu) {
XmlResourceParser parser = null;
try {
parser = mContext.getResources().getLayout(menuRes);
AttributeSet attrs = Xml.asAttributeSet(parser);
parseMenu(parser, attrs, menu);
} catch ...finally {
if (parser != null) parser.close();
}
}
復(fù)制代碼
14.樣式與主題(style/theme)
1.樣式style
android中樣式和css中樣式作用是一樣的,都是用于為界面元素定義顯示風(fēng)格,它是一個(gè)包含一個(gè)或者多個(gè)控件屬性的集合。
定義樣式需要在res/values/styles.xml中進(jìn)行定義,如下是一個(gè)樣式的定義:
style name="textViewStyle"
item name="android:textSize"22sp/item
item name="android:textColor"#FF0000/item
/style
style name="textViewStyle1" parent="textViewStyle"/style!-- 此樣式繼承自textViewStyle --
style name="textViewStyle.Livingstone"!-- 樣式繼承的另一種寫法,但不可用此寫法繼承Android自帶的定義樣式? --
item name="android:textColor"#00FF00/item
/style
所有定義的樣式都會(huì)在R文件中自動(dòng)生成一個(gè)資源ID,加一個(gè)點(diǎn)表示樣式繼承會(huì)生成上圖所示的資源id;
樣式的引用:
TextView
style="@style/textViewStyle"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="hello" /
2.主題Theme
主題應(yīng)用于整個(gè)應(yīng)用或者activity,樣式應(yīng)用于具體的控件上。主題的應(yīng)用與樣式定義一樣,不同的是主題還可以設(shè)置窗口的顯示風(fēng)格;主題的引用需要在清單文件中進(jìn)行引用,如引用到整個(gè)應(yīng)用之上就需要在Application節(jié)點(diǎn)中進(jìn)行配置引用,而引用到單個(gè)Activity只需要在此Activity中進(jìn)行配置引用;
復(fù)制代碼
style name="Livingstonetheme"!--此定義是一個(gè)無(wú)Title的主題--
item name="android:windowNoTitle"true/item
item name="android:windowFullscreen"?android:windowNoTitle/item
!-- 問(wèn)號(hào)表示引用此主題中android:windowNoTitle屬性的值 --
item name="android:textSize"18sp/item
/style
復(fù)制代碼
android系統(tǒng)定義了一些屬性,如android:theme="@android:style/Theme.Dialog",該主題可以讓Activity看起來(lái)像一個(gè)對(duì)話框,更多主題可以在文檔reference-android-R.style中查看。當(dāng)主題里面的樣式屬性值與樣式里面的屬性值發(fā)生沖突的時(shí)候會(huì)顯示樣式里面的值;
15.其它資源
在資源文件中還可以包括尺寸(dimen)、整數(shù)(integer)、布爾(bool) 、整形數(shù)組資源(integer-array)、資源數(shù)組(array)、顏色(color)
TypedArray ta = getResources().obtainTypedArray(int id); // 獲取數(shù)組資源,包括integer-array、array
Final總結(jié):
除了res/values目錄中的資源名,其它目錄的資源都會(huì)以文件名在R類的相應(yīng)子類中生成變量;而res/values中的資源會(huì)以name屬性值為變量名在R類的相應(yīng)子類中生成變量;
在之前的文章中,我們已經(jīng)講到了 Android 屏幕適配的一些知識(shí),大家感興趣的話,可參考以下文章
Android屏幕適配(1) — 概念解釋
Android屏幕適配(2) — drawable與mipmap
大家都知道在 Android 資源文件夾 res/ 下,我們經(jīng)常能看到 layout-sw720 , drawable-xhdpi , values-w480 等字樣文件夾,那么 res/ 下到底有哪些文件夾可以命名,命名規(guī)則如何?這節(jié)我們來(lái)講講關(guān)于 Android 資源文件夾 res/ 下各文件夾的命名。
今天涉及的知識(shí)點(diǎn)有:
res/ 文件夾下常用資源文件夾類型有:
名稱欄目:android資源,android資源管理器
網(wǎng)站URL:http://chinadenli.net/article49/dsgjdhh.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供小程序開發(fā)、企業(yè)建站、網(wǎng)站改版、網(wǎng)站內(nèi)鏈、網(wǎng)站導(dǎo)航、微信小程序
聲明:本網(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)