web-dev-qa-db-de.com

Android-Wähler mit Hintergrundbild und Farbverlauf

Ich weiß, dass es einen ähnlichen Beitrag gibt, aber ich konnte meine Antwort in keinem von ihnen finden. Ich habe also dieses zeichnbare 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>

Ich versuche, eine Schaltfläche mit einem sich wiederholenden Bild als Hintergrund und einem darauf angewendeten Farbverlauf zu erstellen. Mit diesem Code sehe ich nur das Hintergrundbild, weder den Verlauf noch den Rand und die abgerundeten Ecken. Wenn ich auf die Schaltfläche klicke, ändert sich auch nichts (der Verlauf soll sich ändern). Ich weiß nicht, was mit diesem Code falsch ist? Wenn ich anstelle eines Selektors eine Layer-Liste verwende, erhalte ich das gewünschte Ergebnis, aber es ändert sich auch nicht, wenn ich die Taste drücke. Danke für Ihre Hilfe!

15
ali

Ihr Code für den Wähler ist falsch, weil:

  • Sie haben zwei Elemente für den gleichen Status. Wenn der Selektor auf den ersten Status (state_enabled) des Bitmap-Elements trifft, wird er dort angehalten und Ihr Verlauf wird nie angezeigt (hierfür sollten Sie einen layer-list verwenden, der als Elemente Bitmap und als Verlauf enthält oben drauf)

  • Der Selektor passt die Status in der Reihenfolge an. Wenn Sie auf Button drücken, wird der state_pressed nie aktiviert, da der Selektor zuerst mit dem state_enabled übereinstimmt, der sich auf dem ersten Element befindet (dazu sollten Sie den Code für den state_pressed über die state_enabled-Elemente verschieben).

In der Tat sollten Sie einfach den state_enabled entfernen und die Bitmap + gradient als Standardwert für die Button festlegen. Unten ist Ihr Selektor (Ich nahm an, Sie möchten nur den Farbverlauf im Bild ändern (das Bild sollte jedoch auch im gedrückten Zustand erscheinen, wenn dies nicht das gewünschte Verhalten ist, lassen Sie nur den Farbverlauf für den 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

Ich habe auf der rechten Seite des Bilds mit der Option für die Größe der Photoshop-Leinwand zusätzlichen transparenten Platz hinzugefügt, und das funktioniert bei mir einwandfrei. Laden Sie das Bild unten herunter, um die Demo zu sehen. enter image description here

0

in meinem Fall verwende ich das. Versuch es

<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

Schauen Sie sich Ihr Statusattribut an

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

Für das Wiederholen des Hintergrunds als Bild müssen Sie lediglich 9 Bilder erstellen.

0
fish40