30

我有一個ImageViewandroid:src設置爲ShapedDrawable,即一個白色圓圈。我想要的是在運行時響應某些事件對這個ImageView着色。 imgView.setColorFilter似乎是解決方案,但使用後(嘗試不同的參數)後,圖像變得不可見(我沒有看到它在屏幕上)。將ColorFilter應用於ImageView與ShapedDrawable

如何解決這個問題?有沒有更好的方法有色環?

+0

你可能會發現[這個相關的問答](有趣的問題)(http://stackoverflow.com/questions/4354939/understanding-the-use-of-colormatrix-and-colormatrixcolorfilter-to-modify-a-draw)。 – 2012-04-11 21:49:20

+0

對不起,但我找不到與此問題相關的任何內容。 – aplavin 2012-04-11 21:56:53

+0

我不知道如何找不到相關的接受答案...總之,這裏是另一個類似的主題:[鏈接](http://stackoverflow.com/q/1309629/1029225)。如上所示,請嘗試:'imgView.setColorFilter(0xff00ffff,PorterDuff.Mode.MULTIPLY);'。如果這不符合您的需求,那麼還會提出更復雜的解決方案。 – 2012-04-12 04:53:44

回答

93

好吧,我有一個快速發揮這一點,並注意到你的問題的圈子消失。沒有你描述什麼剛剛你嘗試過,我假設你還沒有嘗試將顏色過濾器設置爲Drawable本身呢? (而不是ImageView,這似乎只與BitmapDrawable s一起工作)。

下面的語句完全正常工作的一個XML聲明ShapeDrawable以白色作爲初始顏色:

ImageView redCircle = (ImageView) findViewById(R.id.circle_red_imageview); 
ImageView greenCircle = (ImageView) findViewById(R.id.circle_green_imageview); 
ImageView blueCircle = (ImageView) findViewById(R.id.circle_blue_imageview); 

// we can create the color values in different ways: 
redCircle.getDrawable().setColorFilter(Color.RED, PorterDuff.Mode.MULTIPLY); 
greenCircle.getDrawable().setColorFilter(0xff00ff00, PorterDuff.Mode.MULTIPLY); 
blueCircle.getDrawable().setColorFilter(getResources().getColor(R.color.blue), PorterDuff.Mode.MULTIPLY); 

ShapeDrawable的完整性:(我設置的大小上ImageView,見下文)

<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="oval" > 
    <solid android:color="@android:color/white" /> 
</shape> 

ImageView S作爲示例之一:

<ImageView 
    android:id="@+id/circle_red_imageview" 
    android:layout_width="40dp" 
    android:layout_height="40dp" 
    android:padding="5dp" 
    android:src="@drawable/circle_white" /> 

的視覺效果:

Screenshot of colored circles

+4

在'Drawable'上調用'mutable()'將有助於保持drawable的狀態。 – Sufian 2014-03-25 13:13:03

+0

哇這只是救了我,你一定想把過濾器應用到'Drawable'而不是簡單的'ImageView'。 – Maurizio 2014-07-30 00:54:08

+0

如果我們使用白色作爲原始顏色,我們是否可以得到我們在此選擇的確切顏色setColorFilter(0xff00ff00,PorterDuff.Mode.MULTIPLY)。如果不是我們怎樣才能得到確切的顏色? – SadeepDarshana 2015-10-24 15:17:16

11

如果你想改變圖像顏色在上面的例子中使用

PorterDuff.Mode.SRC_ATOP instead 
PorterDuff.Mode.MULTIPLY 

+0

我認爲作者問過任何過濾器,而不僅僅是SRC_ATOP或MULTIPLY。 – kelin 2015-12-14 12:33:49

5

您可以在xml中使用ImageView中的屬性android:tint

例子:

<ImageView 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:src="@drawable/your_drawable" 
    android:tint="@color/your_color" /> 

測試在Android 4.1.2和6.0.1

+0

不錯的答案不需要跑 – marlonpya 2017-10-31 03:14:39

+0

@marlonpya謝謝! – 2017-10-31 10:36:54

相關問題