एक रेखीय लेआउट के सिर्फ एक तरफ सीमा कैसे खींचना है?


185

मैं एक रेखीय लेआउट में सीमा खींचने में सक्षम हूं, लेकिन यह हर तरफ से खींचा जा रहा है। मैं इसे केवल दाईं ओर प्रतिबंधित करना चाहता हूं, जैसे आप CSS (बॉर्डर-राइट: 1 पीएक्स सॉलिड रेड;) में करते हैं।

मैंने यह कोशिश की है, लेकिन यह अभी भी सभी पक्षों पर आकर्षित करता है:

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
<item>
    <shape android:shape="rectangle" >
        <stroke
            android:height="2dp"
            android:width="2dp"
            android:color="#FF0000" />

        <solid android:color="#000000" />

        <padding
            android:bottom="0dp"
            android:left="0dp"
            android:right="1dp"
            android:top="0dp" />

        <corners
            android:bottomLeftRadius="0dp"
            android:bottomRightRadius="5dp"
            android:radius="1dp"
            android:topLeftRadius="5dp"
            android:topRightRadius="0dp" />
    </shape>
</item>

इसे पूरा करने के बारे में कोई सुझाव?

BTW, मैं आवश्यक पक्ष पर चौड़ाई 1dp के दृश्य डालने के हैक का उपयोग नहीं करना चाहता।


आप अपने लेआउट में drawableLeft का उपयोग कर सकते हैं
njzk2

जवाबों:


358

एक तरफ सीमा प्राप्त करने के लिए आप इसका उपयोग कर सकते हैं

<?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="#FF0000" />
    </shape>
</item>
<item android:left="5dp">
    <shape android:shape="rectangle">
        <solid android:color="#000000" />
    </shape>
</item>
</layer-list>

संपादित

मेरे सहित कई लोग पारदर्शी पृष्ठभूमि के साथ एक तरफ की सीमा रखना चाहते थे, मैंने लागू किया है BorderDrawableजो मुझे अलग-अलग आकार और रंग के साथ सीमाएं दे सकता है जिस तरह से हम सीएसएस का उपयोग करते हैं। लेकिन यह xml के माध्यम से इस्तेमाल नहीं किया जा सकता है। XML का समर्थन करने के लिए, मैंने एक जोड़ा है BorderFrameLayoutजिसमें आपका लेआउट लपेटा जा सकता है।

पूर्ण स्रोत के लिए मेरे गिथब देखें


5
क्या होगा यदि आप नीचे की सीमा के साथ एक ठोस अल्फा आधारित रंग चाहते हैं? मैं एक समाधान के बारे में सोच रहा हूं जो कि एंड्रॉइड ड्रॉएबल एक्सएमएल एपीआई के साथ है लेकिन मैं इसका पता नहीं लगा सकता।
बजे मारियो लेन्ची जूल

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

@jbenowitz: परत-सूची में आइटम का क्रम अधिक महत्वपूर्ण है। यदि आप उल्टा करते हैं तो आपको वे परिणाम मिलेंगे।
विवेक खंडेलवाल

मैंने बॉर्डर कलर में एक स्ट्रोक और बटन कलर शेष आकार जोड़कर इसे ठीक किया है। यही चाल चली।
jbenowitz

242

पाई के रूप में आसान, पारदर्शी बीजी की अनुमति:

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle">
    <gradient
        android:angle="0"
        android:startColor="#f00"
        android:centerColor="@android:color/transparent"
        android:centerX="0.01" />
</shape>

सीमा स्थान बदलने के लिए कोण बदलें:

  • 0 = छोड़ दिया
  • 90 = नीचे
  • 180 = सही
  • 270 = शीर्ष

19
यह अब तक का सबसे अच्छा जवाब है, बहुत बुरा यह
अपवित्र

11
हालांकि, मैं निश्चित रूप से इसे "पाई के रूप में आसान" के रूप में वर्णित नहीं करूंगा।
फफूंद

7
अगर आपको मोटी सीमा की आवश्यकता है या यदि आपको कई तरफ से सीमाओं की आवश्यकता है तो यह काम नहीं करता है।
होलोग्राफिक-सिद्धांत

1
@ कोडमैन - इसे अपने दृष्टिकोण के लिए एक पृष्ठभूमि के रूप में उपयोग करें, फिर यह अपनी ऊंचाई विरासत में मिलेगा।
ओलेड ब्रिनेर

2
कैसे स्ट्रोक या सीमा चौड़ाई समायोजित करने के लिए?
रुतुराज पाटिल

101

यह लागू करना भी संभव है कि आप एक परत का उपयोग करके क्या चाहते हैं

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

    <item
        android:bottom="-5dp"
        android:right="-5dp"
        android:top="-5dp">
        <shape android:shape="rectangle" >
            <solid android:color="@color/color_of_the_background" />

            <stroke
                android:width="5dp"
                android:color="@color/color_of_the_border" />
        </shape>
    </item>

</layer-list>

इस तरह से केवल बाईं सीमा दिखाई दे रहा है, लेकिन आप के साथ खेलने से किसी भी संयोजन आप चाहते हैं प्राप्त कर सकते हैं bottom, left, rightऔर topकी विशेषताओं का itemतत्व


3
यह निश्चित रूप से उपयोगी है जब आपके पास अन्य पृष्ठभूमि का रंग होता है और आप इस ड्रॉबल बीजी को सीमा के साथ ओवरले करना चाहते हैं। (y)
आंग प्याई

3
वास्तव में मुझे क्या चाहिए, लेकिन क्या नकारात्मक पैडिंग का उपयोग करना सही है?
इलियारमिन

1
यह सबसे अच्छा उपाय है। मैं परेशान हूँ कि वहाँ -5dp क्या करता है।
अमित कुमार

1
HTML / CSS में नकारात्मक पैडिंग आम है। यह बस चीजों को दूसरी दिशा में ले जाता है। मेरे अनुभव में, यह एंड्रॉइड में भी पूरी तरह से मान्य है।
Spaaarky21

यदि आपके लेआउट में क्लिपचिल्ड्रेन = झूठा या क्लिपटाउडिंग = गलत है, तो नकारात्मक मार्जिन का उपयोग करने वाले कार्यान्वयन अच्छी तरह से काम नहीं करते हैं। यदि यह मामला है, तो आप दो ओवरलैप किए गए आयतों के साथ समाधान का उपयोग कर सकते हैं, जैसे विवेक खंडेलवाल द्वारा प्रस्तावित
जेसु बैरेरा

79

एक ड्रॉबल के सिर्फ एक तरफ की सीमा प्राप्त insetकरने के लिए, अन्य 3 पक्षों के लिए एक नकारात्मक लागू करें (जिससे उन सीमाओं को ऑफ-स्क्रीन खींचा जा सके)।

<?xml version="1.0" encoding="utf-8"?>
<inset xmlns:android="http://schemas.android.com/apk/res/android"
    android:insetTop="-2dp" 
    android:insetBottom="-2dp"
    android:insetLeft="-2dp">

    <shape android:shape="rectangle">
        <stroke android:width="2dp" android:color="#FF0000" />
        <solid android:color="#000000" />
    </shape>

</inset>

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

यह दृष्टिकोण नायक के उत्तर के समान है, लेकिन बिना उपयोग के layer-list


4
यह सबसे अच्छा जवाब है IMO
जेम्स

बहुत अच्छा जवाब, मुझे बस चौड़ाई और इनसेट को 10dp में बदलने की आवश्यकता है :) और अधिक, मुझे बाईं ओर सीमा की आवश्यकता है, इसलिए मैं एंड्रॉइड को बदल देता हूं: insetLeft to android: insetRight। बहुत आसन! मटीरियल बटन पर क्लिक करें: D
Phuong

वास्तव में मुझे क्या चाहिए, insertXयह तय करने के लिए शीर्ष पर बदलें कि क्या सीमाओं को दिखाना है और क्या नहीं।
CularBytes

मेरे पास @null का एक ठोस रंग भी हो सकता है और फिर इस विधि के कारण कोई अति नहीं होती है। प्रतिभा। धन्यवाद!
अनजानेरेडो

2
ध्यान दें: यह आपके दृश्य की सामग्री को स्थानांतरित कर देगा और इसका आकार भी बदल देगा। देखभाल के साथ उपयोग करें।
वॉवहॉस्ट

7

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

<View
    android:layout_width="2dp"
    android:layout_height="match_parent"
    android:background="#000000" />

केवल एक सही सीमा होने के लिए, इसे लेआउट के बाद रखें (जहाँ आप सीमा चाहते हैं):

<View
    android:layout_width="2dp"
    android:layout_height="match_parent"
    android:background="#000000" />

केवल एक बाईं सीमा होने के लिए, इसे लेआउट से पहले रखें (जहां आप सीमा चाहते हैं):

मेरे लिए काम किया ... आशा है कि इसकी कुछ मदद ...।


6

मैं निम्नलिखित कोड के साथ प्रभाव को प्राप्त करने में सक्षम था

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
    <item android:left="0dp" android:right="-5dp" android:top="-5dp" android:bottom="-5dp">
        <shape
        android:shape="rectangle">
            <stroke android:width="1dp" android:color="#123456" />
        </shape>
    </item>
</layer-list>

आप विस्थापन की दिशा बदलकर सीमा की स्थिति के लिए अपनी आवश्यकताओं को समायोजित कर सकते हैं


5
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_pressed="true" >
        <shape>
            <solid
                android:color="#f28b24" />
            <stroke
                android:width="1dp"
                android:color="#f28b24" />
            <corners
                android:radius="0dp"/>
            <padding
                android:left="0dp"
                android:top="0dp"
                android:right="0dp"
                android:bottom="0dp" />
        </shape>
    </item>
    <item>
        <shape>
            <gradient
                android:startColor="#f28b24"
                android:endColor="#f28b24"
                android:angle="270" />
            <stroke
                android:width="0dp"
                android:color="#f28b24" />
            <corners
                android:bottomLeftRadius="8dp"
                android:bottomRightRadius="0dp"
                android:topLeftRadius="0dp"
                android:topRightRadius="0dp"/>
            <padding
                android:left="10dp"
                android:top="10dp"
                android:right="10dp"
                android:bottom="10dp" />
        </shape>
    </item>
</selector>

5

एक और बेहतरीन उदाहरण उदाहरण

<?xml version="1.0" encoding="UTF-8" standalone="no"?> 
<inset xmlns:android="http://schemas.android.com/apk/res/android"
     android:insetRight="-2dp">

     <shape android:shape="rectangle">
         <corners
             android:bottomLeftRadius="4dp"
             android:bottomRightRadius="0dp"
             android:topLeftRadius="4dp"
             android:topRightRadius="0dp" />
         <stroke
             android:width="1dp"
             android:color="@color/nasty_green" />
         <solid android:color="@android:color/transparent" />
     </shape>

</inset>

2

यहां नौ-पैच फ़ाइलों के बारे में कोई उल्लेख नहीं है। हां, आपको फाइल बनानी होगी, हालांकि यह काफी आसान काम है और यह वास्तव में " क्रॉस-वर्जन और ट्रांसपेरेंसी सपोर्टिंग " समाधान है। यदि फ़ाइल को drawable-nodpiनिर्देशिका में रखा जाता है , तो यह pxआधारित काम करता है, और drawable-mdpiलगभग डीपी बेस के रूप में काम करता है (फिर से शुरू करने के लिए धन्यवाद)।

मूल प्रश्न के लिए उदाहरण फ़ाइल ( बॉर्डर-राइट: 1 पीएक्स सॉलिड रेड; ) यहाँ है:

http://ge.tt/517ZIFC2/v/3?c

बस इसे drawable-nodpiडायरेक्टरी में रखें।


1

विभिन्न रंगों की सीमाएँ। मैंने 3 आइटम इस्तेमाल किए।

<?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/colorAccent" />
        </shape>
    </item>
    <item android:top="3dp">
        <shape android:shape="rectangle">
            <solid android:color="@color/light_grey" />
        </shape>
    </item>
    <item
        android:bottom="1dp"
        android:left="1dp"
        android:right="1dp"
        android:top="3dp">
        <shape android:shape="rectangle">
            <solid android:color="@color/colorPrimary" />
        </shape>
    </item>
</layer-list>
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.