问答详情
源自:4-3 指示器动画实现2

字体颜色变不了

切换字体颜色的代码
private int evaluate(float progress, int startValue, int endValue) {
    int startA = (startValue >> 24) & 0xff;
    int startR = (startValue >> 16) & 0xff;
    int startG = (startValue >> 8) & 0xff;
    int startB = startValue & 0xff;

    int endA = (endValue >> 24) & 0xff;
    int endR = (endValue >> 16) & 0xff;
    int endG = (endValue >> 8) & 0xff;
    int endB = endValue & 0xff;

    return (int)((startA + (int) progress * (endA - startA))) << 24 |
            (int)((startR + (int) progress * (endR - startR))) << 16 |
            (int)((startG + (int) progress * (endG - startG))) << 8 |
            (int) ((startB + (int) progress * (endB - startB)));
}

https://img4.mukewang.com/5cbe64ea0001f96a09210532.jpg


https://img.mukewang.com/5cbe652d00012cf010050505.jpg

if (positionOffset > 0) {
    TabView left = mTabs.get(position);
    TabView right = mTabs.get(position + 1);
    left.setProgress((1 - positionOffset));
    right.setProgress(positionOffset);
}


https://img1.mukewang.com/5cbe659a0001b76608641152.jpg

提问者:慕移动9209807 2019-04-23 09:09

个回答

  • 慕虎6181031
    2019-11-12 16:18:29

    private int evaluate(float fraction, int startValue, int 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;
    
        // convert from sRGB to linear
        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);
    
        // compute the interpolated color in linear space
        float a = startA + fraction * (endA - startA);
        float r = startR + fraction * (endR - startR);
        float g = startG + fraction * (endG - startG);
        float b = startB + fraction * (endB - startB);
    
        // convert back to sRGB in the [0..255] range
        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);
    }


  • 坚持2016
    2019-04-30 20:27:37

    没有看出来哪里有问题