2015-04-07 21 views
12

मैं GridLayoutManager के साथ RecyclerView का उपयोग कर रहा हूं। जिस लक्ष्य को मैं प्राप्त करना चाहता हूं वह तब होता है जब मैं किसी आइटम पर क्लिक करता हूं, यह आसन्न वस्तुओं को स्केल और ओवरलैप करेगा। बस नीचे दिए गए चित्र (एंड्रॉयड टीवी में) enter image description hereरीसाइक्लिंग में आइटम को स्केल करें देखें 2 आसन्न वस्तुओं को ओवरलैप करने के लिए देखें

जब onClick ईवेंट शुरू हो रहा है, मैं

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

फोन लेकिन परिणाम के नीचे है की तरह: enter image description here

यह केवल आइटम overlaps सकते हैं कि अपने आप से कम स्थिति है।
सभी आसन्न वस्तुओं को ओवरलैप करने के लिए मुझे क्या करना चाहिए। अग्रिम में धन्यवाद।
संपादित
मैं पहले से ही करने की कोशिश की:

v.bringToFront(); 

या

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

लेकिन उन दोनों के काम नहीं करते।

+0

क्या आपने समस्या हल की है? मुझे एक ही समस्या का सामना करना पड़ा, thx। – Xiaozou

+0

'कैरोसेल' का प्रयोग करें। यह इस आवश्यकता के लिए सबसे उपयुक्त है .. !! .. देखें: http://www.codeproject.com/Articles/146145/Android-3D-Carousel –

उत्तर

0

एनीमेशन चलाने से पहले v.bringToFront() को आमंत्रित करने का प्रयास करें।
यदि यह कोई अन्य संस्करण काम नहीं करता है तो View#setElevation(float val) का उपयोग करना है जहां वैल> 0. दोष यह है कि जब आप आइटम को अचयनित करते हैं तो आपको ऊंचाई को 0 पर सेट करने की आवश्यकता होगी।

+0

यह काम नहीं करता है। मैंने इसे पहले से ही कोशिश की। –

+0

@HuyDuongTu मैंने अपना जवाब अपडेट कर दिया है। – aga

+0

यह काम करता है। लेकिन देखें # सेट एलिवेशन (फ्लोट वैल) को एपीआई 21 की आवश्यकता है। मेरा एप्लिकेशन एपीआई 15 का भी समर्थन करता है। क्या इसे हल करने के अन्य तरीके हैं। धन्यवाद –

-1

आपको सामान्य व्यू ग्रुप के साथ पुराने तरीके से करना होगा, बच्चों के ड्रा ऑर्डर को ओवरराइड करना होगा। यह उदाहरण हमेशा अंतिम बार खींचे जाने के लिए पहले दृश्य को मजबूर करता है - आपको अपने उपयोग के मामले के लिए अनुकूलित करना होगा।

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

एक त्रुटियों से दूर ध्यान देना।

4

अनुसार आगा के जवाब है, मैं ViewCompat.setElevation (देखें देखने के लिए, नाव ऊंचाई) का उपयोग 21 से पहले एपीआई का समर्थन करने के, यह एक आकर्षक की तरह काम करता है।

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

आइटम लेआउट फ़ाइल नीचे की तरह बहुत सरल है:

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

क्या आप अपनी लेआउट फाइल साझा कर सकते हैं? मैंने पहले से ही ViewCompat.setElevation() का उपयोग किया है, लेकिन यह मदद नहीं करता है ... – anhtuannd

+1

@anhtuannd मैंने अपना जवाब फिर से संपादित किया, इच्छा है कि इससे मदद मिल सके। – Xiaozou

3

1.Override 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सच है।

setChildrenDrawingOrderEnabled(true); 

3. जब आइटम दृश्य ध्यान देते हैं, रद्द अपनी मूल है।

@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

आप 'recyclerview.setChildDrawingOrderCallback' का उपयोग बिना उत्तराधिकारी के' रीसाइक्लिंगव्यू 'विधियों के ओवरराइड कर सकते हैं। –

+0

@ramineftekhari निश्चित रूप से! – EasonX

संबंधित मुद्दे