2015-04-07 5 views
12

Ich benutze RecyclerView mit GridLayoutManager. Das Ziel, das ich erreichen möchte, ist, wenn ich auf einen Gegenstand klicke, wird er vergrößert und überlappt die benachbarten Gegenstände. Genau wie das Bild unten (in Android TV) enter image description hereScale up Element in RecyclerView zu überlappt 2 benachbarte Elemente Android

Wenn das OnClick-Ereignis ausgelöst wird, nenne ich

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

Aber das Ergebnis ist unter: enter image description here

Es kann nur Elemente überlappt, dass hat eine Position niedriger als er selbst.
Was soll ich tun, um alle benachbarten Elemente zu überlappen. Danke im Voraus.
EDIT
ich schon versucht:

v.bringToFront(); 

oder

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

Aber beide nicht funktionieren.

+0

Haben Sie das Problem gelöst? Ich hatte das gleiche Problem, thx. – Xiaozou

+0

Verwenden Sie 'Karussell'. Es ist am besten geeignet für diese Anforderung .. !! .. Siehe: http://www.codeproject.com/Articles/146145/Android-3D-Carousel –

Antwort

0

Versuchen Sie, vor dem Ausführen der Animation v.bringToFront() aufzurufen.
Wenn es nicht funktioniert, ist eine andere Variante View#setElevation(float val) mit val> 0 zu verwenden. Der Nachteil ist, dass Sie die Höhe wieder auf 0 setzen müssen, wenn Sie das Element abwählen.

+0

Es funktioniert nicht. Ich habe es schon versucht. –

+0

@HuyDuongTu Ich habe meine Antwort aktualisiert. – aga

+0

Es funktioniert. Aber View # setElevation (float val) benötigt API 21. Meine Anwendung unterstützt auch API 15. Gibt es andere Möglichkeiten, es zu lösen. Danke –

-1

Sie müssen es wie gewohnt mit normalen ViewGroups durchführen und die Zeichenreihenfolge der untergeordneten Elemente überschreiben. In diesem Beispiel wird die erste Ansicht immer als letzte gezeichnet - Sie müssen sie für Ihren Anwendungsfall anpassen.

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

Achten Sie auf off durch einen Fehler.

4

aga der Antwort Laut, ich benutze ViewCompat.setElevation (Ansicht Ansicht, float Höhe) API bis 21 vor zu unterstützen, funktioniert es wie ein charmant.

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); 
      } 
     } 
    }); 
    } 
} 

Der Artikel Layout-Datei ist sehr einfach wie folgt:

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

Können Sie Ihre Layoutdatei teilen? Ich habe ViewCompat.setElevation() bereits verwendet, aber es hilft nicht ... – anhtuannd

+1

@anhtuannd Ich habe meine Antwort neu bearbeitet, ich wünschte, sie könnte helfen. – Xiaozou

3

1.Override die getChildDrawingOrder Methode.

@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 setChildrenDrawingOrderEnabledwahr ist.

setChildrenDrawingOrderEnabled(true); 

3.When Artikel Ansicht Fokus hat, Invalidier seine Eltern.

@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

Sie können auch 'recyclerview.setChildDrawingOrderCallback' verwenden, ohne' recycleview'-Methoden zu erben und zu überschreiben. –

+0

@ramineftekhari Genau! – EasonX

Verwandte Themen