Android實(shí)現(xiàn)顏色漸變動(dòng)畫效果
本文實(shí)例為大家分享了Android顏色漸變動(dòng)畫效果的實(shí)現(xiàn)代碼,供大家參考,具體內(nèi)容如下
前言
案例效果的實(shí)現(xiàn)比較簡(jiǎn)單,利用Android自帶的顏色插值器ArgbEvaluator()進(jìn)行計(jì)算即可,而本文的重點(diǎn)就是講講插值器。
效果圖:

一、Android中插值器TypeEvaluator
TypeEvaluator是一個(gè)接口,在開發(fā)中可以自定義該接口實(shí)例,利用ValueAnimator的setEvaluator(TypeEvaluator)方法來(lái)控制動(dòng)畫的更新計(jì)算表達(dá)式。在日常開發(fā)中,不可能只是需要操縱單一數(shù)值的變化,如果需要同時(shí)操縱對(duì)象的多個(gè)屬性,如定義動(dòng)畫的x,y移動(dòng)的坐標(biāo)等,那就需要對(duì)TypeEvaluator有所了解了。
二、案例效果實(shí)現(xiàn)
1.利用Android自帶的顏色插值器ArgbEvaluator
ValueAnimator colorAnim = ObjectAnimator.ofInt(this, "backgroundColor", RED, BLUE); ? ? ? ? colorAnim.setDuration(4000); ? ? ? ? colorAnim.setEvaluator(new ArgbEvaluator()); ? ? ? ? colorAnim.setRepeatCount(ValueAnimator.INFINITE); ? ? ? ? colorAnim.setRepeatMode(ValueAnimator.REVERSE); ? ? ? ? colorAnim.start();
2.看看Android自帶顏色插值器ArgbEvaluator核心代碼
@Override
? ? public Object evaluate(float fraction, Object startValue, Object endValue) {
? ? ? ? int startInt = (Integer) startValue;
? ? ? ? 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;
? ? ? ? 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;
? ? ? ? // 將sRGB轉(zhuǎn)化成線性
? ? ? ? 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);
? ? ? ? //在線性空間中計(jì)算插值的顏色
? ? ? ? float a = startA + fraction * (endA - startA);
? ? ? ? float r = startR + fraction * (endR - startR);
? ? ? ? float g = startG + fraction * (endG - startG);
? ? ? ? float b = startB + fraction * (endB - startB);
? ? ? ? //轉(zhuǎn)換回sRGB在[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;
? ? ? ? return Math.round(a) << 24 | Math.round(r) << 16 | Math.round(g) << 8 | Math.round(b);
? ? }3.根據(jù)ArgbEvaluator的實(shí)現(xiàn)來(lái)自定義一個(gè)顏色插值器
public class MyColorEvaluator implements TypeEvaluator
接下來(lái)?yè)Q一種顏色的計(jì)算方式,在本人看相關(guān)api的過(guò)程中,發(fā)現(xiàn)Color中有colorToHSV和HSVToColor的方法,于是在網(wǎng)上找了一個(gè)HVS的計(jì)算方式。(以下代碼來(lái)源于網(wǎng)絡(luò))。
@Override
? ? public Integer evaluate(float fraction, Integer startValue, Integer endValue) {
? ? ? ? Color.colorToHSV(startValue,startHsv);
? ? ? ? Color.colorToHSV(endValue,endHsv);
? ? ? ? int alpha = startValue >> 24 + (int) ((endValue >> 24 - startValue >> 24) * fraction);
? ? ? ? // 計(jì)算當(dāng)前動(dòng)畫完成度(fraction)所對(duì)應(yīng)的顏色值
? ? ? ? if (endHsv[0] - startHsv[0] > 180) {
? ? ? ? ? ? endHsv[0] -= 360;
? ? ? ? } else if (endHsv[0] - startHsv[0] < -180) {
? ? ? ? ? ? endHsv[0] += 360;
? ? ? ? }
? ? ? ? outHsv[0] = startHsv[0] + (endHsv[0] - startHsv[0]) * fraction;
? ? ? ? if (outHsv[0] > 360) {
? ? ? ? ? ? outHsv[0] -= 360;
? ? ? ? } else if (outHsv[0] < 0) {
? ? ? ? ? ? outHsv[0] += 360;
? ? ? ? }
? ? ? ? outHsv[1]=startHsv[1]+(endHsv[1]-startHsv[1])*fraction;
? ? ? ? outHsv[2]=startHsv[2]+(endHsv[2]-startHsv[2])*fraction;
? ? ? ? return Color.HSVToColor(alpha,outHsv);
? ? }4.使用自己定義的顏色插值器MyColorEvaluator
ValueAnimator colorAnim = ObjectAnimator.ofInt(this, "backgroundColor", RED, BLUE); ? ? ? ? colorAnim.setDuration(4000); ? ? ? ? colorAnim.setEvaluator(new MyColorEvaluator()); ? ? ? ? colorAnim.setRepeatCount(ValueAnimator.INFINITE); ? ? ? ? colorAnim.setRepeatMode(ValueAnimator.REVERSE); ? ? ? ? colorAnim.start();
三、源碼
ColorGradient.java:
public class ColorGradient extends View {
? ? public ColorGradient(Context context) {
? ? ? ? super(context);
? ? }
? ? public ColorGradient(Context context, @Nullable AttributeSet attrs) {
? ? ? ? super(context, attrs);
? ? ? ? animation();
? ? }
? ? public ColorGradient(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
? ? ? ? super(context, attrs, defStyleAttr);
? ? }
? ? private void animation(){
? ? ? ? ValueAnimator colorAnim = ObjectAnimator.ofInt(this, "backgroundColor", RED, BLUE);
? ? ? ? colorAnim.setDuration(4000);
? ? ? ? colorAnim.setEvaluator(new MyColorEvaluator());
? ? ? ? colorAnim.setRepeatCount(ValueAnimator.INFINITE);
? ? ? ? colorAnim.setRepeatMode(ValueAnimator.REVERSE);
? ? ? ? colorAnim.start();
? ? }
? ??
}MyColorEvaluator.java:
public class MyColorEvaluator implements TypeEvaluator<Integer> {
? ? float[] startHsv=new float[3];
? ? float[] endHsv=new float[3];
? ? float[] outHsv=new float[3];
? ? @Override
? ? public Integer evaluate(float fraction, Integer startValue, Integer endValue) {
? ? ? ? Color.colorToHSV(startValue,startHsv);
? ? ? ? Color.colorToHSV(endValue,endHsv);
? ? ? ? int alpha = startValue >> 24 + (int) ((endValue >> 24 - startValue >> 24) * fraction);
? ? ? ? // 計(jì)算當(dāng)前動(dòng)畫完成度(fraction)所對(duì)應(yīng)的顏色值
? ? ? ? if (endHsv[0] - startHsv[0] > 180) {
? ? ? ? ? ? endHsv[0] -= 360;
? ? ? ? } else if (endHsv[0] - startHsv[0] < -180) {
? ? ? ? ? ? endHsv[0] += 360;
? ? ? ? }
? ? ? ? outHsv[0] = startHsv[0] + (endHsv[0] - startHsv[0]) * fraction;
? ? ? ? if (outHsv[0] > 360) {
? ? ? ? ? ? outHsv[0] -= 360;
? ? ? ? } else if (outHsv[0] < 0) {
? ? ? ? ? ? outHsv[0] += 360;
? ? ? ? }
? ? ? ? outHsv[1]=startHsv[1]+(endHsv[1]-startHsv[1])*fraction;
? ? ? ? outHsv[2]=startHsv[2]+(endHsv[2]-startHsv[2])*fraction;
? ? ? ? return Color.HSVToColor(alpha,outHsv);
? ? }
}以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- Android使用TransitionDrawable漸變切換多張圖片
- Android?App頁(yè)面滑動(dòng)標(biāo)題欄顏色漸變?cè)斀?/a>
- Android簡(jiǎn)單實(shí)現(xiàn)一個(gè)顏色漸變的ProgressBar的方法
- Android Textview實(shí)現(xiàn)顏色漸變滾動(dòng)效果
- Android 微信6.1 tab欄圖標(biāo)和字體顏色漸變的實(shí)現(xiàn)
- android中實(shí)現(xiàn)背景圖片顏色漸變方法
- Kotlin使用TransitionDrawable實(shí)現(xiàn)顏色漸變效果流程講解
相關(guān)文章
Android SDK Manager解決更新時(shí)的問(wèn)題 :Failed to fetch URL...
本文主要介紹解決安裝使用SDK Manager更新時(shí)的問(wèn)題:Failed to fetch URL...,這里提供了詳細(xì)的資料及解決問(wèn)題辦法,有需要的小伙伴可以參考下2016-09-09
Android編程實(shí)現(xiàn)下載時(shí)主界面與詳細(xì)界面一致更新的方法
這篇文章主要介紹了Android編程實(shí)現(xiàn)下載時(shí)主界面與詳細(xì)界面一致更新的方法,涉及Android事件監(jiān)聽及界面動(dòng)態(tài)更新相關(guān)操作技巧,需要的朋友可以參考下2017-11-11
Android10?客戶端事務(wù)管理ClientLifecycleManager源碼解析
這篇文章主要介紹了Android10?客戶端事務(wù)管理ClientLifecycleManager源碼解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-10-10
Android使用Sensor感應(yīng)器實(shí)現(xiàn)線程中刷新UI創(chuàng)建android測(cè)力計(jì)的功能
這篇文章主要介紹了Android使用Sensor感應(yīng)器實(shí)現(xiàn)線程中刷新UI創(chuàng)建android測(cè)力計(jì)的功能,實(shí)例分析了Android使用Sensor感應(yīng)器實(shí)現(xiàn)UI刷新及創(chuàng)建測(cè)力器的技巧,需要的朋友可以參考下2015-12-12
Kotlin協(xié)程launch啟動(dòng)流程原理詳解
這篇文章主要為大家介紹了Kotlin協(xié)程launch啟動(dòng)流程原理詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-12-12
完美解決安卓jni項(xiàng)目會(huì)刪除其他so文件的問(wèn)題
下面小編就為大家?guī)?lái)一篇完美解決安卓jni項(xiàng)目會(huì)刪除其他so文件的問(wèn)題。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-12-12
Android自定義Dialog實(shí)現(xiàn)加載對(duì)話框效果
這篇文章將介紹如何定制當(dāng)今主流的對(duì)話框,通過(guò)自定義dialog實(shí)現(xiàn)加載對(duì)話框效果,具體實(shí)現(xiàn)代碼大家通過(guò)本文學(xué)習(xí)吧2018-05-05
Android 調(diào)用notifyDataSetChanged方法失敗解決辦法
這篇文章主要介紹了Android 調(diào)用notifyDataSetChanged方法失敗解決辦法的相關(guān)資料,需要的朋友可以參考下2017-07-07
仿餓了嗎點(diǎn)餐界面兩個(gè)ListView聯(lián)動(dòng)效果
這篇文章主要介紹了仿餓了點(diǎn)餐界面2個(gè)ListView聯(lián)動(dòng)效果的相關(guān)資料,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2016-09-09

