2012-06-04 1 views
23

複数のボタンが同じ背景Drawableを使用する画面があります。 OnTouchリスナーを追加するためにさまざまなプロジェクトで使用するコードを再利用しています。ボタンをタッチしている間に灰色のカラーフィルターを追加します。それは通常正常に動作しますが、この場合、すべてのボタンは、いずれかが押されると色づけされます。Drawableにカラーフィルタを追加すると、同じDrawableを使用するすべてのButtonが変更されます

私はhttp://developer.android.com/guide/topics/graphics/2d-graphics.htmlでの説明を参照してください。

注:プロジェクト内の各ユニークなリソースは関係なく、あなたが のためにそれをインスタンス化することができるどのように多くの異なるオブジェクト、一つだけ 状態を維持することはできませんが。たとえば、同じ イメージリソースから2つのDrawableオブジェクトをインスタンス化し、 のDrawablesのいずれかのプロパティ(アルファなど)を変更すると、他のDrawableオブジェクトにも影響します。

推奨される解決方法は、カラーフィルタでは機能しないTweenAnimationを使用することです。

また、drawable.getConstantState()。newDrawable()の使用を提案しているAndroid: Cloning a drawable in order to make a StateListDrawable with filtersも見ました。これは違いがないようです。同じ物理イメージファイルが使用されている限り、すべてのDrawableは同じリソースを使用する他のDrawableへの変更の影響を受けると私は推測しています。

押された状態を示すために2番目の背景イメージを作成する以外に、どのような解決策がありますか?私のコードに追加してすべてのプロジェクトで使用できる単純なプログラム的なソリューションを用意することはいいことです。あなたのために働く必要があります

答えて

54

例:

Drawable buttonBackground = context.getResources().getDrawable(R.drawable.bg); 
buttonBackground = buttonBackground.mutate(); 

//Set your filter here 
+0

私は同じDrawableのとのMapView上の異なる色フィルタとオーバーレイを使用して同じ問題を抱えていました。 mutate();それを固定した。ありがとう:) –

+8

これは、getDrawableを呼び出す場合にのみ動作することに注意してください。変数にdrawableをキャッシュしてmutate()を呼び出すと、それらは引き続き状態を共有します。 – Jeremy

+1

私はこれで狂っていた、これは問題を解決した、ありがとう! :) –

関連する問題