752 Stimmen

Standard Android Button mit einer anderen Farbe

Ich möchte die Farbe einer Standard-Android-Schaltfläche leicht ändern, um sie besser an das Branding eines Kunden anzupassen.

Die beste Methode, die ich bisher gefunden habe, ist die Änderung der Button auf die Ziehharmonika, die sich in res/drawable/red_button.xml :

<?xml version="1.0" encoding="utf-8"?>    
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_pressed="true" android:drawable="@drawable/red_button_pressed" />
    <item android:state_focused="true" android:drawable="@drawable/red_button_focus" />
    <item android:drawable="@drawable/red_button_rest" />
</selector>

Aber tun, dass erfordert, dass ich tatsächlich drei verschiedene Drawables für jede Schaltfläche, die ich anpassen möchten (eine für die Schaltfläche im Ruhezustand, eine, wenn fokussiert, und eine, wenn gedrückt) erstellen. Das scheint komplizierter und non-DRY als ich brauche.

Alles, was ich wirklich tun möchte, ist eine Art von Farbumwandlung auf die Schaltfläche anwenden. Gibt es einen einfacheren Weg zu gehen, über die Änderung einer Schaltfläche die Farbe als ich tun?

0 Stimmen

24voto

Stan Kurdziel Punkte 5058

Mir gefällt der Vorschlag des Farbfilters in den vorherigen Antworten von @conjugatedirection und @Tomasz; Allerdings fand ich, dass der bisher zur Verfügung gestellte Code nicht so einfach anzuwenden war, wie ich erwartet hatte.

Erstens: Es wurde nicht erwähnt. wobei um den Farbfilter anzuwenden und zu löschen. Es ist möglich, dass es andere gute Stellen gibt, um dies zu tun, aber was mir in den Sinn kam, war ein OnTouchListener .

Wenn ich die ursprüngliche Frage richtig verstanden habe, wäre die ideale Lösung eine, die ohne Bilder auskommt. Die akzeptierte Antwort mit custom_button.xml von @emmby ist wahrscheinlich eine bessere Lösung als Farbfilter, wenn das Ihr Ziel ist. In meinem Fall beginne ich mit einem png-Bild von einem UI-Designer, das zeigt, wie die Schaltfläche aussehen soll. Wenn ich den Hintergrund der Schaltfläche auf dieses Bild einstelle, geht die standardmäßige Hervorhebungsrückmeldung vollständig verloren. Dieser Code ersetzt dieses Verhalten durch einen programmatischen Verdunkelungseffekt.

button.setOnTouchListener(new OnTouchListener() {
    @Override
    public boolean onTouch(View v, MotionEvent event) {
        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                // 0x6D6D6D sets how much to darken - tweak as desired
                setColorFilter(v, 0x6D6D6D);
                break;
            // remove the filter when moving off the button
            // the same way a selector implementation would 
            case MotionEvent.ACTION_MOVE:
                Rect r = new Rect();
                v.getLocalVisibleRect(r);
                if (!r.contains((int) event.getX(), (int) event.getY())) {
                    setColorFilter(v, null);
                }
                break;
            case MotionEvent.ACTION_OUTSIDE:
            case MotionEvent.ACTION_CANCEL:
            case MotionEvent.ACTION_UP:
                setColorFilter(v, null);
                break;
        }
        return false;
    }

    private void setColorFilter(View v, Integer filter) {
        if (filter == null) v.getBackground().clearColorFilter();
        else {
            // To lighten instead of darken, try this:
            // LightingColorFilter lighten = new LightingColorFilter(0xFFFFFF, filter);
            LightingColorFilter darken = new LightingColorFilter(filter, 0x000000);
            v.getBackground().setColorFilter(darken);
        }
        // required on Android 2.3.7 for filter change to take effect (but not on 4.0.4)
        v.getBackground().invalidateSelf();
    }
});

Ich habe dies als eine separate Klasse für die Anwendung auf mehrere Schaltflächen extrahiert - als anonyme innere Klasse dargestellt, nur um die Idee zu bekommen.

0 Stimmen

Das war eine großartige Lösung! Meistens die gleiche Wirkung, wie Sie auf iOS standardmäßig erhalten, die ist, was Designer wie :-)

0 Stimmen

Ich habe dies mit 2 Tasten auf demselben Bildschirm mit demselben Hintergrund versucht und der Effekt gilt für beide Tasten onTouch

17voto

haemish Punkte 426

Wenn Sie farbige Schaltflächen mit XML erstellen, können Sie den Code etwas übersichtlicher gestalten, indem Sie den fokussierten und den gedrückten Zustand in einer separaten Datei angeben und diese wiederverwenden. Meine grüne Schaltfläche sieht wie folgt aus:

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

    <item android:state_focused="true" android:drawable="@drawable/button_focused"/>
    <item android:state_pressed="true" android:drawable="@drawable/button_pressed"/>

    <item>
        <shape>
            <gradient android:startColor="#ff00ff00" android:endColor="#bb00ff00" android:angle="270" />
            <stroke android:width="1dp" android:color="#bb00ff00" />
            <corners android:radius="3dp" />
            <padding android:left="10dp" android:top="10dp" android:right="10dp" android:bottom="10dp" />
        </shape>
    </item>

</selector>

1 Stimmen

Schön. Wie könnte man den fokussierten und gedrückten Zustand auf die Standard-Android-Definitionen für Schaltflächen zurückführen?

0 Stimmen

Ich bin mir ziemlich sicher, dass Sie das nicht tun, da die Standard-Android-Tasten als 9-Patch-Bitmaps implementiert sind.

14voto

user1185087 Punkte 3988

Die kürzeste Lösung, die mit jeder Android-Version funktioniert:

<Button
     app:backgroundTint="@color/my_color"

Anmerkungen/Anforderungen :

  • を使用します。 app: Namespace und no die android: Namensraum!
  • appcompat Version > 24.2.0

    Abhängigkeiten { compile 'com.Android.support:appcompat-v7:25.3.1' }

Erläuterung : enter image description here

1 Stimmen

Interessant ist, dass für mich app:backgroundTint="@color/my_color" hat nicht funktioniert. android:backgroundTint="@color/my_color" hat jedoch perfekt funktioniert.

0 Stimmen

Das ist für mich die kürzeste und sauberste Lösung und das ist alles.

12voto

Kelok Chan Punkte 594

Ich verwende diesen Ansatz

style.xml

<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
    <item name="android:colorPrimaryDark">#413152</item>
    <item name="android:colorPrimary">#534364</item>
    <item name="android:colorAccent">#534364</item>
    <item name="android:buttonStyle">@style/MyButtonStyle</item>
</style>

<style name="MyButtonStyle" parent="Widget.AppCompat.Button.Colored">
    <item name="android:colorButtonNormal">#534364</item>
    <item name="android:textColor">#ffffff</item>
</style>

Wie Sie oben sehen können, verwende ich einen benutzerdefinierten Stil für meine Schaltfläche. Die Farbe der Schaltfläche entspricht der Akzentfarbe. Ich finde dies einen viel besseren Ansatz als die Einstellung android:background da ich die Wirkung von Google nicht verlieren werde.

10voto

IntelliJ Amiya Punkte 72793

Verwenden Sie es auf diese Weise:

buttonOBJ.getBackground().setColorFilter(Color.parseColor("#YOUR_HEX_COLOR_CODE"), PorterDuff.Mode.MULTIPLY);

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X