我有来自RatingBar android - custom draw runtime
的代码之前我曾经在我的评级控件上更改图形的颜色:
vthf.rating.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_UP) {
//--
float touchPositionX = event.getX();
float width = vthf.rating.getWidth();
float starsf = (touchPositionX / width);
starsf = starsf * param_final__data.score_max;
int starsint = (int) Math.round(starsf);
byte starsbyte = (byte) starsint;
param_final__data.score_cur = starsbyte;
starsf = starsint;
vthf.rating.setRating(starsf);
//--
int color = Color.BLACK;
switch (starsbyte % 4) {
case 0: color = Color.BLUE; break; // 4 stars
case 3: color = Color.GREEN; break;
case 2: color = Color.YELLOW; break;
case 1: color = Color.RED; break;
}
final LayerDrawable layerDrawable = (LayerDrawable) vthf.rating.getProgressDrawable();
Drawable myWrap = layerDrawable.getDrawable(2);
//--
//
//--
myWrap = DrawableCompat.wrap(myWrap);
//myWrap = myWrap.mutate();
//--
// myWrapMutate.setColorFilter(color, PorterDuff.Mode.SRC_IN);
// DrawableCompat.setTintList(myWrap, ColorStateList.valueOf(color));
//--
DrawableCompat.setTint(myWrap, color);
//--
vthf.rating.invalidate();
}
else
if (event.getAction() == MotionEvent.ACTION_DOWN) {
param_final__view.setPressed(true);
}
else
if (event.getAction() == MotionEvent.ACTION_CANCEL) {
param_final__view.setPressed(false);
}
return true;
}
});
我相信它在从Android Studio 1.5.1和所有支持库升级后都停止了工作(不确定是什么版本) - 我不是100%肯定,因为我不确定我立刻发现问题或是否已经在这里更长。
我正在测试华为P6 Android 4.4.2
我的朋友看起来像他的:
compileSdkVersion 23
buildToolsVersion '23'
dependencies {
compile 'com.android.support:support-v4:+'
compile 'com.google.android.gms:play-services:+'
compile 'com.android.support:appcompat-v7:+'
}
我的清单有这个
<uses-sdk
android:minSdkVersion="9"
android:targetSdkVersion="17"
/>
这是我为什么代码不再有效的最佳线索 - 但如果我遗漏了可能导致与API版本无关的明显内容,我会接受各种建议。
--- ---注
此代码似乎使图形略微变暗:
final LayerDrawable layerDrawable = (LayerDrawable) vthf.rating.getProgressDrawable();
Drawable myWrap = layerDrawable.getDrawable(2);
myWrap = DrawableCompat.wrap(myWrap);
DrawableCompat.setTint(myWrap, color);
此代码无效:
final LayerDrawable layerDrawable = (LayerDrawable) vthf.rating.getProgressDrawable();
Drawable myWrap = layerDrawable.getDrawable(2);
DrawableCompat.setTint(myWrap, color);
不确定如何制作以上内容。也许问题是由我不理解的其他东西引起的。如果图形变暗,人们会认为它有点工作......但无论颜色如何,它都是完全相同的变暗 - 至少就我眼睛所知。
答案 0 :(得分:4)
我使用这样的东西来设置颜色。也可以在这里工作,从View继承的所有对象都应该能够做到这一点。这种情况使用ContextCompat来获取颜色,但是有更多的方法来获得你想要的颜色。
View view = (findViewById(R.id.text_view_location));
view.setBackgroundColor(ContextCompat.getColor(getApplicationContext(), R.color.wantedColor));
答案 1 :(得分:3)
当您使用DrawableCompat包装Drawable时,会创建一个新的DrawableWrapper。您需要将新的drawable设置为组件。
在你的代码中,你需要像这样添加一些思考(就在setTint之后):
layerDrawable.setCompoundDrawablesWithIntrinsicBounds(myWrap, null, null, null);
答案 2 :(得分:2)
AppCompat 23.3中的某些内容破坏了我以前的解决方案。无论如何,只需避免DrawableCompat#Wrap
:
ratingBarB.setOnTouchListener(new View.OnTouchListener() {
private int lastColoredProgress = 0;
@Override
public boolean onTouch(View v, MotionEvent event) {
int progress = ratingBarB.getProgress();
if (progress != lastColoredProgress) {
lastColoredProgress = progress;
int color;
switch (lastColoredProgress) {
case 0:
case 1:
color = Color.RED;
break;
case 2:
case 3:
color = Color.YELLOW;
break;
case 4:
default:
color = Color.GREEN;
break;
}
final Drawable drawable = ratingBarB.getProgressDrawable();
if (drawable instanceof LayerDrawable) { // Lollipop and newer
final LayerDrawable layerDrawable = (LayerDrawable) drawable;
DrawableCompat.setTint(layerDrawable.getDrawable(2), color);
} else {
DrawableCompat.setTint(drawable, color);
}
}
return false;
}
});