在Android

时间:2017-08-01 15:59:18

标签: android android-recyclerview android-animation android-coordinatorlayout

我试图在向下滚动时将我的几种视图颜色从'color1'转换为'color2',反之亦然。

视图位于CoordinateLayout内,Scroll Listener实现位于自定义Behaviour内。

当前实施UpScroll:

    int balanceLabelTextColor = Color.rgb(
            (int) (Color.red(color1) * magicFactor),
            (int) (Color.green(color1) * magicFactor),
            (int) (Color.blue(color1) * magicFactor)
    );
    balanceLabel.setTextColor(balanceLabelTextColor);

当前实施DownScroll:

    int balanceLabelTextColor = Color.rgb(
            (int) (Color.red(color2) * magicFactor),
            (int) (Color.green(color2) * magicFactor),
            (int) (Color.blue(color2) * magicFactor)
    );
    balanceLabel.setTextColor(balanceLabelTextColor);

'magicFactor'取自(0,1)的值取决于滚动位置。

只有向上或向下滚动时才能正常工作。当你从中到下改变滚动方向时,转换会翻转,反之亦然。

正在寻找一种同时采用'color1'和'color2'的实现,并为平滑的颜色过渡生成中间值。

感谢。

1 个答案:

答案 0 :(得分:2)

听起来像是在找here之类的东西。

  

使用给定的比率在两种ARGB颜色之间进行混合。

     

混合比为0.0将导致颜色1,0.5将产生均匀   混合,1.0将导致color2。

@ColorInt
public static int blendARGB(@ColorInt int color1, @ColorInt int color2,
        @FloatRange(from = 0.0, to = 1.0) float ratio) {
    final float inverseRatio = 1 - ratio;
    float a = Color.alpha(color1) * inverseRatio + Color.alpha(color2) * ratio;
    float r = Color.red(color1) * inverseRatio + Color.red(color2) * ratio;
    float g = Color.green(color1) * inverseRatio + Color.green(color2) * ratio;
    float b = Color.blue(color1) * inverseRatio + Color.blue(color2) * ratio;
    return Color.argb((int) a, (int) r, (int) g, (int) b);
}