如何动态更新SeekBar的颜色?

8
我希望在运行时动态更改进度条的颜色(特别是使用setSecondaryProgress更新的次要进度)当它跨越某个点时。 我已经能够在Activity的onCreate函数中通过调用setProgressDrawable并替换来自水平进度的默认Android版本(SDK / platforms / android-2.1 / data / res / drawable / progress_horizontal.xml)的资源来将自己的可绘制对象替换为进度条(从黄色变为绿色)。 但是,在运行时更新此内容(是的,通过AsyncTask从UI线程)会导致整个进度条除了拇指标签之外变为黑色或透明。

我能想到的一种方法是在两个拥有不同颜色的SeekBar之间使用ViewSwitcher,但如果用户此时正在使用跟踪控件,则这种方法行不通。 - PseudoNoise
截至IRC办公时间刚刚,尝试使用invalidateDrawable但无济于事。还尝试读取可绘制对象的值,但每个对象(来自资源的两种颜色以及设置后的getProgressDrawable)都具有不同的哈希值。 - PseudoNoise
3个回答

3

是的!我的问题比那个链接的问题早几年,但我很高兴终于得到了答案(虽然我已经离开了这个项目)。 - PseudoNoise

1

SeekColorActivity.java

package com.exercise.seekcolor;

import android.app.Activity;
import android.os.Bundle;
import android.widget.LinearLayout;
import android.widget.SeekBar;

public class SeekColorActivity extends Activity {

private int seekR, seekG, seekB;
SeekBar redSeekBar, greenSeekBar, blueSeekBar;
LinearLayout mScreen;

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    mScreen = (LinearLayout) findViewById(R.id.myScreen);
    redSeekBar = (SeekBar) findViewById(R.id.mySeekingBar_R);
    greenSeekBar = (SeekBar) findViewById(R.id.mySeekingBar_G);
    blueSeekBar = (SeekBar) findViewById(R.id.mySeekingBar_B);
    updateBackground();

    redSeekBar.setOnSeekBarChangeListener(seekBarChangeListener);
    greenSeekBar.setOnSeekBarChangeListener(seekBarChangeListener);
    blueSeekBar.setOnSeekBarChangeListener(seekBarChangeListener);

}

private SeekBar.OnSeekBarChangeListener seekBarChangeListener
= new SeekBar.OnSeekBarChangeListener()
{

@Override
public void onProgressChanged(SeekBar seekBar, int progress,
  boolean fromUser) {
// TODO Auto-generated method stub
 updateBackground();
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
// TODO Auto-generated method stub
}

@Override
public void onStopTrackingTouch(SeekBar seekBar) {
// TODO Auto-generated method stub
}
};

private void updateBackground()
{
 seekR = redSeekBar.getProgress();
 seekG = greenSeekBar.getProgress();
 seekB = blueSeekBar.getProgress();
 mScreen.setBackgroundColor(
  0xff000000
  + seekR * 0x10000
  + seekG * 0x100
  + seekB
  );
}
}

1
这会设置屏幕颜色,因此进度条的颜色也会改变。我问的是如何设置进度条的背景颜色,而不是整个屏幕的颜色。 - PseudoNoise

-1
SeekBar是ProgressBar的扩展,它添加了一个可拖动的拇指。用户可以触摸拇指并向左或向右拖动以设置当前进度级别或使用箭头键。
当SeekBar更改时,OnSeekBarChangeListener的onProgressChanged()将被调用,并且屏幕背景(LinearLayout)将根据值(SeekBar.getProgress())进行更新。

main.xml


1
这与问题完全无关。OP问的是如何更新颜色,而你从未提到过任何关于颜色的内容。 - lrAndroid

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接