6

Sto tentando di aggiungere un feedback tattile a un LinearLayout simile a un normale feedback di Button in livello API 21, molto simile all'esempio this e finora non riuscito.Effetto Effetto Android + Elevazione sulle viste senza pulsante

ho definito un disegnabile ondulazione standard come questo:

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

e utilizzato lo StateListAnimator che Google fornisce here:

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

Dopo aver definito l'animatore e ripple drawable, li ho aggiunti al mio Li nearLayout in questo modo:

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

L'idea è quella di utilizzare questo LinearLayout come un pulsante, in quanto è molto più semplice per me di inserire vari tipi di testo e gestire il posizionamento ImageView al suo interno (al contrario di drawable pulsante).

L'aggiunta dell'effetto di ripple o dell'animazione funziona separatamente, a condizione che lo sfondo della vista non abbia trasparenza come da domanda this.

Non sono sicuro che si tratti di un problema correlato alla domanda sopra menzionata, ma visto che il pulsante standard riesce a utilizzare sia il ripple che l'elevazione di feedback dell'animazione, immagino che ottenere questo effetto sia possibile anche su altri punti di vista.

Qualsiasi comprensione di questo problema sarebbe molto apprezzata.

+0

Se vi aspettate l'effetto a catena da applicare quando l'utente tocca sul 'LinearLayout', è necessario utilizzare un adeguato' StateListDrawable', non fa riferimento direttamente il vostro '' . – CommonsWare

+0

Prego elaborare – Rakatan

+0

Lo sfondo esistente dice "mostra immediatamente un ripple". Sembra una scelta curiosa. Lo sfondo di un 'Button' è un' StateListDrawable', per usare immagini diverse per normale, premuto, disabilitato, focalizzato, ecc. Avresti bisogno di fare la stessa cosa. – CommonsWare

risposta

0

Entrambi gli effetti funzionano insieme senza l'attributo android:id="@android:id/mask" nell'elemento elemento di ripple (forse questo attributo aggiunge trasparenza).

+0

In effetti entrambi gli effetti funzionano insieme senza la maschera. È quindi chiaramente lo stesso problema di trasparenza. Mi dispiace ma non posso usare la tua soluzione, poiché stavo cercando di applicare entrambi gli effetti su qualsiasi oggetto. Ad esempio, utilizzando questa soluzione su CardView (dove il ripple deve essere in primo piano), rende invisibile l'intero contenuto della vista. – Rakatan

0

Utilizzare ForegroundLinearLayout. Permette di mettere il ripple o qualsiasi altro drawable in primo piano della vista. Allo stesso modo è possibile creare ForegroundRelativeLayout ecc. (Basta estendere questa classe da RelativeLayout).

Ecco ad esempio con il stateListAnimator e ondulazione disegnabile:

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

Risultato:

enter image description here

EDIT: ForegroundLinearLayout esiste in libreria di progettazione di supporto. Quindi, si può semplicemente utilizzare android.support.design.internal.ForegroundLinearLayout