2013-09-23 44 views
27

我試圖在imageview上實現一個簡單的colorfilter來將黑色圖像變成白色圖像。爲了做到這一點我做到以下幾點:setColorFilter無法正常工作

weatherImg.setColorFilter(Color.BLACK, PorterDuff.Mode.MULTIPLY); 
    weatherImg.setImageResource(R.drawable.b_clouded_rain); 

我也試圖改變在彩色濾光片顏色爲紅色和白色,但他們都沒有任何效果,我究竟做錯了什麼?

回答

66

雖然我不喜歡回答我自己的問題,我發現問題了: 我應該使用:

weatherImg.setColorFilter(Color.WHITE, PorterDuff.Mode.SRC_ATOP); 
+7

'PorterDuff.Mode.SRC_ATOP'它是一個默認情況下使用,'weatherImg.setColorFilter(Color.WHITE)'也可以工作;) – GuilhE

21

這取決於你想申請什麼樣的過濾。如果YOUT想與它透明的圖像上應用新的顏色,這是對我工作:

weatherImg.setColorFilter(Color.WHITE, PorterDuff.Mode.SRC_IN); 

如果您想了解更多關於這PorterDuff過濾器,我發現了一個goog文章,幫助我明白了: http://www.ibm.com/developerworks/java/library/j-mer0918/給它一個閱讀:)

14

在Android 6上有相同的問題。通過使用ImageView.getDrawable().setColorFilter()而不是ImageView.setColorFilter()解決。

2

我在跑4.3在三星S3與setColorFilter問題的唯一途徑我能得到的過濾器的工作是通過在draw(Canvas canvas)方法應用它:

public class ColouredDrawable extends BitmapDrawable { 

private ColorFilter mColorFilter; 

public ColouredDrawable(Bitmap toTransform, int toColour, Resources resources) { 
    super(resources, toTransform); 
    float[] matrix = { 
      0, 0, 0, 0, ((toColour & 0xFF0000)/0xFFFF), 
      0, 0, 0, 0, ((toColour & 0xFF00)/0xFF), 
      0, 0, 0, 0, (toColour & 0xFF), 
      0, 0, 0, 1, 0 }; 
    mColorFilter = new ColorMatrixColorFilter(matrix); 
} 

@Override 
public void draw(Canvas canvas) { 
    setColorFilter(mColorFilter); 
    super.draw(canvas); 
} 

簡單應用setColorFilter到BitmapDrawable沒似乎沒有任何效果。

+0

同樣的問題在S4 4.4.4。 – Simas

+0

與4.3和4.4.4上的2個三星設備一樣!這真的很糟糕! – sud007

+1

在Lollipop之前的Android上也是如此。 NinePatchDrawable也受到影響。我通過覆蓋drawable類並在draw方法中將paintFilter設置爲paint對象來解決此問題: @Override public void draw(Canvas canvas){getCaint()。setColorFilter(your_colorFilter); super.draw(canvas); } – Venator85

1

對我來說,只有這個解決方案工作:

image.setColorFilter(Color.BLACK, PorterDuff.Mode.MULTIPLY); 
image.setImageResource(R.drawable.img); 

過濾器適用於當R.drawable.img是矢量圖像,並具有光柵資源

3

我們使用此代碼

Drawable drawable = DrawableCompat.wrap(getDrawable(drawableResource)); 
     drawable.mutate(); 
     DrawableCompat.setTint(drawable, getColor(color)); 
     drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight()); 

public static int getColor(int id) { 
     return ContextCompat.getColor(getInstance().context, id); 
    } 

public static Drawable getDrawable(int id) { 
     return ContextCompat.getDrawable(getInstance().context, id); 
    } 
0

對於Android的無影響4.3和4.4,setColorFilter不起作用。改用DrawableCompat。

val drawable = DrawableCompat.wrap(ContextCompat.getDrawable(
      context, 
      R.drawable.b_clouded_rain)); 
    DrawableCompat.setTint(drawable, foregroundColor); 
    DrawableCompat.setTintMode(drawable, PorterDuff.Mode.SRC_IN) 
      .setColorFilter(Color.BLACK, PorterDuff.Mode.MULTIPLY); 

    weatherImg.setImageResource(R.drawable.b_clouded_rain);