6

Ich versuche, Touch-Feedback zu einem LinearLayout hinzuzufügen, das einem normalen Button-Feedback in API-Ebene 21 ähnelt, ähnlich wie in this Beispiel, und bisher erfolglos gewesen.Android Ripple-Effekt + Elevation auf Nicht-Button-Ansichten

<ripple xmlns:android="http://schemas.android.com/apk/res/android" 
android:color="?android:colorControlHighlight"> 

<item android:id="@android:id/mask"> 
    <shape android:shape="rectangle"> 
     <solid android:color="?android:colorAccent" /> 
    </shape> 
</item> 

und verwendet, um die StateListAnimator, dass Google bietet here:

ich eine Standard-Ripple ziehbar wie folgt definiert haben

<selector xmlns:android="http://schemas.android.com/apk/res/android"> 
<item android:state_enabled="true" android:state_pressed="true"> 
    <objectAnimator 
     android:duration="@android:integer/config_shortAnimTime" 
     android:propertyName="translationZ" 
     android:valueTo="@dimen/touch_raise" 
     android:valueType="floatType" /> 
</item> 
<item> 
    <objectAnimator 
     android:duration="@android:integer/config_shortAnimTime" 
     android:propertyName="translationZ" 
     android:valueTo="0dp" 
     android:valueType="floatType" /> 
</item> 

Nach der Definition des Animator und wellig ziehbar, ich habe sie zu meinem Li hinzugefügt nearLayout wie so:

<LinearLayout 
    android:id="@+id/linearLayout"   
    android:clickable="true" 
    android:focusable="true" 
    android:orientation="horizontal" 
    android:background="@drawable/ripple" 
    android:stateListAnimator="@anim/touch_elevation"> 

Die Idee ist, dieses Linearlayout als Schaltfläche zu verwenden, da es viel einfacher für mich ist es, verschiedene Arten von Text einzufügen und Imagepositionierung im Innern (im Gegensatz zu Taste Drawables) handhaben.

Hinzufügen der Ripple-Effekt oder die Animation separat funktioniert, solange der Hintergrund der Ansicht keine Transparenz wie this Frage hat.

Ich bin nicht sicher, ob dies ein Problem in Bezug auf die oben genannte Frage ist, aber da der Standard-Button sowohl Ripple- als auch Elevation-Animationsfeedback verwendet, kann dieser Effekt auch in anderen Ansichten erreicht werden.

Jeder Einblick in dieses Problem würde sehr geschätzt werden.

+0

verwenden Wenn Sie den Welleneffekt erwarten angewandt werden, wenn der Benutzer tippt auf 'LinearLayout', benötigen Sie ein entsprechendes' StateListDrawable' zu ​​verwenden, die nicht direkt Ihre '' verweisen. – CommonsWare

+0

Bitte erläutern Sie – Rakatan

+0

Ihr vorhandener Hintergrund sagt "zeige eine Welle sofort". Das scheint eine kuriose Wahl zu sein. Der Hintergrund eines 'Button' ist ein' StateListDrawable', um verschiedene Bilder für normal, gedrückt, deaktiviert, fokussiert usw. zu verwenden. Sie müssten dasselbe tun. – CommonsWare

Antwort

0

Beide Effekte arbeiten zusammen ohne android:id="@android:id/mask" Attribut in der Ripple-Element Element (vielleicht fügt dieses Attribut etwas Transparenz).

+0

In der Tat arbeiten beide Effekte ohne die Maske zusammen. Es ist eindeutig das gleiche Transparenzproblem. Es tut mir leid, aber ich kann deine Lösung nicht verwenden, da ich beide Effekte auf jeden Gegenstand anwenden wollte. Wenn Sie diese Lösung beispielsweise in einer CardView verwenden (wobei die Ripple der Vordergrund sein muss), wird der gesamte Inhalt der Ansicht unsichtbar. – Rakatan

0

Verwenden Sie ForegroundLinearLayout. Es erlaubt, Welligkeit oder irgendein anderes ziehbares im Vordergrund der Ansicht zu setzen. Genauso können Sie ForegroundRelativeLayout usw. erstellen (machen Sie einfach diese Klasse von RelativeLayout).

Hier ist beispielsweise mit Ihrem stateListAnimator und Ripple ziehbar:

<your.package.ForegroundLinearLayout 
    android:layout_width="300dp" 
    android:layout_height="300dp" 
    android:layout_centerInParent="true" 
    android:gravity="center" 
    android:foreground="@drawable/bg_ripple" 
    android:background="#fff" 
    android:clickable="true" 
    android:stateListAnimator="@animator/animator_elevation"> 

    <TextView 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="Hello world!"/> 

</your.package.ForegroundLinearLayout> 

Ergebnis:

enter image description here

EDIT: ForegroundLinearLayout existiert in Unterstützung Design-Bibliothek. So können Sie einfach android.support.design.internal.ForegroundLinearLayout

Verwandte Themen