继上述@ Joe的评论和我从上面的Android 2.1发现后,我认为更好的解决方法是将相同的colorFilter应用于Drawable以及ImageView(不幸的是,Drawable.getColorFilter()仅适用于API 21 ):
d1.setColorFilter (0xff00ffff, PorterDuff.Mode.MULTIPLY);
imageView.setColorFilter (0xff00ffff, PorterDuff.Mode.MULTIPLY);
imageView.setImageDrawable(d1);
反对ImageView.setBackgroundDrawable()的一件事是它不尊重ScaleType。
如果您已将ImageView扩展为其他用途,可能是更好的解决方案是将其修复为专门针对Android 2.1的setImageDrawable(),它将通过mBitmapState.mPaint.getColorFilter()中的反射将colorFilter应用并应用它到ImageView。您可以从http://search.maven.org下载JAR(和源代码),或者使用Maven或Gradle:org.apache.commons/commons-lang3下载JAR(和源代码)。最后版本最好的工作与Android 2.1/Java 5中我发现commons-lang3 v3.1
ImageViewCompat.setImageDrawable(imageView, d1);
package org.yourapp.widget;
import org.apache.commons.lang3.reflect.FieldUtils;
import android.graphics.Paint;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.os.Build;
import android.util.Log;
import android.widget.ImageView;
public final class ImageViewCompat {
/**
* Members
*/
private static final String TAG = ImageViewCompat.class.getSimpleName();
/**
* ImageView.setImageDrawable() backward compatible version.
*
* @param p_imageView
* @param p_drawable
*/
public static final void setImageDrawable(ImageView p_imageView, Drawable p_drawable) {
/*
* API 2.1 workaround - apply Drawable color filter to ImageView.
* @see http://stackoverflow.com/a/28108208/308836
*/
if (Build.VERSION.SDK_INT <= 7) {
if (p_drawable instanceof BitmapDrawable) {
try {
Object mBitmapState = FieldUtils.readDeclaredField(p_drawable, "mBitmapState", true);
Paint mPaint = (Paint) FieldUtils.readDeclaredField(mBitmapState, "mPaint", true);
p_imageView.setColorFilter(mPaint.getColorFilter());
}
catch (Exception e) {
Log.e(TAG, Log.getStackTraceString(e));
}
}
}
/*
* Set image drawable.
*/
p_imageView.setImageDrawable(p_drawable);
}
}
大,这似乎工作。谢谢! 你有任何解释为什么setImageDrawable()不起作用? – 2011-04-22 08:18:58
我在2.1 src中遇到了麻烦,将它与2.2进行比较,但我想它与ImageView applyColor方法或类似方法有关...因为setBackgroundDrawable是View的超类方法,并且处理方式不同,所以此错误可能不会不会影响它。 – Joe 2011-04-22 16:32:56
@Joe是正确的,ImageView.setImageDrawable()> updateDrawable()> applyColorMod()。 Android 2.1中的最后一个将始终应用分配给ImageView的颜色过滤器(可能为null),在稍后的版本中,只有在专门设置(新的mColorMod变量)时才会应用它。请参阅http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/2.1_r2/android/widget/ImageView.java#ImageView.applyColorMod%28%29和http: //grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/2.2_r1.1/android/widget/ImageView.java#ImageView.0mColorMod – 2015-01-23 10:36:41