Android 以颜色(从红色到绿色)表示百分比值(0-100)

Android 以颜色(从红色到绿色)表示百分比值(0-100),android,colors,Android,Colors,我有一个Android应用程序,动态更新百分比在0到100之间。这款应用有两种特定的颜色——浅红色(#BD4141)和浅绿色(#719D98) 我希望一个元素在给定的百分比为0时背景为浅红色,在百分比为100时背景为浅绿色。中间百分比应表示这两种颜色之间的软过渡色表示 或者,我希望它从纯红色变为纯绿色。这段代码没有经过优化,但它完成了它的本意 公共类MainActivity扩展活动{ @凌驾 创建时的公共void(最终捆绑包savedInstanceState){ super.onCreate(

我有一个Android应用程序,动态更新百分比在0到100之间。这款应用有两种特定的颜色——浅红色(#BD4141)和浅绿色(#719D98)

我希望一个元素在给定的百分比为0时背景为浅红色,在百分比为100时背景为浅绿色。中间百分比应表示这两种颜色之间的软过渡色表示

或者,我希望它从纯红色变为纯绿色。

这段代码没有经过优化,但它完成了它的本意

公共类MainActivity扩展活动{
@凌驾
创建时的公共void(最终捆绑包savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.screen_main);
最终SeekBar sb=(SeekBar)findviewbyd(R.id.SeekBar);
sb.setonseekbarchaneglistener(新的onseekbarchaneglistener(){
@凌驾
TopTrackingTouch上的公共无效(最终SeekBar SeekBar){
}
@凌驾
开始跟踪触摸时的公共无效(最终SeekBar SeekBar){
}
@凌驾
更改了进度上的公共无效(最终SeekBar SeekBar,
最终整数进度,最终布尔值(用户){
更新(seekBar);
}
});
更新(sb);
}
私人作废更新(最终SeekBar sb){
最终RelativeLayout布局=(RelativeLayout)findViewById(R.id.layout);
final int colorStart=Color.parseColor(#BD4141”);
final int colorEnd=Color.parseColor(#719D98”);
布局.设置背景颜色(插值颜色(颜色开始,颜色结束,
sb.getProgress()/100f));//假设SeekBar max为100
}
专用浮点插值(最终浮点a、最终浮点b、,
最终浮动比例){
回报率(a+((b-a)*比例);
}
专用int插值颜色(最终int a、最终int b、,
最终浮动比例){
最终浮动[]hsva=新浮动[3];
最终浮动[]hsvb=新浮动[3];
colorToHSV(a,hsva);
colorToHSV(b,hsvb);
对于(int i=0;i<3;i++){
hsvb[i]=插值(hsva[i],hsvb[i],比例);
}
返回颜色.HSVToColor(hsvb);
}
}
此答案基于来自的问题和答案

public class MainActivity extends Activity {

    @Override
    public void onCreate(final Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.screen_main);

        final SeekBar sb = (SeekBar) findViewById(R.id.seekBar);
        sb.setOnSeekBarChangeListener(new OnSeekBarChangeListener() {

            @Override
            public void onStopTrackingTouch(final SeekBar seekBar) {
            }

            @Override
            public void onStartTrackingTouch(final SeekBar seekBar) {
            }

            @Override
            public void onProgressChanged(final SeekBar seekBar,
                    final int progress, final boolean fromUser) {
                update(seekBar);
            }
        });
        update(sb);
    }

    private void update(final SeekBar sb) {
        final RelativeLayout layout = (RelativeLayout) findViewById(R.id.layout);

        final int colorStart = Color.parseColor("#BD4141");
        final int colorEnd = Color.parseColor("#719D98");

        layout.setBackgroundColor(interpolateColor(colorStart, colorEnd,
                sb.getProgress() / 100f)); // assuming SeekBar max is 100
    }

    private float interpolate(final float a, final float b,
            final float proportion) {
        return (a + ((b - a) * proportion));
    }

    private int interpolateColor(final int a, final int b,
            final float proportion) {
        final float[] hsva = new float[3];
        final float[] hsvb = new float[3];
        Color.colorToHSV(a, hsva);
        Color.colorToHSV(b, hsvb);
        for (int i = 0; i < 3; i++) {
            hsvb[i] = interpolate(hsva[i], hsvb[i], proportion);
        }
        return Color.HSVToColor(hsvb);
    }

}