我正在编写一个代码,需要根据alpha动画将视图背景从一种颜色修改为其他颜色。
我试过
ObjectAnimator backgroundColorAnimator = ObjectAnimator.ofObject(stickyLayout,
"backgroundColor",
new ArgbEvaluator(),
0xFFFFFFFF,
0xff78c5f9);
编辑:由于我们大多数人都不清楚,假设我们需要在搜索栏上更新这个颜色,上面提到的解决方案工作的更新值有点但不像alpha预期的任何建议?< / p>
答案 0 :(得分:5)
ValueAnimator colorAnim = ObjectAnimator.ofInt(**myView**, "backgroundColor", Color.RED, Color.BLUE);
colorAnim.setDuration(3000);
colorAnim.setEvaluator(new ArgbEvaluator());
colorAnim.setRepeatCount(ValueAnimator.INFINITE);
colorAnim.setRepeatMode(ValueAnimator.REVERSE);
colorAnim.start();
myView是您要应用动画的视图
答案 1 :(得分:2)
您真的不需要这些方法:initHeaderColor
&amp; translateHeaderView
。
将ArgbEvaluator
定义为类成员:
ArgbEvaluator mArgbEvaluator;
// define start & end colors
int mStartColor, mEndColor;
// initialize start & end colors
使用参数evaluate
调用ArgbEvaluator的(slideOffset, startColor, endColor)
方法,将返回值强制转换为Integer
,并使用它设置fmActionBar
的背景颜色:
void updateActionBarbgColor(float slideOffset) {
if (mArgbEvaluator == null)
mArgbEvaluator = new ArgbEvaluator();
int bgColor = (Integer) mArgbEvaluator.evaluate(slideOffset, mStartColor, mEndColor);
fmActionBar.setBackgroundColor(bgColor);
}
供参考,ArgbEvaluator#evaluate(...)
:
public Object evaluate(float fraction, Object startValue, Object endValue) {
int startInt = (Integer) startValue;
int startA = (startInt >> 24) & 0xff;
int startR = (startInt >> 16) & 0xff;
int startG = (startInt >> 8) & 0xff;
int startB = startInt & 0xff;
int endInt = (Integer) endValue;
int endA = (endInt >> 24) & 0xff;
int endR = (endInt >> 16) & 0xff;
int endG = (endInt >> 8) & 0xff;
int endB = endInt & 0xff;
return (int)((startA + (int)(fraction * (endA - startA))) << 24) |
(int)((startR + (int)(fraction * (endR - startR))) << 16) |
(int)((startG + (int)(fraction * (endG - startG))) << 8) |
(int)((startB + (int)(fraction * (endB - startB))));
}
答案 2 :(得分:1)
使用Color.parseColor
而不是直接使用0x
值。
val objectAnimator = ObjectAnimator.ofObject(my_2_text, "backgroundColor", ArgbEvaluator(),
Color.parseColor("#FFFFFFFF"), Color.parseColor("#FF78c5f9"))
答案 3 :(得分:0)
您可以使用evaluator独立使用不同的AnimatorSet或动画alpha。
答案 4 :(得分:0)
这是我到目前为止找到的工作代码:
/**
* 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);
}
答案 5 :(得分:0)
我使用静态辅助方法来插入两种颜色。
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); }
插值方法:
private static float interpolate(float a, float b, float proportion) {
return (a + ((b - a) * proportion)); }
此方法为0-1之间的比例值提供正确的颜色,其中0表示colorA完全可见,1表示colorB完全可见。
然后,您可以使用ValueAnimator添加onUpdateListener并获取animationPercentage并将其作为插值方法的比例传递。
正如您所看到的,我将alpha值添加到方法中。