从 android SeekBar 中的 LinearGradient 获取准确的颜色代码
Getting exact color code from LinearGradient in android SeekBar
我在我的项目中有一个要求,即创建填充不同深浅颜色的SeekBar。为此,我通过分配开始和结束颜色值来使用 LinearGradient,它也很有魅力。但是我不知道当位置发生变化时如何从搜索栏中获取准确的颜色代码。
我也贴出一段代码供大家参考:
public class SeekbarActivity extends Activity {
private SeekBar volumeControl = null;
private View view;
private ShapeDrawable shape;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_seekbar);
volumeControl = (SeekBar) findViewById(R.id.volume_bar);
view = (View) findViewById(R.id.seek_view);
LinearGradient test = new LinearGradient(0.f, 0.f, 300.f, 0.0f,
Color.BLACK, Color.RED, TileMode.CLAMP);
shape = new ShapeDrawable(new RectShape());
shape.getPaint().setShader(test);
volumeControl.setProgressDrawable((Drawable) shape);
volumeControl.setOnSeekBarChangeListener(new OnSeekBarChangeListener() {
public void onProgressChanged(SeekBar seekBar, int progress,
boolean fromUser) {
}
public void onStartTrackingTouch(SeekBar seekBar) {
// TODO Auto-generated method stub
}
public void onStopTrackingTouch(SeekBar seekBar) {
}
});
}
}
输出图像
您要做的是首先确定您的结束颜色(十六进制代码)。在您的示例中,这是红色的,所以我假设它是#FF0000。现在黑色 (#000000) 和红色 (#FF0000) 之间的差异 = #FF,十进制值为 255.
您可以将搜索栏的值处理为 0 到 255 之间的值。如果您将所选值转换为十六进制并将前两个字符替换为红色十六进制,那么您将得到更深的红色阴影.
一个例子:
您的搜索栏值为 216。
216的十六进制值为D8
由于红色由十六进制颜色代码中的前两个字符表示,因此十六进制代码 #D80000 表示您想要的红色阴影。
没有默认选项可用于使用搜索栏获取颜色阴影,但使用颜色代码进行一些计算会给您结果。这就是我使用 seekbar
获得颜色阴影的方法
seek.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
int a = Color.alpha(selectedColor);
int r = Color.red(selectedColor);
int g = Color.green(selectedColor);
int b = Color.blue(selectedColor);
int rr = (progress*r)/100;
int gg = (progress*g)/100;
int bb = (progress*b)/100;
colorView.setBackgroundColor(Color.argb(a, rr, gg, bb));
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
}
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
}
});
如果您的起始颜色为白色或任何其他颜色并且结束颜色不同,您可以使用以下
private static int findColor(int selectedColor, float ratio) {
final float inverseRation = 1f - ratio;
float r = (Color.red(selectedColor) * ratio) + (Color.red(Color.WHITE) * inverseRation);
float g = (Color.green(selectedColor) * ratio) + (Color.green(Color.WHITE) * inverseRation);
float b = (Color.blue(selectedColor) * ratio) + (Color.blue(Color.WHITE) * inverseRation);
return Color.rgb((int) r, (int) g, (int) b);
}
将此作为函数调用
float ratio = (float) progress / 100;
selected_color = findColor(color, ratio);
选择的颜色是最终颜色(当前为红色)并且
Color.White
在这种情况下是起始颜色(黑色),进度为 0 到 100。
我在我的项目中有一个要求,即创建填充不同深浅颜色的SeekBar。为此,我通过分配开始和结束颜色值来使用 LinearGradient,它也很有魅力。但是我不知道当位置发生变化时如何从搜索栏中获取准确的颜色代码。
我也贴出一段代码供大家参考:
public class SeekbarActivity extends Activity {
private SeekBar volumeControl = null;
private View view;
private ShapeDrawable shape;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_seekbar);
volumeControl = (SeekBar) findViewById(R.id.volume_bar);
view = (View) findViewById(R.id.seek_view);
LinearGradient test = new LinearGradient(0.f, 0.f, 300.f, 0.0f,
Color.BLACK, Color.RED, TileMode.CLAMP);
shape = new ShapeDrawable(new RectShape());
shape.getPaint().setShader(test);
volumeControl.setProgressDrawable((Drawable) shape);
volumeControl.setOnSeekBarChangeListener(new OnSeekBarChangeListener() {
public void onProgressChanged(SeekBar seekBar, int progress,
boolean fromUser) {
}
public void onStartTrackingTouch(SeekBar seekBar) {
// TODO Auto-generated method stub
}
public void onStopTrackingTouch(SeekBar seekBar) {
}
});
}
}
输出图像
您要做的是首先确定您的结束颜色(十六进制代码)。在您的示例中,这是红色的,所以我假设它是#FF0000。现在黑色 (#000000) 和红色 (#FF0000) 之间的差异 = #FF,十进制值为 255.
您可以将搜索栏的值处理为 0 到 255 之间的值。如果您将所选值转换为十六进制并将前两个字符替换为红色十六进制,那么您将得到更深的红色阴影.
一个例子:
您的搜索栏值为 216。
216的十六进制值为D8
由于红色由十六进制颜色代码中的前两个字符表示,因此十六进制代码 #D80000 表示您想要的红色阴影。
没有默认选项可用于使用搜索栏获取颜色阴影,但使用颜色代码进行一些计算会给您结果。这就是我使用 seekbar
获得颜色阴影的方法seek.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
int a = Color.alpha(selectedColor);
int r = Color.red(selectedColor);
int g = Color.green(selectedColor);
int b = Color.blue(selectedColor);
int rr = (progress*r)/100;
int gg = (progress*g)/100;
int bb = (progress*b)/100;
colorView.setBackgroundColor(Color.argb(a, rr, gg, bb));
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
}
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
}
});
如果您的起始颜色为白色或任何其他颜色并且结束颜色不同,您可以使用以下
private static int findColor(int selectedColor, float ratio) {
final float inverseRation = 1f - ratio;
float r = (Color.red(selectedColor) * ratio) + (Color.red(Color.WHITE) * inverseRation);
float g = (Color.green(selectedColor) * ratio) + (Color.green(Color.WHITE) * inverseRation);
float b = (Color.blue(selectedColor) * ratio) + (Color.blue(Color.WHITE) * inverseRation);
return Color.rgb((int) r, (int) g, (int) b);
}
将此作为函数调用
float ratio = (float) progress / 100;
selected_color = findColor(color, ratio);
选择的颜色是最终颜色(当前为红色)并且
Color.White
在这种情况下是起始颜色(黑色),进度为 0 到 100。