wake-up-neo.com

Wesentlicher Effekt auf Schaltfläche mit Hintergrundfarbe

Ich verwende die Android v21-Unterstützungsbibliothek. 

Ich habe eine Schaltfläche mit benutzerdefinierter Hintergrundfarbe erstellt. Die Material-Design-Effekte wie Welligkeit, Laibung sind verschwunden (außer der Erhebung beim Klicken), wenn ich die Hintergrundfarbe des Hintergrunds verwende.

 <Button
 style="?android:attr/buttonStyleSmall"
 Android:background="?attr/colorPrimary"
 Android:textColor="@color/white"
 Android:textAllCaps="true"
 Android:layout_width="fill_parent"
 Android:layout_height="wrap_content"
 Android:text="Button1"
 />

BackgroundDas Folgende ist eine normale Schaltfläche und die Effekte funktionieren einwandfrei.

<Button
 style="?android:attr/buttonStyleSmall"
 Android:layout_width="fill_parent"
 Android:layout_height="wrap_content"
 Android:textAllCaps="true"
 Android:text="Button1"
/>

Default button

226
Sathesh

Wenn Sie Android:background verwenden, ersetzen Sie einen Großteil des Stylings und das Erscheinungsbild einer Schaltfläche durch eine leere Farbe.

Update: Ab Version 23.0.0 von AppCompat gibt es einen neuen Widget.AppCompat.Button.Colored - Stil, der die colorButtonNormal Ihres Themes für die deaktivierte Farbe und colorAccent für die aktivierte Farbe verwendet .

Dadurch können Sie es direkt über Ihre Schaltfläche anwenden

<Button
  ...
  style="@style/Widget.AppCompat.Button.Colored" />

Wenn Sie eine benutzerdefinierte colorButtonNormal oder colorAccent benötigen, können Sie eine ThemeOverlay verwenden, wie in diesem Pro-Tipp und Android:theme auf der Schaltfläche erläutert.

Vorherige Antwort

Sie können ein Drawable in Ihrem v21-Verzeichnis für Ihren Hintergrund verwenden, z.

<?xml version="1.0" encoding="utf-8"?>
<ripple xmlns:Android="http://schemas.Android.com/apk/res/Android"
        Android:color="?attr/colorControlHighlight">
    <item Android:drawable="?attr/colorPrimary"/>
</ripple>

Dadurch wird sichergestellt, dass Ihre Hintergrundfarbe ?attr/colorPrimary ist und die standardmäßige Ripple-Animation mit dem Standardcode ?attr/colorControlHighlight verwendet wird (den Sie auch in Ihrem Design festlegen können, wenn Sie möchten).

Hinweis: Sie müssen einen benutzerdefinierten Selektor für weniger als v21 erstellen:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:Android="http://schemas.Android.com/apk/res/Android">
    <item Android:drawable="@color/primaryPressed" Android:state_pressed="true"/>
    <item Android:drawable="@color/primaryFocused" Android:state_focused="true"/>
    <item Android:drawable="@color/primary"/>
</selector>

Angenommen, Sie haben einige Farben für den voreingestellten, gedrückten und fokussierten Zustand. Persönlich habe ich einen Screenshot einer Welligkeit auf halbem Weg durch die Auswahl gemacht und den primären/fokussierten Zustand aus diesem herausgezogen.

417
ianhanniballake

Es gibt eine andere einfache Lösung, um einen benutzerdefinierten Hintergrund für "Flat" -Tasten bereitzustellen, während die "Material" -Effekte beibehalten werden.

  1. Platzieren Sie Ihre Schaltfläche in der ViewGroup mit dem gewünschten Hintergrund
  2. setze selectableItemBackground vom aktuellen Design als Hintergrund für deine Schaltfläche (API> = 11)

d.h.

<FrameLayout
    Android:layout_width="wrap_content"
    Android:layout_height="wrap_content"
    Android:background="@color/blue">
    <Button
        style="?android:attr/buttonStyleSmall"
        Android:background="?android:attr/selectableItemBackground"
        Android:textColor="@Android:color/white"
        Android:textAllCaps="true"
        Android:layout_width="fill_parent"
        Android:layout_height="wrap_content"
        Android:text="Button1"
        />
</FrameLayout>

Kann für Flat Buttons verwendet werden, es funktioniert bei API> = 11, und Sie erhalten einen Ripple-Effekt auf> = 21 Geräten. Halten Sie die regulären Buttons auf Pre-21, bis AppCompat aktualisiert wird, um auch dort Ripple zu unterstützen.

Sie können auch die Tasten selectableItemBackgroundBorderless for> = 21 verwenden.

90
kiruwka

Hier ist eine einfache und abwärtskompatible Methode, um hervorgehobene Schaltflächen mit dem benutzerdefinierten Hintergrund einen Welleneffekt zu erzeugen.

Ihr Layout sollte so aussehen

<Button
    Android:layout_width="wrap_content"
    Android:layout_height="wrap_content"
    Android:background="@drawable/my_custom_background"
    Android:foreground="?android:attr/selectableItemBackground"/>
83
Bolein95

Ich bin heute auf dieses Problem gestoßen, als ich mit der v22-Bibliothek spielte. 

Vorausgesetzt, Sie verwenden Stile, können Sie die colorButtonNormal -Eigenschaft festlegen und die Schaltflächen verwenden standardmäßig diese Farbe. 

<style name="AppTheme" parent="BaseTheme">
    <!-- Customize your theme here. -->
    <item name="colorPrimary">@color/primaryColor</item>
    <item name="colorPrimaryDark">@color/primaryColorDark</item>
    <item name="colorAccent">@color/accentColor</item>
    <item name="colorButtonNormal">@color/primaryColor</item>
</style>

Abgesehen davon können Sie noch einen Stil für die Schaltfläche erstellen und diesen dann verwenden, wenn Sie eine Auswahl an Farben benötigen (nicht getestet, nur spekuliert).

Denken Sie daran, Android: vor den Artikelnamen in Ihrem v21-Stil hinzuzufügen. 

25
Robert Rose

Mit AppCompat (22.1.1+) können Sie einen Stil wie folgt hinzufügen:

<style name="MyGreenButton">
    <item name="colorButtonNormal">#009900</item>
</style>

Und verwenden Sie es, indem Sie einfach den Stil anwenden:

<Android.support.v7.widget.AppCompatButton
    style="@style/MyGreenButton"
    Android:layout_width="match_width"
    Android:layout_height="wrap_content"
    Android:text="A Green Button"
    />

Beim Programmieren der Farbe habe ich festgestellt, dass die einzige Möglichkeit zum Aktualisieren der Farbe (bei API 15 oder 16) die Verwendung der 'Hintergrundfarbliste' war. Und es entfernt die Nice-Radial-Animation auf API 21-Geräten nicht:

ColorStateList colorStateList = new ColorStateList(new int[][] {{0}}, new int[] {0xFF009900}); // 0xAARRGGBB
button.setSupportBackgroundTintList(colorStateList);

Weil button.setBackground(...) und button.getBackground().mutate().setColorFilter(...) die Schaltflächenfarbe in API 15 und 16 nicht wie in API 21 ändern.

24
Robert

Die Antwort des @ ianhanniballake ist absolut korrekt und einfach. Aber ich habe einige Tage gebraucht, um es zu verstehen. Für jemanden, der seine Antwort nicht versteht, ist hier eine detailliertere Implementierung

<Button
        Android:id="@+id/btn"
        style="@style/MaterialButton"
        ... />


<style name="MaterialButton" parent="Widget.AppCompat.Button.Colored">
    <item name="Android:theme">@style/Theme.MaterialButton</item>
   ...
</style>


<style name="Theme.MaterialButton" parent="YourTheme">
    <item name="colorAccent">@color/yourAccentColor</item>
    <item name="colorButtonNormal">@color/yourButtonNormalColor</item>
</style>

=== Oder ===

<Button
        Android:id="@+id/btn"
        style="@style/Widget.AppCompat.Button.Colored"
        Android:theme="@style/Theme.MaterialButton" />

<style name="Theme.MaterialButton" parent="YourTheme">
    <item name="colorAccent">@color/yourAccentColor</item>
    <item name="colorButtonNormal">@color/yourButtonNormalColor</item>
</style>
20
Frank Nguyen

Ich habe die Hintergrundfarbe und den Vordergrund verwendet:

<Button
    Android:layout_width="match_parent"
    Android:layout_height="40dp"
    Android:backgroundTint="@color/colorAccent"
    Android:foreground="?android:attr/selectableItemBackground"
    Android:textColor="@Android:color/white"
    Android:textSize="10sp"/>
13
SpyZip

Wenn Sie sich für ImageButton interessieren, können Sie Folgendes versuchen:

<ImageButton
    Android:layout_width="wrap_content"
    Android:layout_height="wrap_content"
    Android:src="@Android:drawable/ic_button"
    Android:background="?attr/selectableItemBackgroundBorderless"
/>
6

Ich bin zu diesem Beitrag gekommen, um nach einer Möglichkeit zu suchen, eine Hintergrundfarbe meines ListView-Elements zu erhalten, aber die Welligkeit zu behalten.

Ich habe einfach meine Farbe als Hintergrund und das selectableItemBackground als Vordergrund hinzugefügt:

<style name="my_list_item">
    <item name="Android:background">@color/white</item>
    <item name="Android:foreground">?attr/selectableItemBackground</item>
    <item name="Android:layout_height">@dimen/my_list_item_height</item>
</style>

und es funktioniert wie ein Zauber. Ich denke, die gleiche Technik könnte auch für Knöpfe verwendet werden. Viel Glück :)

6
Joakim

Verwenden Sie backgroundTint anstelle von background

5
shem

v22.1 von appcompat-v7 führte einige neue Möglichkeiten ein. Es ist jetzt möglich, ein bestimmtes Thema nur einer Ansicht zuzuordnen.

Veraltete Verwendung der App: Design für die Symbolleiste. Sie können jetzt .__ verwenden. Android: Design für Symbolleisten auf allen API Level 7 und höheren Geräten sowie Android: Theme-Unterstützung für alle Widgets auf API-Ebene 11 und höher Geräte.

Anstatt die gewünschte Farbe in einem globalen Design festzulegen, erstellen wir eine neue und weisen sie nur der Variablen Button zu.

Beispiel:

<style name="MyColorButton" parent="Theme.AppCompat.Light.DarkActionBar">
        <item name="colorButtonNormal">@color/myColor</item>
</style>

Und verwenden Sie diesen Stil als Thema Ihrer Button

<Button
 style="?android:attr/buttonStyleSmall"
 Android:layout_width="fill_parent"
 Android:layout_height="wrap_content"
 Android:text="Button1"
 Android:theme="@style/MyColorButton"/>
5
Bhargav Pandit

Wenn Sie mit der Verwendung einer Drittanbieter-Bibliothek in Ordnung sind, überprüfen Sie traex/RippleEffect . Sie können mit wenigen Zeilen Code einen Ripple-Effekt zu ANY hinzufügen. Sie müssen nur das Element, das Sie mit einem com.andexert.library.RippleView-Container erzeugen möchten, in Ihre XML-Layoutdatei einschließen. 

Als zusätzlicher Bonus ist Min SDK 9 erforderlich, damit Sie die Design-Versionen aller Betriebssystemversionen beibehalten können.

Hier ein Beispiel aus dem GitHub-Repo der Bibliotheken:

<com.andexert.library.RippleView
    Android:layout_width="wrap_content"
    Android:layout_height="wrap_content"
    app:rv_centered="true">

    <ImageView
        Android:layout_width="100dp"
        Android:layout_height="100dp"
        Android:src="@Android:drawable/ic_menu_edit"
        Android:background="@Android:color/holo_blue_dark"/> 

</com.andexert.library.RippleView>

Sie können die Farbe der Wellenform ändern, indem Sie dieses Attribut dem RippleView-Element hinzufügen: app:rv_color="@color/my_fancy_ripple_color

3
guy.gc
<Android.support.v7.widget.AppCompatButton
    Android:layout_width="wrap_content"
    Android:layout_height="wrap_content"
    app:backgroundTint="#fff"
    Android:textColor="#000"
    Android:text="test"/>

Benutzen 

xmlns:app="http://schemas.Android.com/apk/res-auto"

und die Farbe wird auf Pre-Lolipop akzeptiert

3
André Bäuml

Es gibt zwei Ansätze, die in dem großartigen Tutorial von Alex Lockwood erläutert werden: http://www.androiddesignpatterns.com/2016/08/coloring-buttons-with-themeoverlays-background-tints.html :

Ansatz Nr. 1: Ändern der Hintergrundfarbe der Schaltfläche mit ThemeOverlay

<!-- res/values/themes.xml -->
<style name="RedButtonLightTheme" parent="ThemeOverlay.AppCompat.Light">
    <item name="colorAccent">@color/googred500</item>
</style>

<Button
    style="@style/Widget.AppCompat.Button.Colored"
    Android:layout_width="wrap_content"
    Android:layout_height="wrap_content"
    Android:theme="@style/RedButtonLightTheme"/>

Ansatz Nr. 2: Einstellen des Hintergrundfarbtons von AppCompatButton

<!-- res/color/btn_colored_background_tint.xml -->
<selector xmlns:Android="http://schemas.Android.com/apk/res/Android">

    <!-- Disabled state. -->
    <item Android:state_enabled="false"
          Android:color="?attr/colorButtonNormal"
          Android:alpha="?android:attr/disabledAlpha"/>

    <!-- Enabled state. -->
    <item Android:color="?attr/colorAccent"/>

</selector>

<Android.support.v7.widget.AppCompatButton
    Android:layout_width="wrap_content"
    Android:layout_height="wrap_content"
    app:backgroundTint="@color/btn_colored_background_tint"/>
2
makovkastar

Programmgesteuertes Anwenden der Farben:

if (Android.os.Build.VERSION.SDK_INT >= Android.os.Build.VERSION_CODES.Lollipop) {

    ColorStateList colorStateListRipple = new ColorStateList(
            new int[][] {{0}},
            new int[] {Color.WHITE} // ripple color
            );

    RippleDrawable rippleDrawable = (RippleDrawable) myButton.getBackground();
    rippleDrawable.setColor(colorStateListRipple);
    myButton.setBackground(rippleDrawable); // applying the ripple color
}

ColorStateList colorStateList = new ColorStateList(
        new int[][]{
                new int[]{Android.R.attr.state_pressed}, // when pressed
                new int[]{Android.R.attr.state_enabled}, // normal state color
                new int[]{} // normal state color
        },
        new int[]{
                Color.CYAN, // when pressed
                Color.RED, // normal state color
                Color.RED // normal state color
        }
);

ViewCompat.setBackgroundTintList(myButton, colorStateList); // applying the state colors
0
Marlon