2013-05-02 72 views
1

我正在編寫一個應用程序,我必須在其中執行一些即時圖像變化。在StateListDrawable中應用顏色過濾器不起作用

我所要做的就是在屏幕上放置一個drawable,給它一個花哨的顏色,可以隨時更改並使其可點擊(使用StateListDrawable)。

對於在飛行中的顏色變化,我正在考慮使用PorterDuffColorFilter,我將其應用於drawable上。然而,將濾鏡添加到StateListDrawable似乎是一個壞主意,因爲濾色器被刪除。 但後來我想出了這個解決方案,我發現某處的SO:

BitmapFactory.Options options = new BitmapFactory.Options(); 
    options.inPreferredConfig = Bitmap.Config.ARGB_8888; 
    Bitmap one = BitmapFactory.decodeResource(context.getResources(), R.drawable.my_drawable, options); 
    Bitmap oneCopy = Bitmap.createBitmap(one.getWidth(), one.getHeight(), Bitmap.Config.ARGB_8888); 

    Canvas c = new Canvas(oneCopy); 
    Paint p = new Paint(); 
    p.setColorFilter(new PorterDuffColorFilter(onTheFlyColorResId, PorterDuff.Mode.SRC_ATOP)); 
    c.drawBitmap(one, 0, 0, p); 

    ... 

    sld.addState(new int[]{-stateFocused}, new BitmapDrawable(context.getResources(), oneCopy)); 

這類作品,但有一個棘手的事情。下面的圖片是結果,而R.drawable.my_drawable是一個PNG文件,它周圍是3px的透明邊框。

The problem...

如果我只是在初始的繪製我得到了全黑色的圖像與側面部分TRANSPARANT像素象下面這樣:

sld.addState(new int[]{-stateFocused}, context.getResources().getDrawable(R.drawable.my_drawable)); 

這是結果:

The result I want but without the color filter

所以我在想,oneCopy bitmat或canva上的圖形可能有問題S,所以我的代碼改成這樣:

BitmapFactory.Options options = new BitmapFactory.Options(); 
    options.inPreferredConfig = Bitmap.Config.ARGB_8888; 
    Bitmap one = BitmapFactory.decodeResource(context.getResources(), R.drawable.my_drawable, options); 

    ... 

    sld.addState(new int[]{-stateFocused}, new BitmapDrawable(context.getResources(), one)); 

所以繪製的沒有更多的轉換,只是讀它作爲一個位圖,將其轉化爲可提拉再次也導致一個奇怪的結果:

Also not good...

而我只想要的是我的自定義顏色應用的第二個圖像。

有沒有人有一個想法,爲什麼我得到了奇怪的淡入淡出效果左右圖像?

回答

0

要應用彩色濾鏡並更改可繪製的顏色,我發現使用灰度/白色的基本drawable最好與Mode.MULTIPLY PorterDuff濾鏡結合使用。

如果你想這樣做的代碼是好的,但在我看來,最好的組合是有一個XML定義的TextView與白色灰度背景,然後在代碼中,你可以更改背景顏色:

<TextView 
    android:id="@+id/mybox" 
    . . . 
    android:background="@drawable/box" 

可繪製的框可以是任何東西,PNG或另一個XML,定義了填充純色白色的矩形形狀。

int onTheFlyColor = 0xAARRGGBB; or getResources().getColor(R.color.red); 
TextView tv = findViewById(R.id.mybox); 
tv.getBackground().setColorFilter(onTheFlyColor, Mode.MULTIPLY); 
+0

這的確應該工作(類似於測試的東西),但我的問題是申請使用StateListDrawable彩色濾光片...... – dirkvranckaert 2013-05-07 05:23:04

+0

@dirkvranckaert我想你不是說要改變「對飛」,但顏色只是爲了'StateListDrawable'中的每個狀態都有不同的顏色。在飛行中,如果用戶或某種算法在每次狀態更改時選擇一種顏色,但如果我理解正確,則每種狀態的顏色都是已知的並且是硬編碼的。 – ilomambo 2013-05-07 06:11:56

+0

我確實有一個StateListDrawable。如果選擇了sld,我會顯示一個'硬編碼'的drawable。在另一種情況下(如果沒有選中,只是顯示)我想要顯示黑色可繪製,但用彩色濾鏡將黑色可繪製的顏色更改爲用戶可以在顯示按鈕之前的活動中選擇的顏色... – dirkvranckaert 2013-05-08 10:03:28