23

ImageViews、TextViews、背景画像など、さまざまなアイテムを含むビューを均一にグレーアウトするにはどうすればよいですか。それぞれを個別にグレーアウトする必要がありますか?または、すべてに同じカラーフィルターを適用する方法はありますか?

4

6 に答える 6

23

他の誰かがより良い答えを持っていない限り、私の現在の方法は、各項目を個別にグレーアウトしています.

PorterDuffColorFilter greyFilter = new PorterDuffColorFilter(Color.GRAY, PorterDuff.Mode.MULTIPLY);
myLayout.getBackground().setColorFilter(greyFilter);
myImageView.setColorFilter(greyFilter);
myTextView.setTextColor(0xff777777);

より多くのまたはネストされた子の場合、おそらく instanceof を使用したループが適していますが、私はそれを必要としません。

編集: このフィルターは実際には灰色ではありません。より良いフィルターは次のとおりです: Drawable => grayscale 同じ方法で使用できます。

于 2012-06-14T16:18:12.277 に答える
7

アイテムを「グレーアウト」するために使用している方法に完全に依存します。setEnabled(false)親を呼び出すことによってそうしている場合ViewGroup、デフォルトでは状態フラグ (無効化など) は子ビューに細分化されません。ただし、これをカスタマイズする簡単な方法が 2 つあります。

1 つのオプションは、XML の各子ビューに属性を追加することです。 android:duplicateParentState="true"これにより、子は親から状態フラグを取得するように指示されます。ただし、これは、有効になっているだけでなく、押された、チェックされたなどを含むすべてのフラグをミラーリングします。

別のオプションは、あなたのカスタムサブクラスを作成しViewGroup、オーバーライドsetEnabled()してすべての子ビューも呼び出すことです。

@Override
public void setEnabled(boolean enabled) {
    super.setEnabled(enabled);

    for(int i=0; i < getChildCount(); i++) {
        getChildAt(i).setEnabled(enabled);
    }
}
于 2012-06-14T16:01:38.137 に答える