Android "उन्नयन" एक छाया नहीं दिखा रहा है


273

मेरे पास एक सूची दृश्य है, और प्रत्येक सूची आइटम के साथ मैं चाहता हूं कि इसके नीचे एक छाया दिखाई दे। मैं दृश्य पर एक Z सेट करने के लिए Android लॉलीपॉप की नई ऊंचाई सुविधा का उपयोग कर रहा हूं जिसे मैं एक छाया डालना चाहता हूं, और पहले से ही एक्शनबार (तकनीकी रूप से लॉलीपॉप में एक टूलबार) के साथ प्रभावी ढंग से कर रहा हूं। मैं लॉलीपॉप की ऊंचाई का उपयोग कर रहा हूं, लेकिन किसी कारण से यह सूची मदों के तहत छाया नहीं दिखा रहा है। यहां बताया गया है कि प्रत्येक सूची आइटम का लेआउट कैसे सेट किया गया है:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:orientation="vertical"
    style="@style/block"
    android:gravity="center"
    android:layout_gravity="center"
    android:background="@color/lightgray"
    >

    <RelativeLayout
        android:layout_width="300dp"
        android:layout_height="300dp"
        android:layout_marginLeft="40dp"
        android:layout_marginRight="40dp"
        android:layout_marginTop="20dp"
        android:layout_marginBottom="20dp"
        android:elevation="30dp"
        >

        <ImageView
            android:id="@+id/documentImageView"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:scaleType="centerCrop" />

        <LinearLayout
            android:orientation="vertical"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:background="@color/alphared"
            android:layout_alignParentBottom="true" >

            <appuccino.simplyscan.Extra.CustomTextView
                android:id="@+id/documentName"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:textColor="@color/white"
                app:typeface="light"
                android:paddingLeft="16dp"
                android:paddingTop="8dp"
                android:paddingBottom="4dp"
                android:singleLine="true"
                android:text="New Document"
                android:textSize="27sp"/>

            <appuccino.simplyscan.Extra.CustomTextView
                android:id="@+id/documentPageCount"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:textColor="@color/white"
                app:typeface="italic"
                android:paddingLeft="16dp"
                android:layout_marginBottom="16dp"
                android:text="1 page"
                android:textSize="20sp"/>

        </LinearLayout>

    </RelativeLayout>

</RelativeLayout>

हालांकि, यहां बताया गया है कि यह बिना छाया के सूची आइटम को कैसे दिखाता है: यहां छवि विवरण दर्ज करें

मैंने भी कोई फायदा नहीं हुआ:

  1. पैरेंट लेआउट के बजाय खुद ImageView और TextViews के लिए ऊंचाई सेट करें।
  2. ImageView के लिए एक पृष्ठभूमि लागू।
  3. उत्थान के स्थान पर TranslZ का उपयोग किया।

मैंने आपके लेआउट (बिना किसी पूर्वावलोकन के) की कोशिश की और अपने फोन में छाया दिखाया, क्या आप एक न्यूनतम परियोजना साझा कर सकते हैं जो इस मुद्दे को पुन: पेश करता है?
rnrneverdies


संबंधित प्रश्न: stackoverflow.com/questions/26572048/…
stefan222

जवाबों:


383

मैं थोड़ी देर के लिए लॉलीपॉप पर छाया के साथ खेल रहा हूं और यही मैंने पाया है:

  1. ऐसा प्रतीत होता है कि किसी माता-पिता ViewGroupने किसी कारणवश अपने बच्चों की छाया काट दी; तथा
  2. छाया के साथ सेट की सीमा से android:elevationकटऑफ है View, मार्जिन के माध्यम से विस्तारित सीमाएं नहीं;
  3. छाया दिखाने के लिए बच्चे को देखने का सही तरीका android:clipToPadding="false"यह है कि माता- पिता पर पैडिंग और उस पैरेंट पर सेट किया जाए।

यहाँ मेरा सुझाव है जो मैं जानता हूँ कि तुम पर आधारित है:

  1. अपने शीर्ष-स्तर RelativeLayoutको निर्धारित करें कि आपके द्वारा सापेक्ष लेआउट पर सेट किए गए मार्जिन के बराबर पैडिंग है जो आप छाया दिखाना चाहते हैं;
  2. android:clipToPadding="false"उसी पर सेट RelativeLayout;
  3. उस मार्जिन को हटा दें, RelativeLayoutजिसमें ऊंचाई सेट है;
  4. [संपादित करें] आपको बाल लेआउट पर एक गैर-पारदर्शी पृष्ठभूमि रंग सेट करने की आवश्यकता हो सकती है जिसे ऊंचाई की आवश्यकता है।

दिन के अंत में, आपके शीर्ष-स्तरीय सापेक्ष लेआउट को इस तरह दिखना चाहिए:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    style="@style/block"
    android:gravity="center"
    android:layout_gravity="center"
    android:background="@color/lightgray"
    android:paddingLeft="40dp"
    android:paddingRight="40dp"
    android:paddingTop="20dp"
    android:paddingBottom="20dp"
    android:clipToPadding="false"
    >

आंतरिक सापेक्ष लेआउट इस तरह दिखना चाहिए:

<RelativeLayout
    android:layout_width="300dp"
    android:layout_height="300dp"
    android:background="[some non-transparent color]"
    android:elevation="30dp"
    >

8
इसके लिए धन्यवाद! मुझे Android भी मिली: जब माता-पिता रिश्तेदार लेआउट में लागू होते हैं, तो क्लिपचाइल्ड = "झूठा" उपयोगी हो सकता है।
बलाफ़ी

1
ख़ुशी @blaffie की मदद करने के लिए!
जस्टिन पोलार्ड

214
यह इतना कष्टप्रद है कि Google इस तरह के घटिया कोड का उत्पादन करता है। हमें इन फ्रेमवर्क बग्स के लिए सालों तक हिसाब देना होगा।
मिगेल

8
Google केवल यह कहता है (अफसोस): " छाया को उन्नत दृश्य के माता-पिता द्वारा खींचा जाता है, और इस प्रकार मानक दृश्य कतरन के अधीन है, डिफ़ॉल्ट रूप से माता-पिता द्वारा क्लिप किया गया है। "
जॉन

5
मेरे मामले में यह पारदर्शी रंग था। ठीक है, पारदर्शी चीजें छाया नहीं
डालती हैं

285

यदि आपके पास कोई पृष्ठभूमि नहीं है, तो यह रेखा आपकी मदद करेगी

android:outlineProvider="bounds"

डिफ़ॉल्ट छाया दृश्य की पृष्ठभूमि से निर्धारित होती है, इसलिए यदि कोई पृष्ठभूमि नहीं है, तो छाया भी नहीं होगी।


11
क्या अजीब बात है, पूर्वावलोकन ने ऊंचाई दिखाई लेकिन असली डिवाइस नहीं था। धन्यवाद, इस मुद्दे को तय किया।
इयाने शरवद्ज

एपीआई स्तर 21 और उच्चतर के लिए काम करता है
पेंटलिस इरोनिमाकिस

10
मेरे लिए इस तरह का काम किया, लेकिन एक टेक्स्टव्यू के लिए लागू होने पर पक्षों पर एक विकर्ण सीमा दी। पृष्ठभूमि को एक रंग में सेट करना (माता-पिता की पृष्ठभूमि के रंग के समान) ने बेहतर काम किया।
गबर

4
यह भी लागू होता है यदि आपकी पृष्ठभूमि कस्टम है और कोई नहीं है <solid>
डेविड लॉर्ड

यह रिवर्स में इस्तेमाल किया जा सकता है। जब आप ऊंचाई के साथ एक गैर-पारदर्शी पृष्ठभूमि चाहते हैं और छाया नहीं चाहते हैं। बस इसे करने के लिए सेट करें none। धन्यवाद!
ओडीस

101

जाहिरा तौर पर, आप सिर्फ एक दृश्य पर एक ऊंचाई निर्धारित नहीं कर सकते हैं और यह दिखाई दिया है। आपको एक पृष्ठभूमि निर्दिष्ट करने की भी आवश्यकता है।

निम्नलिखित पंक्तियाँ मेरे रेखीय लयआउट में जोड़ी गयीं और अंत में एक छाया दिखाई दी:

android:background="@android:color/white"
android:elevation="10dp"

यह अप्रत्याशित था। मैंने src के साथ ImageView सेट किया है और समाधान की तलाश कर रहा था। धन्यवाद।
एंड्रयू ग्रो

47

एक अन्य बात जो आपको पता होनी चाहिए, यदि आपके पास यह रेखा है, तो यह नहीं दिखाई देगा:

एंड्रॉयड: hardwareAccelerated = "false"

मैंने सभी सुझाए गए सामान की कोशिश की, लेकिन यह केवल मेरे लिए काम किया जब मैंने लाइन को हटा दिया, तो इसका कारण यह था कि मेरे पास लाइन थी क्योंकि मेरा ऐप कई बिटमैप छवियों के साथ काम करता है और वे ऐप को क्रैश करने का कारण बन रहे थे।


1
यह समस्या को हल नहीं करता है, यदि आपको उस ध्वज को प्रस्तुत करने की आवश्यकता है।
क्लाइव जेफरीज

धन्यवाद!! मैंने AppBar को ऊंचा करने की कोशिश में एक दिन बिताया और जब मैंने इस गतिविधि के ध्वज के प्रकटीकरण की जांच की तो पाया
ir2pid

1
मैंने सभी संभव समाधानों की कोशिश की, लेकिन मेरे लिए कोई भी काम नहीं किया। इस समाधान ने काम किया। धन्यवाद। इसके android:clipToPadding="false"समाधान की भी जरूरत है ।
चिराग सवसानी

29

यदि आपके पास कोई पृष्ठभूमि नहीं है, तो यह रेखा आपकी मदद करेगी

android:outlineProvider="bounds"

यदि आपके पास पृष्ठभूमि के साथ एक दृश्य है तो यह रेखा आपकी मदद करेगी

android:outlineProvider="paddedBounds"

6
यह समाधान एकमात्र है जो मेरे लिए काम करता है। धन्यवाद
ओलेह लिस्कोविच

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

android:outlineProvider="paddedBounds"इस लाइन ने मेरे लिए काम किया। मैंने चयनकर्ता को ड्रा करने योग्य सेट किया।
चिराग सवाणी

1
जब मैंने इसका उपयोग किया, तो छाया बाहर की बजाय दृश्य के अंदर पूरी तरह से खींची जाती है, जो कि मैं नहीं चाहता।
androidguy


12

उह, यह पता लगाने की कोशिश में सिर्फ एक घंटा लगा। मेरे मामले में मेरे पास एक पृष्ठभूमि सेट था, हालांकि यह एक रंग के लिए सेट था। यह पर्याप्त नहीं है, आपको एक सेट करने योग्य दृश्य के लिए पृष्ठभूमि की आवश्यकता है।

उदा। इसमें छाया नहीं होगी:

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="165dp"
    android:background="@color/ight_grey"
    android:elevation="20dp"
    android:orientation="vertical"
    />

लेकिन यह होगा

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="165dp"
    android:background="@drawable/selector_grey"
    android:elevation="20dp"
    android:orientation="vertical"
    />

संपादित करें: यह भी पता चला है कि यदि आप एक पृष्ठभूमि के रूप में चयनकर्ता का उपयोग करते हैं, यदि आपके पास कोने सेट नहीं है, तो पूर्वावलोकन विंडो में छाया दिखाई नहीं देगी लेकिन यह डिवाइस पर दिखाई देगी

उदाहरण के लिए यह पूर्वावलोकन में छाया नहीं है:

<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item>
        <shape android:shape="rectangle">
            <solid android:color="@color/white" />
            <stroke
                android:width="1dp"
                android:color="@color/grey"/>
        </shape>
    </item>
</selector>

लेकिन यह करता है:

<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item>
        <shape android:shape="rectangle">
            <solid android:color="@color/white" />
            <corners android:radius="1dp" />
            <stroke
                android:width="1dp"
                android:color="@color/grey"/>
        </shape>
    </item>
</selector>

1
आपके पहले बिंदु के बिल्कुल विपरीत, मेरे लिए एक RecyclerView आइटम में सच था ... यह आश्चर्यजनक है कि मुझे अभी भी ऐसे मामले मिलते हैं जहां मुझे 5 साल के पेशेवर Android विकास के बाद इन एपीआई के साथ लड़ाई करनी है :(
aProperFox

7

बैकग्राउंड कलर जोड़ने से मुझे मदद मिली।

<CalendarView
    android:layout_width="match_parent"
    android:id="@+id/calendarView"
    android:layout_alignParentTop="true"
    android:layout_alignParentStart="true"
    android:layout_height="wrap_content"
    android:elevation="5dp"

    android:background="@color/windowBackground"

    />

4

कभी-कभी काम करना पसंद है background="@color/***"या background="#ff33**"नहीं, मैं background_colorड्रॉएबल के साथ प्रतिस्थापित करता हूं , फिर यह काम करता है


4

यदि यह अभी भी ऊंचाई की कोशिश नहीं दिखा रहा है

    android:hardwareAccelerated="true" 

यह निश्चित रूप से आपकी मदद करेगा।


यह मेरे लिए तय है। मैंने मान लिया था कि TRUE डिफ़ॉल्ट सेटिंग थी, लेकिन जाहिर है, कम से कम मेरे मामले में नहीं।
मैट रॉबर्टसन

3

यदि आप पारदर्शी पृष्ठभूमि चाहते हैं और android:outlineProvider="bounds"आपके लिए काम नहीं करते हैं, तो आप कस्टम व्यूऑउटलाइनप्रॉइडर बना सकते हैं:

class TransparentOutlineProvider extends ViewOutlineProvider {

    @Override
    public void getOutline(View view, Outline outline) {
        ViewOutlineProvider.BACKGROUND.getOutline(view, outline);
        Drawable background = view.getBackground();
        float outlineAlpha = background == null ? 0f : background.getAlpha()/255f;
        outline.setAlpha(outlineAlpha);
    }
}

और इस प्रदाता को अपने पारदर्शी दृष्टिकोण पर सेट करें:

transparentView.setOutlineProvider(new TransparentOutlineProvider());

स्रोत: https://code.google.com/p/android/issues/detail?id=78248#c13

[EDIT] ड्राएबल.गेटअल्फा () का दस्तावेजीकरण कहता है कि यह इस बात के लिए विशिष्ट है कि ड्रॉबल अल्फा को कैसे धमकाता है। यह संभव है कि यह हमेशा 255 पर वापस आ जाएगा। इस मामले में आप अल्फा स्वयं प्रदान कर सकते हैं:

class TransparentOutlineProvider extends ViewOutlineProvider {

    private float mAlpha;

    public TransparentOutlineProvider(float alpha) {
        mAlpha = alpha;
    }

    @Override
    public void getOutline(View view, Outline outline) {
        ViewOutlineProvider.BACKGROUND.getOutline(view, outline);
        outline.setAlpha(mAlpha);
    }
}

यदि आपकी दृश्य पृष्ठभूमि डिफ़ॉल्ट रंग # DDFF0000 के साथ एक StateListDrawable है जो अल्फा DDx0 / FFx0 == 0.86 के साथ है

transparentView.setOutlineProvider(new TransparentOutlineProvider(0.86f));

2

लेआउट के लिए कुछ पृष्ठभूमि रंग दें जैसे मेरे लिए काम किया:

    android:background="@color/catskill_white"
    android:layout_height="?attr/actionBarSize"
    android:elevation="@dimen/dimen_5dp"

1

clipChildren="false"पैरेंट लेआउट पर सेटिंग के साथ मुझे कुछ किस्मत मिली ।


1

मैंने इस पर काम करने में कुछ समय बिताया और आखिरकार महसूस किया कि जब पृष्ठभूमि अंधेरा है, तो छाया दिखाई नहीं देती है


1

स्वीकृत उत्तर को जोड़ते हुए, एक और कारण है जिसकी वजह से ऊँचाई उम्मीद के अनुसार काम नहीं कर सकती है यदि फ़ोन पर ब्लुटलाइट फ़िल्टर सुविधा चालू है।

मैं इस मुद्दे का सामना कर रहा था जब ऊंचाई पूरी तरह से विकृत और मेरे डिवाइस में असहनीय दिखाई दी। लेकिन पूर्वावलोकन में ऊंचाई ठीक थी। फोन पर Bluelight फ़िल्टर को बंद करने से समस्या हल हो गई।

इसलिए सेटिंग के बाद भी

android:outlineProvider="bounds"

ऊंचाई ठीक से काम नहीं कर रही है, तो आप फोन की रंग सेटिंग्स के साथ टिंकर करने की कोशिश कर सकते हैं।


0

मेरा मानना ​​है कि आपका मुद्दा इस तथ्य से उपजा है कि आपने अपने माता-पिता को भरने वाले रिश्तेदार लेआउट में उत्थान तत्व को लागू किया है। इसके अभिभावक सभी बच्चों के विचारों को अपने ड्राइंग कैनवास के भीतर रखते हैं (और वह दृश्य है जो बच्चे की छाया को संभालता है)। आप RelativeLayoutअपने दृश्य xml (रूट टैग) में सबसे ऊपर एक उन्नयन संपत्ति लागू करके इसे ठीक कर सकते हैं ।


0

मेरे मामले में फोंट समस्या थी।

1) बिना fontFamilyमुझे android:backgroundकुछ मूल्य निर्धारित करने की आवश्यकता है ।

<TextView
    android:layout_width="match_parent"
    android:layout_height="44dp"
    android:background="@android:color/white"
    android:elevation="3dp"
    android:gravity="center"
    android:text="@string/fr_etalons_your_tickets"
    android:textAllCaps="true"
    android:textColor="@color/blue_4" />

2) fontFamilyमुझे android:outlineProvider="bounds"सेटिंग जोड़ना था :

<TextView
    android:fontFamily="@font/gilroy_bold"
    android:layout_width="match_parent"
    android:layout_height="44dp"
    android:background="@android:color/white"
    android:elevation="3dp"
    android:gravity="center"
    android:outlineProvider="bounds"
    android:text="@string/fr_etalons_your_tickets"
    android:textAllCaps="true"
    android:textColor="@color/blue_4" />

0

मेरे मामले में, यह एक मूल पैरेंट घटक द्वारा "सॉफ्टवेयर" को रेंडरिंग लेयर टाइप सेट करने के कारण हुआ:

setLayerType(View.LAYER_TYPE_SOFTWARE, null);

इस लाइन को हटाने का काम किया। या बेशक आपको यह मूल्यांकन करने की आवश्यकता है कि यह पहले स्थान पर क्यों है। मेरे मामले में यह हनीकॉम्ब का समर्थन करना था, जो मेरी परियोजना के लिए वर्तमान न्यूनतम एसडीके से पीछे है।


0

यह भी देखें कि क्या आप उस दृश्य पर अल्फा नहीं बदलते हैं। मैं इस मुद्दे की जांच कर रहा हूं जब मैं कुछ दृश्यों पर अल्फा को बदल देता हूं, ऊंचाई के साथ। जब अल्फा बदल जाता है और 1f पर वापस बदल जाता है, तो वे बस ढीली ऊंचाई लेते हैं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.