it-swarm.com.de

Wie kann ich die Wellenfarbe ändern, wenn? Attr/selectableItemBackground als Hintergrund verwendet wird?

Ich habe einige SO -Fragen gesehen und sie haben einige mögliche Methoden angegeben, um das zu erreichen, was ich will. Zum Beispiel:

  1. 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.

  2. 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!

70
ywwynm

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-v21ordner:

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

103
ywwynm

Welligkeitseffekt auf Pre- und Lollipop + -Geräten

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

  1. 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>
    
  2. 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"
        />

Unterschiedliche Welligkeitsfarben für verschiedene Fragmente in derselben Aktivität?

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


Unterschiedliche Welligkeit für unterschiedliche Ansichten? (Lutscher +)

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.

44
Kirill Karmazin

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 *

5
harrane

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.

0
Mika

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" />
0
Mahdi Khansari

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" />
0
OmiK

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"
0
Titto Jose