web-dev-qa-db-fra.com

Sélecteur Android avec image de fond et dégradé

Je sais qu'il existe un poste similaire à celui-ci mais je n'ai trouvé ma réponse dans aucun d'entre eux. Donc, j'ai ce XML dessinable:

<?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>

J'essaie de créer un bouton avec une image répétée comme arrière-plan et un dégradé qui lui est appliqué. Avec ce code, je ne vois que l’image d’arrière-plan, pas le dégradé, ni la bordure et les coins arrondis. De plus, lorsque je clique sur le bouton, cela ne change pas (le dégradé est censé changer). Je ne sais pas ce qui ne va pas avec ce code? Si au lieu d'un sélecteur j'utilise une liste de calques, j'obtiens le résultat souhaité, mais cela ne change pas non plus lorsque j'appuie sur le bouton. Merci de votre aide!

15
ali

Votre code pour le sélecteur est faux parce que:

  • Vous avez deux éléments pour le même état et lorsque le sélecteur rencontre le premier état (state_enabled) pour l'élément Bitmap, il s'arrête là et votre dégradé n'apparaîtra jamais (pour cela, vous devez utiliser un layer-list ayant pour élément la valeur Bitmap et le dégradé. en haut)

  • Le sélecteur fera correspondre les états dans l'ordre. Lorsque vous appuyez sur la variable Button, le state_pressed ne sera jamais activé car le sélecteur correspondra en premier au state_enabled figurant sur le premier élément (pour cela, vous devez déplacer le code de state_pressed au-dessus des éléments state_enabled).

En fait, vous devriez simplement supprimer le state_enabled et laisser la Bitmap + gradient être la valeur par défaut pour la Button. Bellow est votre sélecteur (j'ai supposé que vous ne vouliez changer que le dégradé de l'image (mais l'image devrait apparaître même à l'état pressé, si ce n'est pas le comportement souhaité, laissez uniquement le dégradé pour le 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>
48
Luksprog

dans mon cas, je l'utilise. l'essayer

<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

Regardez votre attribut d'état

<?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>

Pour répéter l’arrière-plan en tant qu’image, il suffit de créer des images de 9 pas.

0
fish40