1. ホーム
  2. android

[解決済み] Androidです。フィルタ付きStateListDrawableを作成するためのDrawableのクローニング

2023-01-09 03:55:08

質問

フレームワークで、以下のような場合に任意のDrawableをハイライト表示させる機能を作りたい。 が押されたとき/フォーカスされたとき/選択されたとき/その他 .

私の関数はDrawableを受け取り、StateListDrawableを返します。デフォルトの状態はDrawable自身であり、その状態は android.R.attr.state_pressed の状態は同じ Drawable であり、ただ setColorFilter .

私の問題は、drawable をクローンして、フィルタを適用した別のインスタンスを作成することができないことです。以下は、私が達成しようとしていることです。

StateListDrawable makeHighlightable(Drawable drawable)
{
    StateListDrawable res = new StateListDrawable();

    Drawable clone = drawable.clone(); // how do I do this??

    clone.setColorFilter(0xFFFF0000, PorterDuff.Mode.MULTIPLY);
    res.addState(new int[] {android.R.attr.state_pressed}, clone);
    res.addState(new int[] { }, drawable);
    return res;
}

クローンしない場合は、明らかに両方の状態にフィルターが適用されます。試しに mutate() を弄ってみましたが、役に立ちません...。

何かいい方法はありませんか?

更新しました。

受け入れられた答えは、確かにdrawableをクローンします。しかし、私の一般的な関数が別の問題で失敗したため、それは私を助けませんでした。StateList に drawable を追加するとき、それはすべてのフィルタを失うようです。

どのように解決するのですか?

以下を試してみてください。

Drawable clone = drawable.getConstantState().newDrawable();