精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

成人av资源站| 人妻熟女aⅴ一区二区三区汇编| 日本高清视频www| 天天做天天爱天天爽综合网| 在线观看91av| 人妻av中文系列| 成年人在线看| 国产一二三精品| 热久久这里只有精品| 成人黄色短视频| 成人av影音| 欧美图区在线视频| www.日本少妇| 三区四区在线视频| 成人综合激情网| 国产成人激情视频| 久久久久久久久久99| 色综合综合色| 精品国产精品网麻豆系列 | 精品9999| 亚洲美女av黄| 日本天堂在线播放| 九九热线视频只有这里最精品| 国产日韩欧美高清| 国产精品一区视频| 久久久女女女女999久久| 精品无码在线视频| 亚洲超碰在线观看| 欧美久久一区二区| 97视频在线免费播放| 性欧美1819sex性高清大胸| 99re这里都是精品| 91美女片黄在线观看游戏| 在线观看污污网站| 欧美午夜电影在线观看| 日日噜噜噜夜夜爽亚洲精品| 免费的av网站| 高潮按摩久久久久久av免费| 在线国产电影不卡| 免费看的黄色大片| 9999精品成人免费毛片在线看 | 精品免费视频.| 图片区乱熟图片区亚洲| 久草综合在线| 欧美性欧美巨大黑白大战| 亚洲理论电影在线观看| 国产在线高清视频| 久久久一区二区三区| 91精品在线看| 亚洲性生活大片| 日本免费新一区视频| 欧美激情视频在线观看| 精品人妻无码一区| 日韩成人一级| 亚洲福利影片在线| 三上悠亚 电影| 日本一区二区三区播放| 日韩欧美中文字幕精品| 被黑人猛躁10次高潮视频| 国产亚洲久久| 欧美人妖巨大在线| 亚洲理论中文字幕| 成人h在线观看| 欧美视频完全免费看| 成年人免费大片| 亚洲www.| 91久久久免费一区二区| 成人性生生活性生交12| 在线观看v片| 亚洲成人免费影院| 北条麻妃69av| av在线日韩| 在线播放91灌醉迷j高跟美女| 国产乱码一区二区三区四区| 欧美日本三级| 欧美一区二区三区免费大片| 精品国产乱码久久久久夜深人妻| 精品国内亚洲2022精品成人| 日韩av一区在线观看| 朝桐光av一区二区三区| 久久男人av| 欧美tickling网站挠脚心| 中文字幕天堂网| 欧美日韩国产一区二区三区不卡 | 性囗交免费视频观看| 欧美网色网址| 亚洲精品永久免费| 四虎影院中文字幕| 日韩视频精品在线观看| 国产suv精品一区二区| 国产成人自拍偷拍| 精品中文字幕一区二区| 91久久精品国产91久久| 亚洲欧洲综合在线| 欧美激情中文不卡| 日本视频一区二区在线观看| 思思99re6国产在线播放| 亚洲人成电影网站色mp4| 日韩国产欧美亚洲| 色综合久久久| 日韩精品中文字幕有码专区| 看黄色录像一级片| 亚洲免费中文| 99国产精品久久久久老师| 蜜桃视频在线免费| 夜夜嗨av一区二区三区网页| 成年人网站大全| 一区二区三区四区视频免费观看| 亚洲视频在线免费观看| 懂色av粉嫩av浪潮av| 日韩亚洲精品在线| 亚洲a在线观看| 黄色片在线播放| 一区二区三区高清| 天天爽人人爽夜夜爽| 久久久久久毛片免费看| 欧美成人精品在线| 亚洲欧美一二三区| 国产电影精品久久禁18| 亚洲国产精品久久久久婷婷老年| 国产啊啊啊视频在线观看| 欧美日韩国产天堂| 一区二区精品免费| 国产综合自拍| 亚洲一区久久久| а天堂8中文最新版在线官网| 亚洲国产精品尤物yw在线观看| 中文字幕在线综合| 成人情趣视频| 日韩美女写真福利在线观看| 人人妻人人澡人人爽久久av| 一区二区三区资源| 精品综合久久久久| 国产伦精品一区二区三区视频| 国产69精品99久久久久久宅男| 国产绳艺sm调教室论坛| 国产欧美日韩在线视频| 亚洲美免无码中文字幕在线| 99re91这里只有精品| 萌白酱国产一区二区| 久久精品五月天| www国产亚洲精品久久麻豆| 国产91在线亚洲| 二区三区精品| 亚洲视频专区在线| 加勒比在线一区| 久久精品欧美一区二区三区不卡| 久久精品.com| 亚洲三级网址| 国产精品扒开腿爽爽爽视频| 日韩在线观看视频网站| 婷婷久久综合九色综合伊人色| 国模无码视频一区| 国产一区二区高清| 国产在线一区二区三区播放| 爱搞国产精品| 日韩精品在线观看视频| 国产中文字幕视频| 久久久午夜精品| 天天爱天天操天天干| 色呦哟—国产精品| 成人中文字幕在线观看| 黄色网页网址在线免费| 欧美一级国产精品| 久久亚洲精品大全| 99久久精品一区| 国产精品少妇在线视频| 色喇叭免费久久综合| 91免费在线视频网站| 国产人成网在线播放va免费| 日韩一级在线观看| 久久视频免费看| 91在线观看地址| a级黄色一级片| 欧美一区二区三区高清视频| 欧美与欧洲交xxxx免费观看| eeuss影院www在线播放| 欧美一二区视频| aaa人片在线| 欧美激情中文字幕| 国产人妻精品午夜福利免费| 国产一区二区三区久久久久久久久| 日本精品一区二区三区视频| 亚洲精品自拍| 欧美精品电影免费在线观看| 久久这里精品| 欧美一区二区国产| 欧美日韩一级大片| 久久久久久久国产精品影院| 三年中文在线观看免费大全中国| 韩国亚洲精品| 亚洲成人一区二区三区| www.豆豆成人网.com| 国产大片精品免费永久看nba| www在线视频| 亚洲欧美国产va在线影院| 国产精品国产av| 亚洲国产综合在线| 国产性猛交xx乱| av在线播放成人| www.污网站| 日韩高清欧美激情| 97欧美精品一区二区三区| 欧美美乳在线| 日韩一区二区三区四区五区六区| 91午夜视频在线观看| 亚洲日本一区二区三区| 亚洲国产果冻传媒av在线观看| 美国欧美日韩国产在线播放| 91免费版看片| 日韩精品看片| 欧美精品一区二区三区在线四季| 日韩中文字幕| 国产一区深夜福利| 日韩av首页| 亚州国产精品久久久| 成人a在线视频免费观看| 亚洲区在线播放| 人妻无码中文字幕| 欧美日韩亚洲综合在线 | 亚洲自拍欧美另类| 欧美日韩激情电影| 欧美中文字幕在线播放| 美女视频黄免费的久久| 国产亚洲视频中文字幕视频| 97人妻精品一区二区三区动漫| 欧美日韩精品国产| 久久午夜无码鲁丝片| 国产精品久久久久9999吃药| 国产精品无码一区二区三区免费| 国产成人综合在线观看| 日本高清久久久| 国产一级成人av| 亚洲字幕一区二区| 日韩免费在线电影| 国产精品久久不能| 福利写真视频网站在线| 超碰91人人草人人干| 成人免费在线观看| 中文字幕一区日韩电影| 成人午夜影视| 色999日韩欧美国产| 日本中文字幕电影在线免费观看| 国产亚洲xxx| 福利在线视频导航| 中文字幕亚洲一区在线观看 | 国产成人丝袜美腿| 欧美色图校园春色| 国产一区二区三区四| 香港日本韩国三级网站| 美女精品自拍一二三四| av网站在线不卡| 国内精品免费**视频| 亚洲午夜精品一区| 无码免费一区二区三区免费播放 | 国产日韩欧美一区二区| 日本成人手机在线| 91精品视频观看| 亚洲成人偷拍| 国产欧美亚洲日本| 日韩高清一级| 日本一区二区三区视频在线播放| 国产成人短视频在线观看| 欧美一级日本a级v片| 成人亚洲一区| 无码人妻aⅴ一区二区三区日本| 欧美福利专区| 浴室偷拍美女洗澡456在线| 欧美激情性爽国产精品17p| 99热久久这里只有精品| 欧美韩日高清| 国产av熟女一区二区三区| 欧美精品国产| 国产精品久久久久9999爆乳| 久久久精品五月天| 国产精品一区二区小说| 国产不卡视频在线播放| 国产激情第一页| 中文字幕欧美日韩一区| 亚洲一二三四五六区| 一区二区三区在线视频观看58 | 亚洲欧美另类小说视频| www.天天色| 欧美三片在线视频观看| 国产又大又粗又长| 日韩av在线免费播放| 黄色在线视频观看网站| 精品国内亚洲在观看18黄| 中文有码在线播放| 在线综合+亚洲+欧美中文字幕| 丰满人妻一区二区三区四区53| 日韩成人在线视频观看| 日韩在线观看视频一区| 中文字幕9999| 日本aa在线| 91国语精品自产拍在线观看性色| 国产一区二区精品调教| 亚洲自拍偷拍色片视频| 国产精品免费不| 屁屁影院ccyy国产第一页| 一区免费在线| 污污网站在线观看视频| 99re在线视频这里只有精品| 日韩在线中文字幕视频| 一个色在线综合| 一卡二卡在线观看| 亚洲成在人线av| 午夜看片在线免费| 97在线免费观看| 免费一级欧美在线大片 | 女生裸体视频一区二区三区| 四虎成人av| 欧美有码在线观看| 高清av不卡| 亚洲v日韩v综合v精品v| 蜜桃国内精品久久久久软件9| 四虎4hu永久免费入口| 西西人体一区二区| 国产精品无码自拍| 亚洲青青青在线视频| 波多野结衣视频网址| 日韩成人网免费视频| 里番在线播放| 国产精品丝袜久久久久久高清| 蜜桃精品噜噜噜成人av| 国产老熟妇精品观看| 国产一区二区影院| 欧美色视频一区二区三区在线观看| 亚洲国产综合视频在线观看| 精品人妻久久久久一区二区三区 | 国产精品久久久久久免费观看| 成人久久综合| 国产精品专区在线| 国产在线一区观看| xxxxx99| 国产精品久久久久一区二区三区共| 亚洲国产成人精品激情在线| 精品精品欲导航| eeuss鲁一区二区三区| 国产精品久久久久久久天堂第1集| 国产字幕视频一区二区| 4438x全国最大成人| 亚洲靠逼com| 国产成人精品a视频| 久久99国产综合精品女同| 欧美一区在线观看视频| 9色视频在线观看| 丰满放荡岳乱妇91ww| 国产亚洲精久久久久久无码77777| 日韩美女一区二区三区| 影院在线观看全集免费观看| 91在线观看免费高清完整版在线观看| 九九在线精品| 手机在线免费观看毛片| 中文字幕久久午夜不卡| 一本一道人人妻人人妻αv| 亚洲美女精品成人在线视频| 日韩伦理三区| 在线观看成人av电影| 久久精品国产99久久6| 日韩激情综合网| 91精品欧美福利在线观看| 精品51国产黑色丝袜高跟鞋| 91亚洲精品久久久| 欧美精品一区二区三区久久久竹菊| 成年人看片网站| 性做久久久久久久免费看| 农村少妇久久久久久久| 欧美孕妇与黑人孕交| 欧美裸体在线版观看完整版| 一区二区三区四区毛片| 夜夜爽夜夜爽精品视频| 欧美孕妇性xxxⅹ精品hd| 国产精品国语对白| 午夜久久黄色| 中文字幕一区二区三区人妻| 欧美伊人久久大香线蕉综合69| 激情影院在线观看| 国产一区福利视频| 日本欧美一区二区三区乱码| 欧美日韩国产精品综合| 国产丝袜一区视频在线观看| 成人在线黄色| 18禁裸男晨勃露j毛免费观看| 99精品欧美一区二区三区小说| 中文字幕视频网| 久久五月情影视| 香蕉久久夜色精品国产使用方法| 国产精品入口免费软件| 亚洲久草在线视频| 日漫免费在线观看网站| 91综合免费在线| 久久精品天堂| 婷婷激情四射网| 亚洲精品乱码久久久久久金桔影视| 成人午夜亚洲| 国产毛片视频网站| 国产精品短视频| 日本人妖在线| 97视频热人人精品|