Ich habe einige SO -Fragen gesehen und sie haben einige mögliche Methoden angegeben, um das zu erreichen, was ich will. Zum Beispiel:
Verwenden Sie das Attribut colorControlHighlight
in styles.xml.
Hier ist meine styles-v21.xml:
<style name="SelectableItemBackground">
<item name="Android:colorControlHighlight">#5677FC</item>
<item name="Android:background">?attr/selectableItemBackground</item>
</style>
Und mein Widget:
<TextView
Android:id="@+id/tv_take_photo_as_bt"
Android:layout_width="280dp"
Android:layout_height="48dp"
Android:text="@string/act_take_photo"
style="@style/SelectableItemBackground"/>
Und es geht nicht. Ich habe auch versucht, parent="Theme.AppCompat
zum Stil "SelectableItemBackground" hinzuzufügen, zu colorControlHighlight(no Android: prefix)"
zu wechseln oder zu ?android:attr/selectableItemBackground
zu wechseln. Beides ist nicht hilfreich.
Verwenden Sie das backgroundTint
-Attribut im Layout.
Also füge ich Android:backgroundTint="#5677FC"
meiner TextView
hinzu. Immer noch nutzlos. Dann habe ich versucht, Android:backgroundTintMode
in src_in
und src_atop
zu ändern, und sie machen keinen Unterschied.
Wie kann ich die Wellenfarbe ändern, wenn ich ?attr/selectableItemBackground
als Hintergrund verwende? Ich konzentriere mich nur auf Lollipop und darüber. Danke im Voraus!
Schließlich finde ich die Lösung: Anstatt Android:colorControlHighlight
direkt in SelectableItemBackground
zu verwenden, sollte ich einen anderen Stil schreiben:
<style name="SelectableItemTheme">
<item name="colorControlHighlight">@color/ripple_color</item>
</style>
Dann:
<style name="SelectableItemBackground">
<item name="Android:theme">@style/SelectableItemTheme</item>
<item name="Android:background">?attr/selectableItemBackground</item>
</style>
Fügen Sie schließlich style="@style/SelectableItemBackground"
zu View
in layout.xml hinzu.
AKTUALISIERT AM 2016/8/26 Nach der Veröffentlichung von N habe ich festgestellt, dass wir diese Methode manchmal nicht verwenden können, um die Farbe für einige Arten von View
(z. B. CardView
) festzulegen. Jetzt empfehle ich Entwicklern, die RippleDrawable
verwenden, die auch in XML deklariert werden können. Hier ist ein Beispiel:
Ich möchte einen Ripple-Effekt zeigen, wenn der Benutzer eine CardView
oberhalb von API21 anklickt/anklickt, und natürlich sollte vor Lollipop eine andere Art von Rückmeldung erfolgen. Also sollte ich schreiben:
<Android.support.v7.widget.CardView
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:foreground="@drawable/selectable_item_background"/>
und selectable_item_background
im drawable
-Ordner:
<selector xmlns:Android="http://schemas.Android.com/apk/res/Android">
<item Android:state_pressed="false" Android:drawable="@Android:color/transparent" />
<item Android:drawable="@color/color_clicked" />
</selector>
selectable_item_background
indrawable-v21
ordner:
<selector xmlns:Android="http://schemas.Android.com/apk/res/Android">
<item Android:drawable="@drawable/ripple_black" />
</selector>
schließlich der ripple_black
im drawable
(oder drawable-v21
) Ordner:
<ripple
xmlns:Android="http://schemas.Android.com/apk/res/Android"
xmlns:tools="http://schemas.Android.com/tools"
Android:color="@color/color_clicked"
tools:ignore="NewApi" /> <!--you can remove this line if it's in v21 folder-->
Das ist es. Für andere Ansichten sollten Sie vielleicht Android:background="@drawable/selectable_item_background"
verwenden. Vergessen Sie nicht, OnClickListener
, OnTouchListener
oder etwas Ähnliches für sie einzustellen, sonst wird die Welligkeit nicht angezeigt.
harrane und Liuting haben recht. Die akzeptierte Antwort ist nicht der beste Weg . Lassen Sie mich im Code zeigen, wie die Wellenfarbe für pre-Lollipop-Versionen und höher geändert wird
Ihre AppTheme sollte von jedem AppCompat-Design erben und das colorControlHighlight-Attribut enthalten (ohne "Android:").
<!-- Application theme. -->
<style name="AppTheme" parent="@style/Theme.AppCompat.Light.NoActionBar">
<item name="colorControlHighlight">#40ffffff</item>
</style>
Ihre Ansicht sollte clickable = "true" enthalten (oder einen Klick-Listener programmgesteuert festlegen) und der Hintergrund sollte "? Attr/selectableItemBackgroundBorderless" oder "? Attr/selectableItemBackground" sein:
<LinearLayout
...
Android:clickable="true"
Android:background="?attr/selectableItemBackgroundBorderless"/>
Hinweis: Wenn Ihre übergeordnete Ansicht einen weißen Hintergrund hat, wird der Welleneffekt nicht sichtbar, da er weiß ist. Ändern Sie den colorControlHighlight-Wert für eine andere Farbe
Wenn Sie unterschiedliche Ripple-Farben für verschiedene Aktivitäten wünschen, können Sie für jede Aktivität in der Manifest-Datei ein persönliches Thema festlegen. Beispiel:
<activity
Android:name="com.myapp.GalleryActivity"
Android:theme="@style/RedRippleTheme"
/>
Sie können die Attribute des Aktivitätsdesigns für jedes Fragment zur Laufzeit ändern. Überschreiben Sie sie einfach, bevor das Fragment mit Ihrem benutzerdefinierten Stil aufgeblasen wurde, und wenden Sie es auf ein aktuelles Design an:
in values / styles.xml
<style name="colorControlHighlight_blue">
<item name="colorControlHighlight">@color/main_blue_alpha26</item>
</style>
Dann in Ihrem Fragment vor der Inflation in onCreateView()
:
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
getContext().getTheme().applyStyle(R.style.colorControlHighlight_blue, true); //blue ripple color
View view = inflater.inflate(R.layout.my_fragment_layout, container, false);
return view;
}
Dieser Stil funktioniert nur für dieses Fragment
Sie können die Farbe für jede Ansicht separat ändern. Verwenden Sie das Attribut colorControlHighlight
. Funktioniert nicht, wenn Sie sie direkt auf eine Ansicht anwenden:
<TextView
...
colorControlHighlight="#40ffffff"/> <!-- DOESN'T WORK -->
sie sollten es als Thema anwenden:
<TextView
...
Android:theme="@style/colorControlHighlight_blue"/>
P.S. Manchmal hilft dieser Ansatz auch, wenn Sie unbekannte Probleme mit der Welligkeit haben und nicht herausfinden können. In meinem Fall habe ich Gleitlibs von Drittanbietern verwendet, die die Ripple-Effekte für das gesamte Layout durcheinander gebracht haben und dieses Thema explizit zu allen klickbaren Ansichten hinzugefügt haben, die für mich ausgearbeitet wurden.
Die akzeptierte Antwort ist falsch.
Der richtige Weg ist das, was Liuting im Kommentar erwähnt hat. Verwenden Sie colorControlHighlight
anstelle von Android:colorControlHighlight
, um die Standardeinstellung colorControlHighlight
von AppCompat
zu ändern
* Bitte beziehen Sie sich auf http://Android-developers.blogspot.co.uk/2014/10/appcompat-v21-material-design-for-pre.html im Theming-Bereich *
Dieser Code funktioniert für mich, um eine Welligkeit zu erzeugen:
public static void setRippleDrawable(View view, int normalColor, int touchColor) {
try {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Lollipop) {
RippleDrawable rippleDrawable = new RippleDrawable(ColorStateList.valueOf(touchColor), view.getBackground(), null);
view.setBackground(rippleDrawable);
} else {
StateListDrawable stateListDrawable = new StateListDrawable();
stateListDrawable.addState(new int[]{Android.R.attr.state_pressed}, new ColorDrawable(touchColor));
stateListDrawable.addState(new int[]{Android.R.attr.state_focused}, new ColorDrawable(touchColor));
stateListDrawable.addState(new int[]{}, new ColorDrawable(normalColor));
view.setBackground(stateListDrawable);
}
} catch (Exception e) {
Log.e(LOG_TAG, "" + e);
}
}
Ich habe keine Möglichkeit gefunden, das selectableItemBackground-Attribut zu ändern. Deshalb habe ich es oben so gemacht.
Es zeigt einen Welleneffekt mit Farbe auf API +21 und einen einfachen grauen Hintergrund auf Druck für API -21 .
<style name="AppTheme.MyRipple">
<item name="colorControlHighlight">@color/your_color</item>
<item name="Android:background">?selectableItemBackgroundBorderless</item>
</style>
Und stell es auf die Ansicht:
<Button
...
Android:theme="@style/AppTheme.MyRipple" />
Versuchen Sie in der dunkelschwarzen Theme (oder einer anderen) App, wie unten beschrieben, zuerst ripple_effect.xml
im drawable
-Ordner zu erstellen und fügen Sie Code wie hinzu
<?xml version="1.0" encoding="utf-8"?>
<ripple xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:color="#f5f5f5">
<item Android:id="@Android:id/mask">
<shape Android:shape="rectangle">
<solid Android:color="#f5f5f5" />
</shape>
</item>
</ripple>
stellen Sie dann den Hintergrund für Ihre Ansicht Beliebig wie Linear layout, Button, TextView
usw. ein.
<TextView
Android:id="@+id/tvApply"
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:background="@drawable/ripple_effect"
Android:clickable="true"
Android:text="APPLY"
Android:textColor="#FFFFFF"
Android:gravity="center"
Android:textSize="@dimen/_8sdp"
Android:padding="@dimen/_8sdp"
Android:focusable="true" />
Verwenden Sie das Vordergrundattribut als selectableItemBackground Und Hintergrundattribut als gewünschte Farbe.
Android:foreground="?attr/selectableItemBackground"
Android:layout_height="wrap_content"
Android:layout_width="match_parent"
Android:background="@color/white"