Android, Einstellung der Hintergrundfarbe der Schaltfläche verliert ripple-Effekt
Nach hinzufügen von Farbe zu einem android-Schaltfläche, verliert es seine Signalwirkung, die macht dem Benutzer das Gefühl wie es ist eine ansprechende auf. Wie kann ich dieses Problem beheben? Ich habe gesucht, durch viele Lösungen, aber ich konnte nicht finden, eine bestimmte eine, die nicht mehrdeutig.
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".ClockInOutFragment">
<AnalogClock
android:id="@+id/clock"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentEnd="true"
android:layout_alignParentRight="true"
android:layout_alignParentTop="true"
android:layout_toRightOf="@+id/date_and_time"/>
<RelativeLayout
android:id="@+id/date_and_time"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="10dp">
<TextView
android:id="@+id/time_digits"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="12:10"
android:textSize="45sp"/>
<TextView
android:id="@+id/am_pm"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignBaseline="@+id/time_digits"
android:layout_toRightOf="@+id/time_digits"
android:paddingLeft="3dp"
android:text="PM"
android:textSize="20sp"/>
<TextView
android:id="@+id/date"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/time_digits"
android:text="Mon, July 11"
android:textSize="22sp"/>
</RelativeLayout>
<!--Clock in and out buttons-->
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_centerHorizontal="true"
android:orientation="horizontal">
<Button
android:id="@+id/textView3"
android:layout_width="0dp"
android:layout_height="56dp"
android:layout_weight="1"
android:background="#4CAF50"
android:gravity="center"
android:text="Clock In"
android:textAppearance="?android:attr/textAppearanceLarge"
android:textColor="#FFFFFF"/>
<!--Divider between the clock in and out button-->
<View
android:layout_width="1dp"
android:layout_height="match_parent"
android:background="#B6B6B6"/>
<Button
android:id="@+id/textView4"
android:layout_width="0dp"
android:layout_height="56dp"
android:layout_weight="1"
android:background="#FF5252"
android:gravity="center"
android:text="Clock Out"
android:textAppearance="?android:attr/textAppearanceLarge"
android:textColor="#FFFFFF"/>
</LinearLayout>
</RelativeLayout>
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie den ripple-Effekt & hintergrund-Farbe mit einer zusätzlichen Kräuselung drawable:
Ihrem layout :
ripple.xml (dies ist, wo Sie hinzufügen können, Hintergrundfarbe zusätzlich zu der ripple-Effekt) :
Eine sehr einfache und unkomplizierte Möglichkeit, dies zu tun ist, um
?attr/selectableItemBackground
zuandroid:foreground
- Attribut der Schaltfläche. Folgende xml-durchaus gültig ist und funktioniertNicht ändern, die hintergrund-Schaltfläche. Ändern Sie das Thema.
und in Ihrer xml-Datei
Oder Sie können fügen Sie es in Ihre Haupt-app Thema
Sind und brauchen keine änderung " hintergrund.
Wenn Sie möchten komplett eigenen hintergrund, die Sie benötigen, erstellen Sie Ihre Auswahl. Und Sie können es ripple-Effekt.
Verwenden Sie einfach :
Statt:
Vergessen Sie nicht, ändern Sie Ihre
Button
zuandroid.support.v7.widget.AppCompatButton
Tatsächlich, Sie können
<layer-list>
von drawables zu kombinieren ripple-Effekt mit anderen drawable. Dies ist die Universelle Lösung auch für pre-lolipop: ich habe es getestet in vielen Konfigurationen.Das problem ist nur, dass pre-lolipop stürzt ab, wenn
?selectableItemBackground
im<layer-list>
, so müssen wir LayerDrawable programmgesteuert.Eine sehr schnelle und einfache Lösung sieht so aus:
Geben Sie für Ihre Ansicht
Dann überall im code erstellen mySpecialDrawable und den trick tun:
Bitte beachten Sie, dass
.mutate()
für LayeredDrawable ist hier ein muss!Einer komplexeren Lösung könnte nützlich sein, wenn Sie bereits Ihre benutzerdefinierte Ansicht und lieber etwas verlängern seine Funktionalität und Kompatibilität als zusätzliche leere FrameLayout als Elternteil.
Innen attrs.xml setzen:
dann innerhalb deines View-Nachkomme Klasse:
Ich bevorzuge diesen Ansatz, da hat es keine Probleme wie
android:foreground
Attribut, das 23+ oder zusätzlichen overhead des umschließenden anklickbar Blick in FrameLayout.Sollten Sie Stile verwenden,
dies ist die optimale Lösung