Android 使用alpha动画更改视图颜色

Android 使用alpha动画更改视图颜色,android,android-animation,background-color,Android,Android Animation,Background Color,我正在写一个代码,其中需要修改视图背景从一种颜色到其他颜色沿阿尔法动画 我试过了 ObjectAnimator backgroundColorAnimator = ObjectAnimator.ofObject(stickyLayout, "backgroundColor", new ArgbEvaluator(), 0xFFFFFFFF,

我正在写一个代码,其中需要修改视图背景从一种颜色到其他颜色沿阿尔法动画

我试过了

ObjectAnimator backgroundColorAnimator = ObjectAnimator.ofObject(stickyLayout,
                        "backgroundColor",
                        new ArgbEvaluator(),
                        0xFFFFFFFF,
                        0xff78c5f9);

编辑:因为我们大多数人都不清楚,假设我们需要在seekbar上使用alpha更改此颜色上述解决方案的更新值在某种程度上起作用,但与alpha的预期效果不同…有什么建议吗?

您可以使用不同的或单独设置alpha动画。

您可以使用不同的或单独设置alpha动画。

这是我目前发现的工作代码:

    /**
     * Initialise header color while translate animation
     */
    private void initHeaderColor(int startColor, int endColor) {

        initR = Color.red(startColor);
        initG = Color.green(startColor);
        initB = Color.blue(startColor);
        initAlpha = Color.alpha(startColor);

        endR = Color.red(endColor);
        endG = Color.green(endColor);
        endB = Color.blue(endColor);
        endAlpha = Color.alpha(endColor);
    }
把你的愿望抵消

   /**
     * Translate header view component
     * @param slideOffset
     */
    private void translateHeaderView(float slideOffset) {

            finalR = (int) (initR + (endR - initR) * slideOffset);
            finalG = (int) (initG + (endG - initG) * slideOffset);
            finalB = (int) (initB + (endB - initB) * slideOffset);
            finalAlpha = (int) (initAlpha + (endAlpha - initAlpha) * slideOffset);

            int color = Color.argb(finalAlpha, finalR, finalG, finalB);
            fmActionBar.setBackgroundColor(color);
        }

这是我到目前为止发现的有效代码:

    /**
     * Initialise header color while translate animation
     */
    private void initHeaderColor(int startColor, int endColor) {

        initR = Color.red(startColor);
        initG = Color.green(startColor);
        initB = Color.blue(startColor);
        initAlpha = Color.alpha(startColor);

        endR = Color.red(endColor);
        endG = Color.green(endColor);
        endB = Color.blue(endColor);
        endAlpha = Color.alpha(endColor);
    }
把你的愿望抵消

   /**
     * Translate header view component
     * @param slideOffset
     */
    private void translateHeaderView(float slideOffset) {

            finalR = (int) (initR + (endR - initR) * slideOffset);
            finalG = (int) (initG + (endG - initG) * slideOffset);
            finalB = (int) (initB + (endB - initB) * slideOffset);
            finalAlpha = (int) (initAlpha + (endAlpha - initAlpha) * slideOffset);

            int color = Color.argb(finalAlpha, finalR, finalG, finalB);
            fmActionBar.setBackgroundColor(color);
        }

我使用静态辅助方法来插值两种颜色

public static int interpolateColor(int colorA, int colorB, float proportion) {
float[] hsva = new float[3];
float[] hsvb = new float[3];
Color.colorToHSV(colorA, hsva);
Color.colorToHSV(colorB, hsvb);
for (int i = 0; i < 3; i++) {
  hsvb[i] = interpolate(hsva[i], hsvb[i], proportion);
}
int alpha1 = Color.alpha(colorA);
int alpha2 = Color.alpha(colorB);
int newAlpha = interpolate(alpha1, alpha2, proportion);
return Color.HSVToColor(newAlpha, hsvb);  }
此方法为0-1之间的比例值提供正确的颜色,其中0表示颜色a完全可见,1表示颜色B完全可见

然后,您可以使用ValueAnimator添加onUpdateListener并获取animationPercentage,并将其作为比例传递给插值方法


如您所见,我也将alpha值添加到了方法中

我使用静态辅助方法来插值两种颜色

public static int interpolateColor(int colorA, int colorB, float proportion) {
float[] hsva = new float[3];
float[] hsvb = new float[3];
Color.colorToHSV(colorA, hsva);
Color.colorToHSV(colorB, hsvb);
for (int i = 0; i < 3; i++) {
  hsvb[i] = interpolate(hsva[i], hsvb[i], proportion);
}
int alpha1 = Color.alpha(colorA);
int alpha2 = Color.alpha(colorB);
int newAlpha = interpolate(alpha1, alpha2, proportion);
return Color.HSVToColor(newAlpha, hsvb);  }
此方法为0-1之间的比例值提供正确的颜色,其中0表示颜色a完全可见,1表示颜色B完全可见

然后,您可以使用ValueAnimator添加onUpdateListener并获取animationPercentage,并将其作为比例传递给插值方法


如您所见,我也将alpha值添加到了方法中

您实际上不需要这些方法:
initHeaderColor
&
translateHeaderView

argbeevaluator
定义为类成员:

ArgbEvaluator mArgbEvaluator;

// define start & end colors
int mStartColor, mEndColor;

// initialize start & end colors
调用argbeevaluator的
evaluate
方法,使用参数
(slideOffset,startColor,endColor)
,将返回值强制转换为
整数
,并使用它设置
fmActionBar
的背景色:

void updateActionBarbgColor(float slideOffset) {
    if (mArgbEvaluator == null)
        mArgbEvaluator = new ArgbEvaluator();

    int bgColor = (Integer) mArgbEvaluator.evaluate(slideOffset, mStartColor, mEndColor);
    fmActionBar.setBackgroundColor(bgColor);
}
作为参考,
argbeevaluator#evaluate(…)

公共对象求值(浮点分数、对象起始值、对象结束值){
int startInt=(整数)startValue;
int startA=(startInt>>24)和0xff;
int startR=(startInt>>16)和0xff;
int startG=(startInt>>8)和0xff;
int startB=startInt&0xff;
int endInt=(整数)endValue;
int-endA=(endInt>>24)&0xff;
int endR=(endInt>>16)&0xff;
int-endG=(endInt>>8)&0xff;
int endB=endInt&0xff;

return(int)((startA+(int)(分数*(endA-startA))您实际上不需要这些方法:
initHeaderColor
&
translateHeaderView

argbeevaluator
定义为类成员:

ArgbEvaluator mArgbEvaluator;

// define start & end colors
int mStartColor, mEndColor;

// initialize start & end colors
调用argbeevaluator的
evaluate
方法,使用参数
(slideOffset,startColor,endColor)
,将返回值强制转换为
整数
,并使用它设置
fmActionBar
的背景色:

void updateActionBarbgColor(float slideOffset) {
    if (mArgbEvaluator == null)
        mArgbEvaluator = new ArgbEvaluator();

    int bgColor = (Integer) mArgbEvaluator.evaluate(slideOffset, mStartColor, mEndColor);
    fmActionBar.setBackgroundColor(bgColor);
}
作为参考,
argbeevaluator#evaluate(…)

公共对象求值(浮点分数、对象起始值、对象结束值){
int startInt=(整数)startValue;
int startA=(startInt>>24)和0xff;
int startR=(startInt>>16)和0xff;
int startG=(startInt>>8)和0xff;
int startB=startInt&0xff;
int endInt=(整数)endValue;
int-endA=(endInt>>24)&0xff;
int endR=(endInt>>16)&0xff;
int-endG=(endInt>>8)&0xff;
int endB=endInt&0xff;
返回值(int)((startA+(int)(分数*(endA-startA)))
其中myView是要应用动画的视图


其中myView是要在其上应用动画的视图

使用
Color.parseColor
,而不是直接使用
0x
值。不过,Kotlin中的代码示例

val objectAnimator = ObjectAnimator.ofObject(my_2_text, "backgroundColor",  ArgbEvaluator(),
    Color.parseColor("#FFFFFFFF"), Color.parseColor("#FF78c5f9"))

使用
Color.parseColor
而不是直接使用
0x
值。不过,在Kotlin中使用代码示例

val objectAnimator = ObjectAnimator.ofObject(my_2_text, "backgroundColor",  ArgbEvaluator(),
    Color.parseColor("#FFFFFFFF"), Color.parseColor("#FF78c5f9"))

您正在使用的颜色具有完整的alpha
ff
可能会对您有所帮助:这很好,ff和Fllo…因为我想从完全的白色变为完全的黑色,比如0xff78c5f9…任何建议!因此,如果开始alpha和结束alpha==0xff,那么中间的任何值也将是0xff,您希望其他值吗?@pskink我需要类似的PlayStore动作条颜色在滚动条上更改…有什么建议吗?您使用的颜色有完整的alpha
ff
可能会对您有所帮助:这很好,ff和Fllo…因为我想从完全白色变为完全黑色,比如0xff78c5f9…有什么建议吗!所以如果开始alpha和结束alpha==0xff,那么中间的任何值也将是0xff,是吗期待其他值?@pskink我需要类似的PlayStore动作条颜色如何在滚动中更改…有什么建议吗?嗯。我想这会在onOffsetChanged中滚动时褪色/变暗??在onOffsetChanged中使用它会导致颜色之间的跳跃,而不是缓慢褪色?@filthy_向导能否尝试调试代码以检查
slideOffs的值et
?它应该在0f和1f.hmm之间。我认为在onOffsetChanged中滚动会使颜色褪色/变暗??在onOffsetChanged中使用它会导致颜色之间的跳跃而不是缓慢褪色?@filthy\u向导能否尝试调试代码以检查
slideOffset
的值?它应该在0f和1f之间。尝试将属性名称更改为对于CardView,请使用“cardBackgroundColor”而不是“backgroundColor”。对于CardView,请尝试将属性名称更改为“cardBackgroundColor”,而不是“backgroundColor”