精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

Android著色器Tint研究

移動開發 Android
Tint 這個東西 主要用來減少apk體積的,比如說我現在有一個textview,他的背景圖 有兩種,一種是當獲得焦點時顯示的a圖,另一種是 失去焦點時顯示的b圖。如果要適配分辨率的話 很有可能圖片會更多,而且在切換的時候 因為是重新加載一次bitmap 效率也會下降很多。所以谷歌就給了一套解決方案 這個就是tint了。

Tint 這個東西 主要用來減少apk體積的,比如說我現在有一個textview,他的背景圖 有兩種,一種是當獲得焦點時顯示的a圖,另一種是 失去焦點時顯示的b圖。

相信大家開發的時候 這種需求做過很多次了,我們一般都會發現 這種a圖和b圖 除了顏色不一樣,其他都是一樣的,但是我們做的時候呢,通常是找ui要了兩張圖。

如果要適配分辨率的話 很有可能圖片會更多,而且在切換的時候 因為是重新加載一次bitmap 效率也會下降很多。所以谷歌就給了一套解決方案 這個就是tint了。

他的目的就是當你發現有這種需求的時候,只需要 放一張圖 在apk里即可,當你需要改變背景圖的顏色的時候 就用Tint即可!

下面就來簡單說一下,tint的使用 以及需要注意的地方。

首先 我們定義一個簡單的布局文件: 

 

 

 

我們發現這2個imageview 都是引用的同樣一個drawable資源,并且 在studio這個xml編輯界面里面 我們很明顯的 能看出來 這個圖片的顏色是黑色的 對吧!

那 現在 我們想改一下,想把iv1 這個imageview的 背景色 改成綠色的! 我們想當然的 當然會這么寫:

  1. iv1 = (ImageView) this.findViewById(R.id.iv1); 
  2.   iv2 = (ImageView) this.findViewById(R.id.iv2); 
  3.   final Drawable originBitmapDrawable = getResources().getDrawable(R.drawable.ic_account_circle_black_18dp); 
  4.   iv1.setImageDrawable(tintDrawable(originBitmapDrawable, ColorStateList.valueOf(Color.GREEN))); 

 應該很好理解對吧,代碼就不解釋了。但是我們運行以后發現: 

 

 

 

臥槽 怎么2個都變綠色了!

回顧一下 我們的代碼 我們應該能明白 2個imageview 都是引用的同樣的一個drawable,要知道 既然是一個drawable,那系統肯定為了優化資源 把這2個drawable 在內存里的拷貝弄成了一份!

還記得 我們以前講的bitmap優化那篇么?http://www.cnblogs.com/punkisnotdead/p/4881771.html 和這個里面的inBitmap 屬性有異曲同工之妙,如果還不理解 你看下面的圖就理解了: 

 

 

 

所以才會造成上面的情況。你修改了共同變量,所以2個圖就都被影響了。

解決方法 其實也很簡單:

  1. final Drawable originBitmapDrawable = getResources().getDrawable(R.drawable. 
  2. ic_account_circle_black_18dp).mutate();  

修改以后 我們再看: 

 

 

 

你看這么做就一切正常了。

那有人就要問了,臥槽 你這么做 不是把谷歌給我們做好的圖片內存優化方案給損壞了么,其實這種擔心是多余的,這個http://android-developers.blogspot.hk/2009/05/drawable-mutations.html

這個地址會告訴你 其實我們做 只是把單獨的受到影響的那部分 內存給單獨拿出來了,其他沒受到影響的還是共享的數據!換句話說 我們內存里 會另外存放的就是一些純的標志位 之類的 類似于狀態值這種東西。

大部分的內存還是公用的!

然后接著來,我們看下一個例子 關于editext的。 

 

 

 

你看這個edittext 的顏色是這樣的。那現在我們來修改一下 這個edittext的背景色

  1. et1 = (EditText) this.findViewById(R.id.et); 
  2.   final Drawable originBitmapDrawable = et1.getBackground(); 
  3.   et1.setBackgroundDrawable(tintDrawable(originBitmapDrawable, ColorStateList.valueOf(Color.GREEN))); 

  

 

 

 

背景色是修改成功了 但是這個光標的顏色 還沒變 非常不協調, 有人又要說了 我們可以用: 

 

 

 

這個xml 屬性來修改呀,當然了這個方法確實是可以的 但是你想 你這么做的話 又要增加資源文件了,不是與我們的tint 背道而馳了么?

所以 這個地方 我們就要想辦法 突破一下。其實很多人都能想到方法了,對于android 沒有 提供給我們的api 比如那些private 函數,

我們通常都是通過反射的方法 去調用的。 這里也是一樣,稍微想一下 我們就能明白, 這個地方 我們就先通過反射來獲取到這個cursorDrawable

然后給他著色,然后在反射調用方法 給他set進去不就行了么?

首先我們都知道 editext 實際上就是textview,所以我們看一下textview 的源碼 找找看 這個屬性到底叫啥名字。經過一番努力發現 在這:

  1. // Although these fields are specific to editable text, they are not added to Editor because 
  2.   // they are defined by the TextView's style and are theme-dependent. 
  3.   int mCursorDrawableRes;  

并且我們要看下editor的源碼 這是和edittext息息相關的:

  1. /** 
  2.      * EditText specific data, created on demand when one of the Editor fields is used. 
  3.      * See {<a href="http://www.jobbole.com/members/57845349">@link</a> #createEditorIfNeeded()}. 
  4.      */ 
  5.     private Editor mEditor; 
  6.  
  7.  
  8. //注意這段代碼屬于editor   
  9. final Drawable[] mCursorDrawable = new Drawable[2];  

有了這段代碼 我們就知道 剩下反射的代碼怎么寫了。 

  1. //參數就是要反射修改光標的edittext對象 
  2.     private void invokeEditTextCallCursorDrawable(EditText et) { 
  3.         try { 
  4.             Field fCursorDrawableRes = TextView.class.getDeclaredField("mCursorDrawableRes"); 
  5.             // 看源碼知道 這個變量不是public的 所以要設置下這個可訪問屬性 
  6.             fCursorDrawableRes.setAccessible(true); 
  7.             //取得 editext對象里的mCursorDrawableRes 屬性的值 看源碼知道這是一個int值 
  8.             int mCursorDrawableRes = fCursorDrawableRes.getInt(et); 
  9.             //下面的代碼 是通過獲取mEditor對象 然后再通過拿到的mEditor對象來獲取最終我們的mCursorDrawable這個光標的drawable 
  10.             Field fEditor = TextView.class.getDeclaredField("mEditor"); 
  11.             fEditor.setAccessible(true); 
  12.             Object editor = fEditor.get(et); 
  13.             Class<?> clazz = editor.getClass(); 
  14.             Field fCursorDrawable = clazz.getDeclaredField("mCursorDrawable"); 
  15.             fCursorDrawable.setAccessible(true); 
  16.             if (mCursorDrawableRes <= 0) { 
  17.                 return
  18.             } 
  19.             //到這里 我們終于拿到了默認主題下 edittext的光標的那個小圖標的drawable 
  20.             Drawable cursorDrawable = et.getContext().getResources().getDrawable(mCursorDrawableRes); 
  21.             if (cursorDrawable == null) { 
  22.                 return
  23.             } 
  24.             //既然都拿到了這個drawble 那就修改他。 
  25.             Drawable tintDrawable = tintDrawable(cursorDrawable, ColorStateList.valueOf(Color.GREEN)); 
  26.             //前面貼出的mCursorDrawable源碼 可以知道 這是一個二維數組。所以我們要構造出一個全新的二維數組 
  27.             Drawable[] drawables = new Drawable[]{tintDrawable, tintDrawable}; 
  28.             //然后再通過反射 把這個二維數組的值 放到editor里面 即可! 
  29.             fCursorDrawable.set(editor, drawables); 
  30.         } catch (NoSuchFieldException e) { 
  31.             e.printStackTrace(); 
  32.         } catch (IllegalAccessException e) { 
  33.             e.printStackTrace(); 
  34.         } 
  35.   
  36.     }  

***調用這個方法以后看一下效果:

 

很*** 對吧~~

***tintDrawable這個方法是用來向下兼容用的。你如果不考慮向下兼容的問題 用系統自帶的方法 就可以了,這里就不做過多介紹了。

  1. public static Drawable tintDrawable(Drawable drawable, ColorStateList colors) { 
  2.         final Drawable wrappedDrawable = DrawableCompat.wrap(drawable); 
  3.         DrawableCompat.setTintList(wrappedDrawable, colors); 
  4.         return wrappedDrawable; 
  5.     }  

當然你也可以用http://andraskindler.com/blog/2015/tinting_drawables/ 這個文章里的方法來做向下兼容:public final class TintedBitmapDrawable extends BitmapDrawable { 

  1.   private int tint; 
  2.   private int alpha; 
  3.   
  4.   public TintedBitmapDrawable(final Resources res, final Bitmap bitmap, final int tint) { 
  5.     super(res, bitmap); 
  6.     this.tint = tint; 
  7.     this.alpha = Color.alpha(tint); 
  8.   } 
  9.   
  10.   public TintedBitmapDrawable(final Resources res, final int resId, final int tint) { 
  11.     super(res, BitmapFactory.decodeResource(res, resId)); 
  12.     this.tint = tint; 
  13.     this.alpha = Color.alpha(tint); 
  14.   } 
  15.   
  16.   public void setTint(final int tint) { 
  17.     this.tint = tint; 
  18.     this.alpha = Color.alpha(tint); 
  19.   } 
  20.   
  21.   @Override public void draw(final Canvas canvas) { 
  22.     final Paint paint = getPaint(); 
  23.     if (paint.getColorFilter() == null) { 
  24.       paint.setColorFilter(new LightingColorFilter(tint, 0)); 
  25.       paint.setAlpha(alpha); 
  26.     } 
  27.     super.draw(canvas); 
  28.   } 
  29.  
責任編輯:龐桂玉 來源: 安卓開發精選
相關推薦

2021-12-23 09:34:05

著色器編程語言軟件開發

2013-01-30 15:37:19

CSS著色器HTML5

2021-03-18 08:03:58

SteamMesa緩存

2023-04-12 07:46:24

JavaScriptWebGL

2023-10-16 15:58:54

開源Blender

2017-05-08 11:41:37

WebGLThree.js

2015-08-07 10:24:17

AndroidMaterialDes

2013-04-15 14:23:21

2022-09-26 12:28:16

OpenGLAPI使用移動應用

2023-11-15 14:15:03

開源Blender

2015-07-08 16:38:19

Tint Color

2023-05-06 07:23:57

2025-01-08 10:17:11

2023-03-16 14:33:23

WebGL初始化繪制

2009-12-29 16:21:46

silverlight

2025-06-03 14:14:59

智能技術AI

2019-07-10 16:45:49

LinuxLinux游戲游戲性能

2024-02-26 00:00:00

前端工具Space.js

2023-09-04 06:52:28

AMD銳龍GPU

2012-05-22 01:20:14

SyntaxHighlJavaScriptJava
點贊
收藏

51CTO技術棧公眾號

国内揄拍国内精品少妇国语| 欧美精品久久天天躁| 久久精品99久久| 国产精品午夜一区二区| 91视频久久| 日韩一区二区在线观看| 337p粉嫩大胆噜噜噜鲁| 四虎久久免费| 国产成都精品91一区二区三| 91黄色8090| 你懂得视频在线观看| 日韩在线视频一区二区三区| 欧美午夜电影在线| 毛片在线视频观看| 毛片免费在线播放| 国产成a人亚洲| 国产精品电影观看| 日本一区二区欧美| 国产精品成人av| 精品一区二区亚洲| 亚洲少妇一区二区| jizz久久久久久| 婷婷夜色潮精品综合在线| 中文字幕在线亚洲三区| 久久经典视频| 国产一区二区在线不卡| 久久久91麻豆精品国产一区| 欧美性xxxx在线播放| 免费观看国产视频在线| www在线播放| caoporm超碰国产精品| 成人免费大片黄在线播放| 国产成人无码精品| 91久久电影| 亚洲性生活视频在线观看| 91九色蝌蚪porny| 国产不卡精品| 欧美色视频一区| 成人久久久久久久久| 久久av色综合| 亚洲综合色自拍一区| 伊人久久大香线蕉成人综合网 | 色天使色偷偷av一区二区| 福利在线一区二区| 中文在线字幕免费观看| 中文字幕一区在线观看视频| 色播亚洲视频在线观看| 久久99久久| 久久久久久**毛片大全| 九九99玖玖| 天天操天天干天天干| 国产米奇在线777精品观看| 国产一区视频在线| 亚洲一级特黄毛片| 久久精品久久99精品久久| 国产精品久久久久久久电影| aaa在线视频| 久久亚洲二区| 国产成人精品在线播放| 精品国产xxx| 日韩高清中文字幕一区| 国产精品视频免费观看www| 欧美一级做a爰片免费视频| 视频一区视频二区在线观看| 欧美孕妇性xx| 欧美成人精品网站| 蜜臀久久99精品久久久久宅男 | 日本伊人久久| 日韩一区二区三区视频在线 | 精品一区二区三区四区五区 | 精品日韩久久久| 国产福利亚洲| 制服.丝袜.亚洲.另类.中文| 日韩av影视大全| 高潮久久久久久久久久久久久久| 亚洲第一区在线观看| 中文字幕一二三四区| 国产午夜一区| 精品精品国产国产自在线| 69av视频在线| 久久av在线| 国产精品久久网| 亚洲av无码国产综合专区| 99视频一区二区| 日本成人三级电影网站| 久操视频在线观看| 亚洲成人免费视频| 黄色一级二级三级| 日韩精品一级| 日韩激情av在线免费观看| 你懂得视频在线观看| 欧美三级在线| 国产精彩精品视频| 国产国语亲子伦亲子| 91麻豆国产福利在线观看| 亚洲成人在线视频网站| 韩国日本一区| 欧美视频中文字幕| 精品视频站长推荐| 久久国产成人精品| 性色av一区二区三区免费| 日韩欧美一级大片| av电影天堂一区二区在线观看| 日本在线成人一区二区| 欧美xxxx少妇| 欧美性生活久久| 在线播放av网址| 国产成人影院| 久久人人爽人人爽人人片av高请 | 91精品国产91久久久久久最新毛片| 欧美性生交xxxxx| 成人激情诱惑| 97成人精品区在线播放| 97人妻人人澡人人爽人人精品 | 精品日本一区二区三区在线观看 | 欧美激情视频一区二区三区不卡| 无码一区二区三区| 成人av动漫在线| 潘金莲一级淫片aaaaa免费看| 中文字幕 在线观看| 日韩三级电影网址| 成人三级视频在线观看| 日韩中文字幕亚洲一区二区va在线| av免费观看久久| 蜜桃av在线免费观看| 日本乱人伦一区| 日本黄色免费观看| 伊人久久成人| 97人人做人人人难人人做| 婷婷在线视频观看| 91成人免费在线| 人妻少妇精品视频一区二区三区| 欧美一区二区| 91久久精品国产91性色| 最新国产在线观看| 欧美在线观看视频在线| 在线 丝袜 欧美 日韩 制服| 亚洲国产黄色| 国产区一区二区三区| 午夜小视频福利在线观看| 欧美剧在线免费观看网站| 91无套直看片红桃在线观看| 日韩福利电影在线| 日本免费高清不卡| 校园春色亚洲色图| 亚洲人成自拍网站| 精品久久久久久久久久久国产字幕 | 国产精品久久久久一区二区三区共 | 色婷婷激情综合| 成人精品999| 日韩精品电影在线| 任我爽在线视频精品一| 日韩网站中文字幕| 中文字幕亚洲字幕| 亚洲天堂网在线观看视频| 国产农村妇女毛片精品久久麻豆| 久久久久久久少妇| 欧美日韩激情| 国产精品热视频| 一本一道波多野毛片中文在线| 欧美视频你懂的| 最新日韩免费视频| 国产在线视视频有精品| 屁屁影院ccyy国产第一页| 成人精品毛片| 欧美在线国产精品| www 日韩| 337p亚洲精品色噜噜噜| 一区二区三区免费高清视频| 成人免费av网站| 超碰网在线观看| 日韩精品免费| 亚洲最大的免费| wwwwxxxx在线观看| 日韩精品一二三四区| 免费看污视频的网站| 日韩一区在线看| 久久久久国产免费| 久久国产88| 久久av秘一区二区三区| 超碰一区二区三区| 国产国产精品人在线视| huan性巨大欧美| 亚洲精品电影在线观看| 国产精品无码粉嫩小泬| 一区二区三区四区视频精品免费 | 国产又黄又猛又粗| 伊人久久大香线蕉精品组织观看| 国产精品视频一区二区三区经| 亚洲一二三四| 欧美理论电影在线播放| 日韩大胆人体| 91精品国产欧美一区二区| 久久久久久91亚洲精品中文字幕| 欧美国产精品中文字幕| 老熟女高潮一区二区三区| 肉色丝袜一区二区| 日韩免费在线观看av| 国产欧美一区| 99免费在线观看视频| 亚洲精品555| 午夜精品一区二区三区av| av播放在线| 亚洲精品久久久久久下一站 | av日韩亚洲| 久久综合久久美利坚合众国| 偷拍自拍在线| 欧美不卡在线视频| 在线视频欧美亚洲| 精品日本美女福利在线观看| 波兰性xxxxx极品hd| 久久综合精品国产一区二区三区| 天堂在线一区二区三区| 久久久久99| 国产精品成人久久电影| 久久久久久久久久久久久久久久久久| 久久香蕉综合色| 91精品导航| 91久久久久久久久| 欧美xnxx| 欧美怡红院视频一区二区三区| 在线看福利影| 久久精品成人一区二区三区| 国产一区精品| 日韩精品亚洲视频| 亚洲欧美日韩精品永久在线| 日韩欧美区一区二| 国产伦理吴梦梦伦理| 欧美在线视频全部完| 91在线视频在线观看| 午夜欧美一区二区三区在线播放| 天堂网avav| 亚洲欧洲精品一区二区三区不卡| 亚洲日本精品视频| 久久久综合九色合综国产精品| 天堂www中文在线资源| 成人午夜视频在线观看| 波多野结衣中文字幕在线播放| 久久99精品国产.久久久久久| 成人性生生活性生交12| 久久亚洲欧美| www.色偷偷.com| 日本欧美加勒比视频| 蜜臀久久99精品久久久酒店新书 | 亚洲精品网站在线| 日韩一区二区不卡| 99热这里只有精品66| 欧美一级免费观看| 99热这里只有精品1| 日韩一区二区免费高清| 精品人妻伦一二三区久久| 欧美一区二区三区视频免费播放| 91精品国自产| 5566中文字幕一区二区电影| av 一区二区三区| 日韩欧美综合在线| 亚洲美女综合网| 亚洲精品国产免费| 国产精品二线| 色天天综合狠狠色| 91网址在线观看| 国内精品久久久久久中文字幕| 国产经典三级在线| 69**夜色精品国产69乱| 日韩精品影片| 国产日韩亚洲欧美| 日韩一区二区三区精品| 国产日韩欧美一区二区| 亚洲人成精品久久久| 欧美日韩国产精品一区二区| 日韩精品诱惑一区?区三区| 国产精品无码乱伦| 激情久久婷婷| av片中文字幕| 精品一区二区精品| 国产吃瓜黑料一区二区| 26uuu欧美| 女性裸体视频网站| 亚洲成a人在线观看| 五月婷婷色丁香| 欧美日韩一区二区在线观看视频| 亚洲一区二区天堂| 亚洲国产精品久久久久久| 色综合久久网女同蕾丝边| 色黄久久久久久| 久久不射影院| 国产精品视频久久| 久久激情av| 亚洲精品日韩成人| 红桃视频国产一区| 一区二区xxx| av中文字幕在线不卡| 网爆门在线观看| 精品成人久久av| 国产精品无码AV| 日韩精品在线观看网站| 好吊日视频在线观看| 欧美在线视频播放| 秋霞影院一区| 日韩福利二区| 亚洲久久一区二区| 中文字幕国产免费| 91免费看片在线观看| 国产精品 欧美激情| 色婷婷av一区二区| 黄色美女一级片| 久久精品久久久久| av一区在线| 国产在线一区二| 中文字幕一区二区三三| 黄色aaa级片| 97se亚洲国产综合自在线| 国产一区二区播放| 欧美三区在线观看| 精品欧美不卡一区二区在线观看 | 亚洲色婷婷一区二区三区| 日本高清无吗v一区| 人人妻人人玩人人澡人人爽| 久久久国产精品x99av| 性欧美18一19sex性欧美| 国产尤物99| 激情一区二区| 欧美激情国内自拍| 国产精品乱人伦中文| 国产成人无码av| 亚洲精品久久久久国产| av在线理伦电影| 成人综合av网| 你懂的国产精品| 亚洲一二区在线观看| 国产精品久久午夜| 在线观看国产成人| 在线日韩中文字幕| 中文另类视频| 日韩精品国内| 日日夜夜精品视频天天综合网| 182在线视频| 疯狂蹂躏欧美一区二区精品| 亚洲欧美另类日韩| 欧美大片免费看| 一本色道69色精品综合久久| 久久久久福利视频| 国产美女精品人人做人人爽| 最新一区二区三区| 4hu四虎永久在线影院成人| 国产在线观看a| 亚洲一区亚洲二区| 自拍偷拍欧美| 国产伦理在线观看| 亚洲综合在线免费观看| 亚洲国产剧情在线观看| 久久久久久97| 精品亚洲免a| 无码人妻丰满熟妇区毛片18| 91麻豆精品视频| 一区二区视频免费观看| 日韩中文理论片| 欧美.com| 欧美一级视频免费看| 91浏览器在线视频| www.日韩一区| 少妇高潮久久久久久潘金莲| 日韩在线你懂得| 青青视频免费在线| 91蜜桃视频在线| 怡春院在线视频| 欧美成人免费va影院高清| 国产一区在线电影| 北条麻妃av高潮尖叫在线观看| 国产欧美日韩久久| av高清一区二区| 欧美怡春院一区二区三区| 欧美一区二区三区激情视频| 捷克做爰xxxⅹ性视频| 亚洲一区av在线| 黄色片免费在线| 国产免费一区二区三区在线能观看 | 亚洲国产毛片完整版| 三上悠亚国产精品一区二区三区| 日韩欧美一区二区三区四区 | 欧美激情视频一区二区三区在线播放| 精品人妻一区二区三区免费| 午夜精品久久久| 大胆av不用播放器在线播放| 91在线免费观看网站| 亚洲电影成人| 国产不卡在线观看视频| 精品少妇一区二区三区在线播放| 最新中文字幕在线播放| 在线观看欧美亚洲| 99久精品国产| 国产精品无码专区av免费播放| 97在线看免费观看视频在线观看| 成人精品天堂一区二区三区| 中文字幕永久免费| 欧美日韩卡一卡二| 日本免费一区二区六区| 国产大尺度在线观看| 久久久综合视频| 亚洲国产精品久久人人爱潘金莲 |