Android 顏色漸變 屬性動畫
最近用到的一個效果,見下圖文字顏色漸變
(周圍的晃來晃去的框框是軌跡動畫,下篇部落格說)
1.原理
- 計算機顏色由
紅
、綠
、藍
三色混合組成(值為0-255
)- 紅、綠、藍之間色值,按照不同大小比例 組成
不同顏
色 和深淺
的視覺顏色- 這裡的
顏色漸變動畫
就是利用屬性動畫ValueAnimator
來平滑的
改變色值的大小,達到顏色的漸變效果
2.上程式碼
TextView text = findViewById(233);
ValueAnimator animator = ObjectAnimator.ofInt(text,"textColor",
0x88333833, 0x88ca0007, 0x880333dc, 0x88089905);
animator.setDuration(2000);
animator.setEvaluator(new ArgbEvaluator());
animator.setRepeatCount(-1);
animator.setRepeatMode(ValueAnimator.REVERSE);
animator.start();
3.關於上面那個程式碼
3.1.textColor
即是
文字顏色
屬性的java的反射名字,相當於text .setTextColor()
。
類似的(比如想修改背景色):
text.setBackgroundColor()
反射寫法為backgroundColor
3.2.0x88333833, 0x88ca0007, 0x880333dc, 0x88089905
即使顏色變化軌跡:黑色→紅色→藍色→綠色
注意:
這裡的顏色必須是ARGB
(帶alpha通道的)。
0x88333833
中的88
即是通道值
3.3.ArgbEvaluator
顏色估計器
這個的作用是計算顏色平滑的改變數字(輸出其實是一個陣列)
3.4.其他的就是屬性動畫的一般屬性了
略
4.顏色估計器
這裡來倒騰一下估計器的原始碼
4.1.先來說說顏色的計算方法
就拿這個色號 #074bad
來說事把
android的sdk裡有不少拾取顏色的方法,比如
Context.getColor()
,Color.parseColor()
等
它們返回的是一個int
的數字,如:#074bad
轉化為int是-425315
然後,把它轉換成0-255
的rgb
四四
int color=-16299091;
int red= ((color & 0xff0000) >> 16);//紅色=7,範圍[0,255]
int green = ((color & 0x00ff00) >> 8);//綠色=75,範圍[0,255]
int blue = (color & 0x0000ff);//藍色=173,範圍[0,255]
現在我想讓這個顏色變得淺一點
這裡,數值越高,顏色月亮
//先增40玩玩
red+=40;//紅色:47
green +=40;//綠色:115
blue +=40;//藍色:213
//注意不能超過255
這個時候就得到了一個更淺的顏色
但grb的表達方式,再android裡面幾乎都不能直接使用,現在把它再轉換為int
int colorLighter = 0xff000000 | (red << 16) | (green << 8) | blue
現在就可以直接設定到控制元件的屬性上了
4.2.ArgbEvaluator
evaluate
方法的3個引數
float fraction
:動畫過渡時間因子,決定動畫變化的速率[0,1]
Object startValue
:動畫起始顏色
Object endValue
:動畫結束顏色
下面,具體的計算過程就在註釋裡解釋了,上程式碼了
public class ArgbEvaluator implements TypeEvaluator {
...................................
@Override
public Object evaluate(float fraction, Object startValue, Object endValue) {
int startInt = (Integer) startValue;
//起始顏色ARGB顏色通道拆分
float startA = ((startInt >> 24) & 0xff) / 255.0f;
float startR = ((startInt >> 16) & 0xff) / 255.0f;
float startG = ((startInt >> 8) & 0xff) / 255.0f;
float startB = (startInt & 0xff) / 255.0f;//透明度
/*
* 結束顏色ARGB顏色通道拆分
*/
int endInt = (Integer) endValue;
float endA = ((endInt >> 24) & 0xff) / 255.0f;
float endR = ((endInt >> 16) & 0xff) / 255.0f;
float endG = ((endInt >> 8) & 0xff) / 255.0f;
float endB = (endInt & 0xff) / 255.0f;//透明度
// 顏色數值線性增加
startR = (float) Math.pow(startR, 2.2);
startG = (float) Math.pow(startG, 2.2);
startB = (float) Math.pow(startB, 2.2);
endR = (float) Math.pow(endR, 2.2);
endG = (float) Math.pow(endG, 2.2);
endB = (float) Math.pow(endB, 2.2);
/*
*
*/
// 根據時間因子,計算出過渡的顏色插值
float a = startA + fraction * (endA - startA);
float r = startR + fraction * (endR - startR);
float g = startG + fraction * (endG - startG);
float b = startB + fraction * (endB - startB);
// 再將顏色轉換回ARGB[0,255]
a = a * 255.0f;
r = (float) Math.pow(r, 1.0 / 2.2) * 255.0f;
g = (float) Math.pow(g, 1.0 / 2.2) * 255.0f;
b = (float) Math.pow(b, 1.0 / 2.2) * 255.0f;
//將分離ARGB顏色通道打包裝車
return Math.round(a) << 24 | Math.round(r) << 16 | Math.round(g) << 8 | Math.round(b);
}
...................................
}
相關文章
- 【Openxml】顏色變化屬性計算XML
- iOS兩種顏色的線性漸變 --DDGBannerScrollViewiOSView
- python seaborn畫熱力圖,自定義顏色漸變Python
- android屬性動畫Android動畫
- Android 動畫之屬性動畫Android動畫
- [譯] Android 實現顏色漸變的一個小 tipAndroid
- Android 沉浸式狀態列 漸變顏色的實現Android
- css3背景顏色漸變CSSS3
- CSS 實現字型顏色漸變CSS
- js計算線性漸變的中間顏色值JS
- 【.NET 與樹莓派】WS28XX 燈帶的顏色漸變動畫樹莓派動畫
- Android 屬性動畫實戰Android動畫
- 利用CAGradientLayer自定義顏色漸變viewView
- 【Android 動畫】動畫詳解之屬性動畫(三)Android動畫
- 【Android 動畫】動畫詳解之屬性動畫(五)Android動畫
- Android 動畫詳解:屬性動畫、View 動畫和幀動畫Android動畫View
- Android仿IOS上拉下拉彈性效果,同時利用顏色漸變,設定上拉下拉背景顏色不一致效果AndroidiOS
- 在LCD螢幕上漸變顯示sRGB所有範圍顏色, 最大可漸變16,581,375種顏色
- CSS3新特性(樣式、選擇器、顏色漸變、2D3D、動畫)CSSS33D動畫
- CSS3文字顏色漸變效果CSSS3
- css文字顏色漸變的3種實現CSS
- Android備忘錄《屬性動畫-ValueAnimator》Android動畫
- Android 自定義View:屬性動畫(六)AndroidView動畫
- 直播小程式原始碼,Swift 獲取漸變色顏色值原始碼Swift
- Android 圓形ProgressBar 改變顏色Android
- SVG 漸變動畫效果SVG動畫
- 直播平臺搭建原始碼,Android進度條ProgressBar顏色的漸變設定原始碼Android
- 簡易的iOS導航欄顏色漸變方案iOS
- 屬性動畫動畫
- app直播原始碼,xml實現由上而下的顏色漸變APP原始碼XML
- ECharts柱條漸變色設定以及常用漸變色Echarts
- iOS CAGradientLayer漸變色iOS
- iOS UIView漸變色iOSUIView
- Avalonia中的線性漸變畫刷LinearGradientBrush
- Android開發——Java程式碼動態改變顏色字型的方法AndroidJava
- 技巧分享:如何利用CSS屬性修改圖片顏色?CSS
- SVG 動畫 fill 屬性SVG動畫
- SVG restart 動畫屬性SVGREST動畫