2011-04-21 109 views
3

我在drawable的setColorFilter方法上有问题。setColorFilter在Android上不起作用<2.2

它在Android 2.2上正常工作,但在低于该版本的版本上工作正常。

我的问题是类似的描述在这里是什么Drawable.setColorFilter() not working on Android 2.1,但是,这并不为我工作...

我用这个代码,在Android 2.2工作正常,但没有什么比这更低。

ImageView imageView = (ImageView) findViewById(R.id.imageView1);   
Bitmap immutableBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.mybitmap); 
Bitmap mutableBitmap = immutableBitmap.copy(Bitmap.Config.ARGB_8888, true); 
immutableBitmap.recycle(); 
immutableBitmap = null; 
Drawable d1 = new BitmapDrawable(mutableBitmap); 
d1.setColorFilter(0xff00ffff, PorterDuff.Mode.MULTIPLY); 
imageView.setImageDrawable(d1); 

任何线索得到它的工作是非常赞赏:)

回答

1

我不知道是否有解决这个另一种方式,但我发现,使用imageView.setBackgroundDrawable()代替imageView.setImageDrawable()解决上< 2.2这个问题。

+0

大,这似乎工作。谢谢! 你有任何解释为什么setImageDrawable()不起作用? – 2011-04-22 08:18:58

+1

我在2.1 src中遇到了麻烦,将它与2.2进行比较,但我想它与ImageView applyColor方法或类似方法有关...因为setBackgroundDrawable是View的超类方法,并且处理方式不同,所以此错误可能不会不会影响它。 – Joe 2011-04-22 16:32:56

+0

@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

0

继上述@ 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); 
    } 
}