下載本文檔
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
【移動(dòng)應(yīng)用開發(fā)技術(shù)】Android著色器Tint怎么使用
本篇內(nèi)容介紹了“Android著色器Tint怎么使用”的有關(guān)知識(shí),在實(shí)際案例的操作過程中,不少人都會(huì)遇到這樣的困境,接下來就讓在下帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!Tint這個(gè)東西主要用來減少apk體積的,比如說我現(xiàn)在有一個(gè)textview,他的背景圖有兩種,一種是當(dāng)獲得焦點(diǎn)時(shí)顯示的a圖,另一種是
失去焦點(diǎn)時(shí)顯示的b圖。相信大家開發(fā)的時(shí)候這種需求做過很多次了,我們一般都會(huì)發(fā)現(xiàn)這種a圖和b圖
除了顏色不一樣,其他都是一樣的,但是我們做的時(shí)候呢,通常是找ui要了兩張圖。如果要適配分辨率的話很有可能圖片會(huì)更多,而且在切換的時(shí)候因?yàn)槭侵匦录虞d一次bitmap效率也會(huì)下降很多。所以谷歌就給了一套解決方案
這個(gè)就是tint了。他的目的就是當(dāng)你發(fā)現(xiàn)有這種需求的時(shí)候,只需要放一張圖在apk里即可,當(dāng)你需要改變背景圖的顏色的時(shí)候就用Tint即可!首先我們定義一個(gè)簡單的布局文件:我們發(fā)現(xiàn)這2個(gè)imageview都是引用的同樣一個(gè)drawable資源,并且在studio這個(gè)xml編輯界面里面我們很明顯的能看出來
這個(gè)圖片的顏色是黑色的對吧!那現(xiàn)在我們想改一下,想把iv1這個(gè)imageview的背景色改成綠色的!我們想當(dāng)然的當(dāng)然會(huì)這么寫:iv1
=
(ImageView)
this.findViewById(R.id.iv1);
iv2
=
(ImageView)
this.findViewById(R.id.iv2);
final
Drawable
originBitmapDrawable
=
getResources().getDrawable(R.drawable.ic_account_circle_black_18dp);
iv1.setImageDrawable(tintDrawable(originBitmapDrawable,
ColorStateList.valueOf(Color.GREEN)));應(yīng)該很好理解對吧,代碼就不解釋了。但是我們運(yùn)行以后發(fā)現(xiàn):臥槽怎么2個(gè)都變綠色了!回顧一下我們的代碼我們應(yīng)該能明白2個(gè)imageview都是引用的同樣的一個(gè)drawable,要知道
既然是一個(gè)drawable,那系統(tǒng)肯定為了優(yōu)化資源把這2個(gè)drawable在內(nèi)存里的拷貝弄成了一份!還記得我們以前講的bitmap優(yōu)化那篇么?/punkisnotdead/p/4881771.html
和這個(gè)里面的inBitmap屬性有異曲同工之妙,如果還不理解你看下面的圖就理解了:所以才會(huì)造成上面的情況。你修改了共同變量,所以2個(gè)圖就都被影響了。解決方法其實(shí)也很簡單:final
Drawable
originBitmapDrawable
=
getResources().getDrawable(R.drawable.
ic_account_circle_black_18dp).mutate();修改以后我們再看:你看這么做就一切正常了。那有人就要問了,臥槽你這么做
不是把谷歌給我們做好的圖片內(nèi)存優(yōu)化方案給損壞了么,其實(shí)這種擔(dān)心是多余的,這個(gè)http://android-developers.blogspot.hk/2009/05/drawable-mutations.html這個(gè)地址會(huì)告訴你其實(shí)我們做只是把單獨(dú)的受到影響的那部分內(nèi)存給單獨(dú)拿出來了,其他沒受到影響的還是共享的數(shù)據(jù)!換句話說我們內(nèi)存里
會(huì)另外存放的就是一些純的標(biāo)志位之類的類似于狀態(tài)值這種東西。大部分的內(nèi)存還是公用的!然后接著來,我們看下一個(gè)例子關(guān)于editext的。你看這個(gè)edittext的顏色是這樣的。那現(xiàn)在我們來修改一下這個(gè)edittext的背景色et1
=
(EditText)
this.findViewById(R.id.et);
final
Drawable
originBitmapDrawable
=
et1.getBackground();
et1.setBackgroundDrawable(tintDrawable(originBitmapDrawable,
ColorStateList.valueOf(Color.GREEN)));背景色是修改成功了但是這個(gè)光標(biāo)的顏色還沒變非常不協(xié)調(diào),有人又要說了我們可以用:這個(gè)xml屬性來修改呀,當(dāng)然了這個(gè)方法確實(shí)是可以的但是你想你這么做的話又要增加資源文件了,不是與我們的tint背道而馳了么?所以這個(gè)地方我們就要想辦法突破一下。其實(shí)很多人都能想到方法了,對于android沒有提供給我們的api比如那些private函數(shù),我們通常都是通過反射的方法去調(diào)用的。這里也是一樣,稍微想一下我們就能明白,這個(gè)地方
我們就先通過反射來獲取到這個(gè)cursorDrawable然后給他著色,然后在反射調(diào)用方法給他set進(jìn)去不就行了么?首先我們都知道editext實(shí)際上就是textview,所以我們看一下textview的源碼找找看這個(gè)屬性到底叫啥名字。經(jīng)過一番努力發(fā)現(xiàn)
在這://
Although
these
fields
are
specific
to
editable
text,
they
are
not
added
to
Editor
because
//
they
are
defined
by
the
TextView's
style
and
are
theme-dependent.
int
mCursorDrawableRes;并且我們要看下editor的源碼這是和edittext息息相關(guān)的:/**
*
EditText
specific
data,
created
on
demand
when
one
of
the
Editor
fields
is
used.
*
See
{<a
href="/members/57845349">@link</a>
#createEditorIfNeeded()}.
*/
private
Editor
mEditor;
//注意這段代碼屬于editor
final
Drawable[]
mCursorDrawable
=
new
Drawable[2];有了這段代碼我們就知道剩下反射的代碼怎么寫了。//參數(shù)就是要反射修改光標(biāo)的edittext對象
private
void
invokeEditTextCallCursorDrawable(EditText
et)
{
try
{
Field
fCursorDrawableRes
=
TextView.class.getDeclaredField("mCursorDrawableRes");
//
看源碼知道
這個(gè)變量不是public的
所以要設(shè)置下這個(gè)可訪問屬性
fCursorDrawableRes.setAccessible(true);
//取得
editext對象里的mCursorDrawableRes
屬性的值
看源碼知道這是一個(gè)int值
int
mCursorDrawableRes
=
fCursorDrawableRes.getInt(et);
//下面的代碼
是通過獲取mEditor對象
然后再通過拿到的mEditor對象來獲取最終我們的mCursorDrawable這個(gè)光標(biāo)的drawable
Field
fEditor
=
TextView.class.getDeclaredField("mEditor");
fEditor.setAccessible(true);
Object
editor
=
fEditor.get(et);
Class<?>
clazz
=
editor.getClass();
Field
fCursorDrawable
=
clazz.getDeclaredField("mCursorDrawable");
fCursorDrawable.setAccessible(true);
if
(mCursorDrawableRes
<=
0)
{
return;
}
//到這里
我們終于拿到了默認(rèn)主題下
edittext的光標(biāo)的那個(gè)小圖標(biāo)的drawable
Drawable
cursorDrawable
=
et.getContext().getResources().getDrawable(mCursorDrawableRes);
if
(cursorDrawable
==
null)
{
return;
}
//既然都拿到了這個(gè)drawble
那就修改他。
Drawable
tintDrawable
=
tintDrawable(cursorDrawable,
ColorStateList.valueOf(Color.GREEN));
//前面貼出的mCursorDrawable源碼
可以知道
這是一個(gè)二維數(shù)組。所以我們要構(gòu)造出一個(gè)全新的二維數(shù)組
Drawable[]
drawables
=
new
Drawable[]{tintDrawable,
tintDrawable};
//然后再通過反射
把這個(gè)二維數(shù)組的值
放到editor里面
即可!
fCursorDrawable.set(editor,
drawables);
}
catch
(NoSuchFieldException
e)
{
e.printStackTrace();
}
catch
(IllegalAccessException
e)
{
e.printStackTrace();
}
}***調(diào)用這個(gè)方法以后看一下效果:***tintDrawable這個(gè)方法是用來向下兼容用的。你如果不考慮向下兼容的問題用系統(tǒng)自帶的方法就可以了,這里就不做過多介紹了。public
static
Drawable
tintDrawable(Drawable
drawable,
ColorStateList
colors)
{
final
Drawable
wrappedDrawable
=
DrawableCompat.wrap(drawable);
DrawableCompat.setTintList(wrappedDrawable,
colors);
return
wrappedDrawable;
}當(dāng)然你也可以用以下方法來做向下兼容:public
final
class
TintedBitmapDrawable
extends
BitmapDrawable
{
private
int
tint;
private
int
alpha;
public
TintedBitmapDrawable(final
Resources
res,
final
Bitmap
bitmap,
final
int
tint)
{
super(res,
bitmap);
this.tint
=
tint;
this.alpha
=
Color.alpha(tint);
}
public
TintedBitmapDrawable(final
Resources
res,
final
int
resId,
final
int
tint)
{
super(res,
BitmapFactory.decodeResource(res,
resId));
this.tint
=
tint;
this.alpha
=
Color.alpha(tint);
}
public
void
setTint(final
int
tint)
{
this.tint
=
tint;
this.alpha
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 中國海洋工程裝備行業(yè)市場現(xiàn)狀及投資態(tài)勢分析報(bào)告(智研咨詢)
- 智研咨詢發(fā)布:2024年中國變壓器行業(yè)市場現(xiàn)狀及投資前景分析報(bào)告
- 二零二五個(gè)人退伙合作協(xié)議(旅游文化產(chǎn)業(yè)特定)2篇
- 重慶市集成電路產(chǎn)業(yè)發(fā)展政策優(yōu)化研究
- RIS輔助的低軌衛(wèi)星通信系統(tǒng)覆蓋性能優(yōu)化策略研究
- 二零二五年度專業(yè)運(yùn)輸個(gè)人承包合同范本2篇
- 二零二五版養(yǎng)老保險(xiǎn)待遇領(lǐng)取資格終止?fàn)幾h處理合同3篇
- 二零二五年度個(gè)人金融衍生品交易合同范本2篇
- 二零二五版?zhèn)€人合伙健身俱樂部退伙會(huì)員權(quán)益協(xié)議2篇
- 二零二五年度個(gè)人商鋪?zhàn)赓U合同涉及租賃保證金退還細(xì)則2篇
- B區(qū)地下室碳纖維加固施工方案
- 旅行社脫團(tuán)安全協(xié)議書范文模板
- 期中測試卷-2024-2025學(xué)年統(tǒng)編版語文五年級(jí)上冊
- 新教材人教版高中物理選擇性必修第三冊全冊各章節(jié)知識(shí)點(diǎn)考點(diǎn)
- CJT 354-2010 城市軌道交通車輛空調(diào)、采暖及通風(fēng)裝置技術(shù)條件
- 暑假作業(yè) 11 高二英語語法填空20篇(原卷版)-【暑假分層作業(yè)】2024年高二英語暑假培優(yōu)練(人教版2019)
- 2024年江西省南昌市南昌縣中考一模數(shù)學(xué)試題(含解析)
- 繪本的分鏡設(shè)計(jì)-分鏡的編排
- 查干淖爾一號(hào)井環(huán)評
- 體檢中心分析報(bào)告
- 人教版初中英語七八九全部單詞(打印版)
評論
0/150
提交評論