web-dev-qa-db-ja.com

Android背景画像とグラデーションを備えたセレクタ

私はこれに似た記事があることを知っていますが、どれにも私の答えが見つかりませんでした。だから、私はこの描画可能なXMLを持っています:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:Android="http://schemas.Android.com/apk/res/Android">
<item Android:state_enabled="true">
    <bitmap
        Android:src="@drawable/bm_btn_background"
        Android:tileMode="repeat"
        Android:gravity="center" />
</item>
<item Android:state_enabled="true">
    <shape Android:shape="rectangle">
        <gradient
            Android:startColor="#a0e0b071"
            Android:endColor="#a0a67637"
            Android:angle="270" />
        <stroke
            Android:width="1dp"
            Android:color="#5c3708" />
        <corners
            Android:radius="5dp" />
        <padding
            Android:left="10dp"
            Android:top="10dp"
            Android:right="10dp"
            Android:bottom="10dp" />
    </shape>
</item>
<item Android:state_pressed="true" >
    <shape>
        <gradient
            Android:startColor="#a0a67637"
            Android:endColor="#a0e0b071"
            Android:angle="270" />
        <stroke
            Android:width="1dp"
            Android:color="#5c3708" />
        <corners
            Android:radius="5dp" />
        <padding
            Android:left="10dp"
            Android:top="10dp"
            Android:right="10dp"
            Android:bottom="10dp" />
    </shape>
</item>

背景として繰り返される画像とそれに適用されたグラデーションを持つボタンを作成しようとしています。このコードでは、グラデーションや境界線、丸みを帯びた角ではなく、背景画像のみが表示されます。また、ボタンをクリックしても変化しません(グラデーションが変化するはずです)。このコードの何が問題なのかわかりませんか?セレクターの代わりにレイヤーリストを使用すると、目的の結果が得られますが、ボタンを押しても変化しません。ご協力いただきありがとうございます!

15
ali

次の理由により、セレクターのコードが間違っています。

  • 同じ状態の2つの要素があり、セレクターがBitmap要素の最初の状態(state_enabled)に遭遇すると、そこで停止し、グラデーションが表示されません(このため、アイテムとしてを持つlayer-listを使用する必要がありますBitmapと上部のグラデーション)

  • セレクタは状態を順番に照合します。 Buttonを押すと、セレクターが最初の要素にあるstate_pressedと最初に一致するため、state_enabledがアクティブになることはありません(これには、state_pressedのコードをstate_enabled要素の上に移動する必要があります)。

実際、state_enabledを削除して、Bitmap + gradientButtonのデフォルト値にするだけです。ベローはあなたのセレクタです(私はあなたが画像のグラデーションを変更したいだけだと仮定しました(しかし、これが望まれる動作でない場合、画像は押された状態でも表示されるはずですstate_pressedのグラデーションのみを残します)):

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:Android="http://schemas.Android.com/apk/res/Android">

    <item Android:state_pressed="true">
        <layer-list>
            <item>
                <bitmap Android:gravity="center" Android:src="@drawable/bm_btn_background" Android:tileMode="repeat" />
            </item>
            <item>
                <shape>
                     <gradient Android:angle="270" Android:endColor="#a0e0b071" Android:startColor="#a0a67637" />
                     <stroke Android:width="1dp" Android:color="#5c3708" />
                     <corners Android:radius="5dp" />
                     <padding Android:bottom="10dp" Android:left="10dp" Android:right="10dp" Android:top="10dp" />
                </shape>
            </item>
        </layer-list>
    </item>

    <item Android:state_enabled="true">
        <layer-list>
            <item>
                <bitmap Android:gravity="center" Android:src="@drawable/bm_btn_background" Android:tileMode="repeat" />
            </item>
            <item>
                <shape Android:shape="rectangle">
                    <gradient Android:angle="270" Android:endColor="#a0a67637" Android:startColor="#a0e0b071" />
                    <stroke Android:width="1dp" Android:color="#5c3708" />
                    <corners Android:radius="5dp" />
                    <padding Android:bottom="10dp" Android:left="10dp" Android:right="10dp" Android:top="10dp" />
                </shape>
            </item>
        </layer-list>
    </item>


</selector>
49
Luksprog

私の場合、これを使用しています。それを試してみてください

<item Android:state_pressed="true">
    <shape>
        <solid Android:color="@color/mediumGray" />

        <stroke
            Android:width="1px"
            Android:color="@color/darkGray" />

        <padding
            Android:bottom="2dp"
            Android:left="1dp"
            Android:right="1dp"
            Android:top="2dp" />

        <corners
            Android:bottomLeftRadius="7sp"
            Android:bottomRightRadius="7sp"
            Android:topLeftRadius="7sp"
            Android:topRightRadius="7sp" />
    </shape>
</item>
<item Android:state_focused="true">
    <shape>
        <solid Android:color="@color/mediumGray" />

        <stroke
            Android:width="1px"
            Android:color="@color/darkGray" />

        <padding
            Android:bottom="2dp"
            Android:left="1dp"
            Android:right="1dp"
            Android:top="2dp" />

        <corners
            Android:bottomLeftRadius="7sp"
            Android:bottomRightRadius="7sp"
            Android:topLeftRadius="7sp"
            Android:topRightRadius="7sp" />
    </shape>
</item>
<item>
    <shape>
        <solid Android:color="@color/lightGray" />

        <stroke
            Android:width="1px"
            Android:color="@color/blackTransparent" />

        <padding
            Android:bottom="2dp"
            Android:left="1dp"
            Android:right="1dp"
            Android:top="2dp" />

        <corners
            Android:bottomLeftRadius="7sp"
            Android:bottomRightRadius="7sp"
            Android:topLeftRadius="7sp"
            Android:topRightRadius="7sp" />
    </shape>
</item>
0
Zaz Gmy

状態属性を確認してください

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:Android="http://schemas.Android.com/apk/res/Android">

    <!-- Non focused states -->
    <item Android:drawable="@drawable/nicebuttonround" Android:state_focused="false" Android:state_pressed="false" Android:state_selected="false"/>
    <item Android:drawable="@drawable/nicebuttonround" Android:state_focused="false" Android:state_pressed="false" Android:state_selected="true"/>

    <!-- Focused states -->
    <item Android:drawable="@drawable/nicebuttonroundi" Android:state_focused="true" Android:state_pressed="false" Android:state_selected="false"/>
    <item Android:drawable="@drawable/nicebuttonroundi" Android:state_focused="true" Android:state_pressed="false" Android:state_selected="true"/>

    <!-- Pressed -->
    <item Android:drawable="@drawable/nicebuttonroundi" Android:state_pressed="true" Android:state_selected="true"/>
    <item Android:drawable="@drawable/Nice22i" Android:state_pressed="true"/>

</selector>

画像として背景を繰り返すには、9ピッチの画像を作成する必要があります。

0
fish40