2015-04-07 12 views
12

Sto utilizzando RecyclerView con GridLayoutManager. L'obiettivo che voglio raggiungere è quando clicco su un oggetto, si ingrandirà e si sovrapporrà agli elementi adiacenti. Proprio come l'immagine qui sotto (in Android TV) enter image description hereRidimensiona l'elemento in RecyclerView per sovrapporre 2 elementi adiacenti Android

Quando l'evento onclick viene attivato, lo chiamo

v.animate().scaleX(1.2f).scaleY(1.2f).setDuration(500).start(); 

Ma il risultato è qui sotto: enter image description here

Può sovrappone solo gli elementi che ha una posizione inferiore a se stessa.
Cosa devo fare per sovrapporre tutti gli elementi adiacenti. Grazie in anticipo.
EDIT
Ho già provato:

v.bringToFront(); 

o

(v.getParent()).bringChildToFront(v); 

Ma entrambi non funzionano.

+0

Hai risolto il problema? Ho affrontato lo stesso problema, grazie. – Xiaozou

+0

Usa 'Carousel'. È più adatto per questo requisito .. !! .. Refer: http://www.codeproject.com/Articles/146145/Android-3D-Carousel –

risposta

0

Provare a richiamare v.bringToFront() prima di eseguire l'animazione.
Se non funziona un'altra variante usa View#setElevation(float val) dove val> 0. L'inconveniente è che sarà necessario riportare l'elevazione a 0 quando si deseleziona l'elemento.

+0

Non funziona. L'ho provato già. –

+0

@HuyDuongTu Ho aggiornato la mia risposta. – aga

+0

Funziona. Ma View # setElevation (float val) richiede l'API 21. La mia applicazione supporta anche l'API 15. Ci sono altri modi per risolverlo. Grazie –

-1

È necessario farlo nel modo in cui si utilizzano i normali gruppi di vista, ignorando l'ordine di disegno dei bambini. Questo esempio costringe la prima vista a essere sempre disegnata per ultima, devi personalizzare per il tuo caso d'uso.

public TopForcingRecyclerView(Context context, AttributeSet attrs, int defStyle) { 
    super(context, attrs, defStyle); 
    setChildrenDrawingOrderEnabled(true); 
} 

@Override protected int getChildDrawingOrder(int childCount, int i) { 
    if (i >= childCount - 1) return 0; 
    //when asked for the last view to draw, answer ZERO 
    else return i + 1; 
    //when asked for the i-th view to draw, answer "the next one" 
} 

Prestare attenzione alla via da uno errori.

4

Secondo risposta di aga, uso ViewCompat.setElevation (Vedi vista, in alzato float) sostenere API prima 21, funziona come un fascino.

static class ViewHolder extends RecyclerView.ViewHolder { 

    public ViewHolder(View root) { 
    // bind views 
    // ... 

    // bind focus listener 
    root.setOnFocusChangeListener(new View.OnFocusChangeListener() { 
     @Override 
     public void onFocusChange(View v, boolean hasFocus) { 
      if (hasFocus) { 
      // run scale animation and make it bigger 

      ViewCompat.setElevation(root, 1); 
      } else { 
      // run scale animation and make it smaller 

      ViewCompat.setElevation(root, 0); 
      } 
     } 
    }); 
    } 
} 

Il file di layout articolo è molto semplice, come di seguito:

<?xml version="1.0" encoding="utf-8"?> 
<TextView 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:focusable="true" 
    android:focusableInTouchMode="true" 
    android:background="@drawable/sl_live_item" /> 
+0

Puoi condividere il tuo file di layout? Ho già usato ViewCompat.setElevation() ma non aiuta ... – anhtuannd

+1

@anhtuannd ho ri-modificato la mia risposta, vorrei che potesse aiutare. – Xiaozou

3

1.Override il metodo getChildDrawingOrder.

@Override 
protected int getChildDrawingOrder(int childCount, int i) { 
    View view = getLayoutManager().getFocusedChild(); 
    if (null == view) { 
     return super.getChildDrawingOrder(childCount, i); 
    } 
    int position = indexOfChild(view); 

    if (position < 0) { 
     return super.getChildDrawingOrder(childCount, i); 
    } 
    if (i == childCount - 1) { 
     return position; 
    } 
    if (i == position) { 
     return childCount - 1; 
    } 
    return super.getChildDrawingOrder(childCount, i); 
} 

2.RecyclerView setChildrenDrawingOrderEnabled è vero.

setChildrenDrawingOrderEnabled(true); 

3.Quando vista elementi ha il focus, invalidate suo genitore.

@Override 
public void onFocusChange(View v, boolean hasFocus) { 
    if (hasFocus) { 
     v.setScaleX(1.5f); 
     v.setScaleY(1.5f); 
     mRecyclerView.invalidate(); 
    } else { 
     v.setScaleX(1.0f); 
     v.setScaleY(1.0f); 
    } 
} 
+0

Puoi anche usare 'recyclerview.setChildDrawingOrderCallback' senza ereditare e sovrascrivere i metodi' recyclerview'. –

+0

@ramineftekhari Precisamente! – EasonX

Problemi correlati