एंड्रॉइड - केवल शीर्ष पर गोल कोनों के साथ ड्रॉएबल


151

मेरे पास पृष्ठभूमि के रूप में एक गोल आयत होने के लिए यह आकर्षित करने योग्य था:

<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <solid android:color="@color/white" />
    <stroke android:width="1dp" android:color="@color/light_gray" />
    <padding android:left="10dp" android:top="10dp" android:right="10dp" android:bottom="10dp" />
    <corners android:radius="6dp" />
</shape>

यह ठीक काम कर रहा है, जैसा कि अपेक्षित था।

अब, मैं इसे केवल शीर्ष कोनों को गोल करने के लिए बदलना चाहता हूं, इसलिए मैं इसे इसे बदल देता हूं:

<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <solid android:color="@color/white" />
    <stroke android:width="1dp" android:color="@color/light_gray" />
    <padding android:left="10dp" android:top="10dp" android:right="10dp" android:bottom="10dp" />
    <corners android:topLeftRadius="6dp" android:topRightRadius="6dp"
             android:bottomLeftRadius="0dp" android:bottomRightRadius="0dp"/>
</shape>

लेकिन अब कोई भी कोना गोल नहीं है और मुझे एक सादा आयत मिलता है। मुझे यहां क्या समझ नहीं आ रहा है?


यह वास्तव में एक समाधान नहीं है, लेकिन मुझे लगता है कि मुझे एक बार इसी तरह की समस्या थी। स्टोक को 2 पिक्सेल तक बढ़ाने में मदद मिली, लेकिन आप जानते हैं, यह कोई समाधान नहीं है।
कोड कवि

यहाँ आकार के कोनों के साथ एक मुद्दा है: code.google.com/p/android/issues/detail?id=939
Knickedi

जवाबों:


303

ये मान देने का प्रयास करें:

 <corners android:topLeftRadius="6dp" android:topRightRadius="6dp"
         android:bottomLeftRadius="0.1dp" android:bottomRightRadius="0.1dp"/>

ध्यान दें कि मैं बदल गया है 0dpकरने के लिए 0.1dp

संपादित करें: एक क्लीनर संस्करण के लिए नीचे एलेक्स जी टिप्पणी देखें


131
इसे और विस्तार देते हुए, मुझे एक और बेहतर समाधान मिला: <corners android:radius="1dp" android:topLeftRadius="6dp" android:topRightRadius="6dp" android:bottomLeftRadius="0dp" android:bottomRightRadius="0dp"/>- यह पूरी तरह से चौकोर निचला कोनों का निर्माण करता है, यहां तक ​​कि गोलाई के संकेत के बिना भी। हालाँकि आपका समाधान बहुत काम करता है।
एलेक्स जी

बिटमैप को देखते हुए इसे कोड में कैसे करें? और इसके चारों ओर रूपरेखा (AKA स्ट्रोक) कैसे जोड़ें?
Android डेवलपर

@ एलेक्स जी मुझे नहीं लगता कि यह निर्दिष्ट करना आवश्यक हैandroid:radius="1dp"
hmac

@ यह आवश्यक है। प्रलेखन पढ़ें, यह स्पष्ट करता है।
अलेक्सां जी

@AleksG हाँ दस्तावेज़ गलत है, सैमसंग 10, एंड्रॉइड 9 पर परीक्षण: "हर कोने (शुरू में) को 1 से अधिक कोने वाला त्रिज्या प्रदान किया जाना चाहिए, अन्यथा कोई कोने गोल नहीं हैं। यदि आप चाहते हैं कि विशिष्ट कोनों को गोल न किया जाए, तो वर्क-अराउंड एंड्रॉइड का उपयोग करना है: त्रिज्या एक डिफ़ॉल्ट कोने के त्रिज्या को 1 से अधिक सेट करने के लिए, लेकिन फिर ओवरराइड करें "- सच नहीं है, मैं नीचे दाएं, ऊपर दाएं, ऊपर शून्य के रूप में निर्दिष्ट करता हूं और नीचे बाईं ओर + ve और नीचे बाईं तरफ सही ढंग से घुमावदार है
hmac

14

कुछ इस तरह से करने की कोशिश करें:

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:bottom="-20dp" android:left="-20dp">
        <shape android:shape="rectangle">
            <solid android:color="@color/white" />

            <corners android:radius="20dp" />
        </shape>
    </item>
</layer-list>

ऐसा लगता है कि आयत के विभिन्न कोने त्रिज्या को सेट करने के लिए उपयुक्त नहीं है। तो आप इस हैक का उपयोग कर सकते हैं।


मेरा अपना उत्तर देखें - विभिन्न कोनों के लिए अलग-अलग त्रिज्या होना पूरी तरह से स्वीकार्य है।
एलेक्स जी

मैंने इस दृष्टिकोण की कोशिश की, यह स्वीकार्य नहीं है, ide बताता है कि यह अलग-अलग rsdius होने के लिए विनियोग नहीं करता है और इसे अनदेखा करता है
busylee

11

कोड के नीचे मेरे मामले में

    <?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:top="10dp" android:bottom="-10dp"
        >

        <shape android:shape="rectangle">
            <solid android:color="@color/maincolor" />

            <corners
                android:topLeftRadius="10dp"
                android:topRightRadius="10dp"
                android:bottomLeftRadius="0dp"
                android:bottomRightRadius="0dp"
            />
        </shape>

    </item>
    </layer-list>

1
जब तक आप दृश्य में पैडिंग चाहते हैं, तब तक आइटम पर शीर्ष और नीचे के गुणों की आवश्यकता नहीं है, लेकिन अन्यथा यह काम करता है।
रोमिनाव

9

Busylee के उत्तर पर बिल्डिंग , यह है कि आप कैसे कर सकते हैं drawableकि केवल एक संयुक्त गोल कोने (ऊपर-बाएँ, इस उदाहरण में):

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item>
        <shape android:shape="rectangle">
            <solid android:color="@color/white" />
            <!-- A numeric value is specified in "radius" for demonstrative purposes only,
                  it should be @dimen/val_name -->
            <corners android:radius="10dp" />
        </shape>
    </item>
    <!-- To keep the TOP-LEFT corner UNROUNDED set both OPPOSITE offsets (bottom+right): -->
    <item
        android:bottom="10dp"
        android:right="10dp">
        <shape android:shape="rectangle">
            <solid android:color="@color/white" />
        </shape>
    </item>
</layer-list>

कृपया ध्यान दें कि ऊपर एंड्रॉइड स्टूडियो पूर्वावलोकन (2.0.0p7) में सही ढंग drawableसे नहीं दिखाया गया है। वैसे भी इसका पूर्वावलोकन करने के लिए, एक और दृश्य बनाएं और इस का उपयोग करें android:background="@drawable/..."


6
@AleksG - बिल्कुल। यह आज भी प्रासंगिक है क्योंकि यह तब था (सबूत के रूप में - मुझे ऐसा कुछ चाहिए था)। आपको पता होना चाहिए कि वर्षों में कुछ करने के तरीके खराब हो जाते हैं और उन्हें अधिक आधुनिक लोगों के साथ बदलने की आवश्यकता हो सकती है। जैसा कि बिसाइल ने उल्लेख किया है, आईडीई शिकायत करता है जब अलग-अलग कोने रेडी को परिभाषित करता है, जो कि वर्तमान पद्धति के मामले में नहीं है। इसके अलावा, चूंकि यह सवाल Google (iirc) पर मेरी पहली हिट थी, इसलिए इसे अपडेट करना मेरे लिए समझ में आया। किसी भी तरह, मुझे यकीन है कि SO कोड के कुछ और KB को बुरा नहीं
मानेंगे

2

मैंने आपका कोड आज़माया और एक शीर्ष गोल कोने वाला बटन मिला। मैंने जैसा रंग @ffffffऔर स्ट्रोक दिया, मैंने वैसा ही दिया #C0C0C0

प्रयत्न

  1. Android दे रहा है: 0. इसके बजाय 0.LeftRadius = "0.1dp" यदि इसका काम नहीं कर रहा है
  2. क्या ड्रॉबल और एमुलेटर के रिज़ॉल्यूशन में देखें। मैंने रेस के तहत एक ड्रा करने योग्य फ़ोल्डर बनाया और उसका उपयोग किया। (hdpi, mdpi ldpi) फ़ोल्डर आपके पास यह XML है। यह मेरा आउटपुट है।

यहाँ छवि विवरण दर्ज करें


क्या Android संस्करण है? मेरा ऐप 1.6 पर चलना चाहिए - और एमुलेटर 1.6 में समस्या थी।
एलेक्स जी

1

आपको यह पढ़ने की आवश्यकता हो सकती है https://developer.android.com/guide/topics/resource/drawable-resource.html#Shape

और नीचे एक नोट है।

नोट हर कोने को (शुरू में) 1 से अधिक कोने वाला त्रिज्या प्रदान किया जाना चाहिए, अन्यथा कोई कोने गोल नहीं होते हैं। यदि आप चाहते हैं कि विशिष्ट कोनों को गोल न किया जाए, तो एंड्रॉइड का उपयोग करने के लिए एक वर्क-अराउंड है: त्रिज्या एक डिफ़ॉल्ट कोने को 1 से अधिक त्रिज्या सेट करने के लिए, लेकिन फिर प्रत्येक और हर कोने को उन मूल्यों के साथ ओवरराइड करें जिन्हें आप वास्तव में चाहते हैं, शून्य प्रदान करते हैं ("0dp" ) जहाँ आप गोल कोनों नहीं चाहते हैं।


1

ड्रा करने योग्य पर roung_top_corners.xml बनाएं और नीचे दिए गए कोड को कॉपी करें

<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle" >
<corners
    android:topLeftRadius="22dp"
    android:topRightRadius="22dp"
    android:bottomLeftRadius="0dp"
    android:bottomRightRadius="0dp"
    />
<gradient
    android:angle="180"
    android:startColor="#1d2b32"
    android:centerColor="#465059"
    android:endColor="#687079"
    android:type="linear" />
<padding
    android:left="0dp"
    android:top="0dp"
    android:right="0dp"
    android:bottom="0dp"
    />
<size
    android:width="270dp"
    android:height="60dp"
    /></shape>
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.