在程式碼中實現android:tint效果
Android著色效果tint
Android有個tint的著色效果,這樣有些純色圖片,如果需要顯示別的顏色效果,直接加上就行,特別方便。這個網上一搜就有,效果如圖:
我這個原本是個黑色的圖示,加上這句,就可以顯示各種顏色。
使用很簡單,直接在XML加上android:tint="@color/colorPrimary"
就行;如果是背景,加上android:backgroundTint="@color/colorPrimary"
就行,比單純設定方便多了。
比如Button如果設定android:background="@color/colorPrimary"
為純顏色,那樣會沒有點選效果,需要點選效果還需要寫個selector效果的drawable。如果要在Android5.0之上顯示漣漪效果,還需要在drawable-v21中建立一個同名字的ripple效果的drawable
XML寫法簡單,在程式碼中卻有點麻煩。
網上搜尋出來的方法有兩種:
第一種不去區分版本,使用V4包的android.support.v4.graphics.drawable.DrawableCompat
ImageView image = new ImageView(context);
Drawable up = ContextCompat.getDrawable(context,R.drawable.ic_sort_up);
Drawable drawableUp= DrawableCompat.wrap(up);
DrawableCompat.setTint(drawableUp, ContextCompat.getColor(context,R.color.theme));
image.setImageDrawable(drawableUp);
第二種只能在API21以上使用
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
ImageView image = new ImageView(context);
image.setImageResource(R.drawable.ic_sort_down);
image.setImageTintList(ColorStateList.valueOf(ContextCompat.getColor(context,R.color.theme)));
}
第一種雖然好用,且向下相容,但有個問題,就是如果我在A介面使用,先開啟A介面,再去開啟有使用同一個圖片的B介面,會發現即使B介面的該ImageView沒使用Tint,也會有對應的著色效果。除非先進入的B介面,或者退出應用。
看有個DrawableCompat.unwrap(...)
方法,試了一下,不管用,stackoverflow找到答案
http://stackoverflow.com/questions/30945490/drawablecompat-unwrap-is-not-working-pre-lollipop
試了一下,可以了,完整如下:
ImageView image = new ImageView(context);
Drawable up = ContextCompat.getDrawable(context,R.drawable.ic_sort_up);
Drawable drawableUp= DrawableCompat.wrap(up);
DrawableCompat.setTint(drawableUp, ContextCompat.getColor(context,R.color.theme));
image.setImageDrawable(drawableUp);
layoutParams.addRule(RelativeLayout.RIGHT_OF, text.getId());
addView(image, layoutParams);
Drawable up1 = ContextCompat.getDrawable(context,R.drawable.ic_sort_up);
Drawable drawableUp1= DrawableCompat.unwrap(up1);
DrawableCompat.setTintList(drawableUp1, null);
倒數第三行寫的那樣,需要重新弄個Drawable 出來,用的同一個會導致之前設定的著色無效;倒數第二行測試使用wrap();也沒出問題;最後一行一定用後面的那個Drawable ,用原來那個也會導致之前設定的著色無效。即使他們放在addView()
之後。
當然,最後三行完整放在image.setImageDrawable(drawable);
前面也是沒有問題的,這邊只是為了方便說明。
這些只是個人隨便寫的,又剛好有效,寫法不一定對。
相關文章
- 短視訊原始碼,在Android 中opengl es實現燈光效果原始碼Android
- js 實現程式碼雨效果JS
- 直播系統程式碼,Android自定義View實現呼吸燈效果AndroidView
- html網頁中如何實現居中效果(程式碼分享)HTML網頁
- Android開發中陰影效果的實現Android
- React Native在Android當中實踐(四)——程式碼整合React NativeAndroid
- Jquery實現的高亮效果程式碼分享jQuery
- Android實現蛛網背景效果Android
- [譯] 在 Flutter 中實現微光閃爍效果Flutter
- 教你在“狼人殺”中實現變聲效果
- Swift如何純程式碼實現時鐘效果Swift
- 在鴻蒙中實現類似瀑布流效果鴻蒙
- 毛玻璃效果在Android的實現Android
- 一行程式碼實現ViewPager卡片效果行程Viewpager
- 直播平臺原始碼,Android自定義View實現呼吸燈效果原始碼AndroidView
- 一行程式碼實現 UIView 鏤空效果行程UIView
- html實現簡單ListViews效果的例項程式碼HTMLView
- Canvas實現放大鏡效果完整案例分析(附程式碼)Canvas
- 在小程式中實現 Mixins 方案
- 在WPF程式中實現PropertyGrid功能
- verilog 中實現 sram 程式碼
- 教你如何實現 Android TextView 文字輪播效果AndroidTextView
- 微信小程式功能之全屏滾動效果的實現程式碼微信小程式
- 1500行TypeScript程式碼在React中實現元件keep-aliveTypeScriptReact元件Keep-Alive
- 幻術,一行程式碼實現鏤空效果行程
- CSS3現菱形效果程式碼CSSS3
- 在語音聊天原始碼中實現一個滿天星效果,應該如何做?原始碼
- 說說在 Android 的 RecyclerView 中如何實現下拉刷AndroidView
- Android RecyclerView實現頭部懸浮吸頂效果AndroidView
- Android之AppBarLayout實現懸停吸附伸縮效果AndroidAPP
- 教你使用1行程式碼在Java中實現字串的逆序行程Java字串
- 簡單實現幾種常見的前端效果,附程式碼!前端
- 直播小程式原始碼,Android 傾斜文字 效果設定原始碼Android
- [譯] Story 中 Type Mode 在 iOS 和 Android 上的實現iOSAndroid
- Lru在Rust中的實現, 原始碼解析Rust原始碼
- android 利用path 實現手寫板的手寫效果Android
- 直播軟體搭建,Android實現文字滾動播放效果Android
- 利用JavaScript實現註冊頁面省市聯動效果(附程式碼)JavaScript
- 十行程式碼實現網頁標題滾動效果!行程網頁