2016-03-17 8 views
11

के साथ देखने के लिए मैं पक्षों पर केवल दृश्य छाया कैसे सेट कर सकता हूं मेरे पास विभिन्न दृश्य प्रकारों के साथ RecyclerView है। प्रत्येक दृश्य में शीर्ष, नीचे या गोल गोलाकारों के साथ स्वयं की पृष्ठभूमि होती है। प्रत्येक एक ही दृश्य ऊंचाई का उपयोग करें। यह XMLऊंचाई

<?xml version="1.0" encoding="utf-8"?> 
<ripple xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:color="@color/card_background_pressed" 
    tools:targetApi="lollipop"> 
    <item> 
     <shape> 
      <size 
       android:width="1dp" 
       android:height="1dp" /> 
      <solid android:color="@color/card_background_normal" /> 
     </shape> 
    </item> 
</ripple> 

जब विचार किसी भी मार्जिन यह एक ही पृष्ठभूमि होने की तरह लग रहा है बिना एक दूसरे के बगल से बाहर रखा जाता है में पृष्ठभूमि से एक है। गतिशील कार्ड पृष्ठभूमि बनाने के लिए यह मेरा तरीका है। दूसरे शब्दों में मैं, RecyclerView

समस्या

में एक से अधिक आइटम से एक की तलाश में कार्ड बना सकते हैं जब 2 बार देखा गया एक दूसरे को अपने छाया कोनों में एक दूसरे को ओवरलैप होते हैं, के बगल में बाहर रखी हैं आप नीचे देख सकते हैं , यहां तक ​​कि जब कोने पृष्ठभूमि त्रिज्या 0.

तो क्या कोई इसे ठीक करने के बारे में जानता है? मुझे केवल एपीआई 21+ के लिए परवाह है, इसलिए पुराने संस्करणों के समर्थन के बारे में चिंता करने की आवश्यकता है। अग्रिम में धन्यवाद!

enter image description here

+0

आपके अपेक्षित परिणाम क्या हैं? क्या यह कोई ओवरलैपिंग नहीं है लेकिन अभी भी छाया जुड़ा हुआ है? –

+0

@Rod_Algonquin बिल्कुल, मुझे छाया से कनेक्ट करने की आवश्यकता है, इसलिए यह एक कार्ड की तरह दिखता है –

+0

फिर छाया को प्रत्येक दृश्य पर नहीं, बल्कि रीसायकलव्यू पर सेट करें। –

उत्तर

5

मैं RippleDrawable साथ प्रयास नहीं किया है लेकिन मुझे लगता है विचार ही है। तो आइए एक साधारण मामले से शुरू करें:

एंड्रॉइड ViewOutlineProvider नामक एक कक्षा प्रदान करता है। आप अपनी कक्षा बनाने के लिए इस वर्ग का उपयोग कर सकते हैं। आपकी समस्या के लिए आप अपने निचले दृश्य की छाया के लिए ऑफ़सेट सेट कर सकते हैं ताकि ओवरलैपिंग क्षेत्र शीर्ष दृश्य की छाया से खींचा जा सके।

कुछ कोड कृपया:

सबसे पहले मैं इस लेआउट के साथ आपकी समस्या को बनाने के लिए कोशिश कर रहा हूँ:

enter image description here

:

<?xml version="1.0" encoding="utf-8"?> 
<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:fitsSystemWindows="true" 
    tools:context=".MainActivity"> 

    <android.support.design.widget.AppBarLayout 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:theme="@style/AppTheme.AppBarOverlay"> 

     <android.support.v7.widget.Toolbar 
      android:id="@+id/toolbar" 
      android:layout_width="match_parent" 
      android:layout_height="?attr/actionBarSize" 
      android:background="?attr/colorPrimary" 
      app:popupTheme="@style/AppTheme.PopupOverlay" /> 

    </android.support.design.widget.AppBarLayout> 

    <RelativeLayout 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:paddingBottom="@dimen/activity_vertical_margin" 
     android:paddingLeft="@dimen/activity_horizontal_margin" 
     android:paddingRight="@dimen/activity_horizontal_margin" 
     android:paddingTop="@dimen/activity_vertical_margin" 
     app:layout_behavior="@string/appbar_scrolling_view_behavior"> 


     <LinearLayout 
      android:layout_width="300dp" 
      android:layout_height="400dp" 
      android:layout_centerInParent="true" 
      android:orientation="vertical"> 

      <TextView 
       android:id="@+id/top" 
       android:layout_width="100dp" 
       android:layout_height="50dp" 
       android:layout_marginLeft="50dp" 
       android:layout_marginTop="50dp" 
       android:background="@android:color/holo_blue_dark" 
       android:elevation="25dp" 
       android:gravity="center" 
       android:text="Top" /> 

      <TextView 
       android:id="@+id/bottom" 
       android:layout_width="100dp" 
       android:layout_height="50dp" 
       android:layout_below="@id/top" 
       android:layout_marginLeft="50dp" 
       android:layout_marginTop="2dp" 
       android:background="@android:color/holo_orange_light" 
       android:elevation="25dp" 
       android:gravity="center" 
       android:text="Bottom" /> 
     </LinearLayout> 
    </RelativeLayout> 
</android.support.design.widget.CoordinatorLayout> 

यह ओवरलैपिंग छाया पहचान करने के लिए एक छोटे से कठिन है अब मैं इस कोड द्वारा कुछ मनमाने ढंग से वाई ऑफसेट जोड़ता हूं:

public class MainActivity extends AppCompatActivity { 

    TextView mTopTv,mBottomTv; 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 
     setSupportActionBar(toolbar); 
     mTopTv = (TextView)findViewById(R.id.top); 
     mBottomTv = (TextView)findViewById(R.id.bottom); 
     mBottomTv.setOutlineProvider(new ViewOutlineProvider() { 
      @Override 
      public void getOutline(View view, Outline outline) { 
       outline.setRect(0, 50, view.getWidth(), view.getHeight()); 
      } 
     }); 
    } 

} 

और परिणाम है:

enter image description here

दो छवियों की तुलना के रूप में यह स्पष्ट है कि अतिव्यापी क्षेत्र का सफाया कर दिया गया है।

+0

यह आशाजनक लग रहा है, आपने वाई ऑफसेट को 50 की गणना कैसे की? –

+0

मैंने इसे डेमो दिखाने के लिए मनमाने ढंग से सेट किया है, लेकिन आप ऊंचाई मान और एक फ़ंक्शन का उपयोग कर सकते हैं जो डीपी को पीएक्स में परिवर्तित करता है, ताकि आप सटीक मान निर्धारित कर सकें। –

+0

मुझे अपने मामले में छाया फिट करने के लिए शीर्ष रूपरेखा का थोड़ा सा हिस्सा निकालना पड़ा, और दृश्य को देखने से बचने के लिए, कोई 'cardView.setClipToOutline (false) सेट कर सकता था; ' – FJJ

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