XML ड्रॉबल का उपयोग करके वर्टिकल लाइन


162

मैं यह पता लगाने की कोशिश कर रहा हूं कि कैसे एक वर्टिकल लाइन (1dp मोटी) को एक ड्रॉबल के रूप में इस्तेमाल किया जाए।

एक क्षैतिज बनाने के लिए, यह बहुत सीधा है:

<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="line">
    <stroke android:width="1dp" android:color="#0000FF"/>
    <size android:height="50dp" />     
</shape>

सवाल यह है कि इस रेखा को लंबवत कैसे बनाया जाए?

हां, वर्कअराउंड्स हैं, जैसे कि आयताकार आकार 1px मोटी ड्राइंग, लेकिन यह ड्रा करने योग्य एक्सएमएल को जटिल करता है, अगर इसमें कई <item>तत्व शामिल हैं।

किसी को भी इस के साथ कोई मौका था?

अपडेट करें

केस अभी भी अनसुलझा है। हालाँकि, Android डॉक्यूमेंटेशन क्रूसेड पर किसी के लिए - आपको यह उपयोगी लग सकता है: मिसिंग एंड्रॉइड एक्सएमएल मैनुअल

अपडेट करें

मुझे जो सही लगा, उसके अलावा कोई और रास्ता नहीं मिला। यह चाल को "भारी" लगता है, इस प्रकार यदि आप ऐसा जानते हैं कि उत्तर को साझा करना न भूलें;)

जवाबों:


394

आकार के बजाय, आप एक कोशिश कर सकते हैं View:

<View
    android:layout_width="1dp"
    android:layout_height="fill_parent"
    android:background="#FF0000FF" />

मैंने केवल क्षैतिज रेखाओं के लिए इसका उपयोग किया है, लेकिन मुझे लगता है कि यह ऊर्ध्वाधर लाइनों के लिए भी काम करेगा।

उपयोग:

<View
    android:layout_width="fill_parent"
    android:layout_height="1dp"
    android:background="#FF0000FF" />

एक क्षैतिज रेखा के लिए।


4
धन्यवाद मार्क :)! मुझे पता है कि मैं इसे प्राप्त करने के लिए एक दृश्य का उपयोग कर सकता हूं। बात यह है कि मैं थोड़ा और अधिक जटिल दृश्य इकट्ठा कर रहा हूं जिसे मैं एक तालिका सेल की पृष्ठभूमि के लिए एक ड्रॉबल के रूप में उपयोग करना चाहता हूं। वहाँ विभिन्न प्रकार के आकार / ग्रेडिएंट / लाइनें हैं। एक दृश्य का उपयोग करना एक समाधान होगा, हालांकि मुझे इसे एक अलग ड्राइंग "परत" में रखना होगा और यह संभवत: पैर में अपने आप को शूट कर रहा है जब मैं आकार बदलने आदि में आऊंगा। मुझे आश्चर्य है कि क्यों "पर कोई प्रलेखन नहीं है" आकार "xmls, शायद Google का कोई व्यक्ति हमें बता सकता है? :)
कास्पा

1
पक्षों पर जगह पाने के लिए मार्जिन / स्टार्ट और लेफ्ट / एंड का उपयोग करना भी कभी-कभी दिलचस्प होता है।
जॉर्ज

108

आप एक रोटेट टैग के अंदर अपना आकार घोंसला कर सकते हैं।

<rotate xmlns:android="http://schemas.android.com/apk/res/android"
    android:fromDegrees="90"
    android:toDegrees="90">
    <shape 
        android:shape="line">
        <stroke
            android:width="1dp"
            android:color="#ff00ff"
            android:dashWidth="1dp"
            android:dashGap="2dp" />
    </shape>
</rotate>

हालाँकि, एकमात्र समस्या यह है कि आपके लेआउट xml में परिभाषित लेआउट परम मूल आकार को खींचने के लिए उपयोग किए जाने वाले आयाम होंगे। मतलब अगर आप चाहते हैं कि आपकी लाइन 30dp लंबी हो, तो आपको अपने लेआउट xml में 30dp के एक लेआउट_ एक्सपोज़र को परिभाषित करने की आवश्यकता है। लेकिन अंतिम चौड़ाई उस मामले में भी 30dp होगी, जो ज्यादातर स्थितियों के लिए अवांछनीय है। इसका अनिवार्य रूप से मतलब है कि चौड़ाई और ऊंचाई दोनों का एक ही मूल्य होना चाहिए, लाइन के लिए आपकी वांछित लंबाई का मूल्य। मैं यह पता नहीं लगा सका कि इसे कैसे ठीक किया जाए।

यह "एंड्रॉइड तरीका" समाधान प्रतीत होता है, लेकिन जब तक मेरे द्वारा उल्लिखित आयामों के लिए कुछ ठीक या समाधान नहीं होता है, तब तक यह संभावना अधिकांश लोगों के लिए काम नहीं करेगी। वास्तव में हमें जो आवश्यकता है वह है <अभिविन्यास /> या <स्ट्रोक /> में एक अभिविन्यास विशेषता।

आप रोटेट टैग की विशेषताओं में एक और ड्रा करने योग्य संदर्भित करने का प्रयास कर सकते हैं, जैसे:

<rotate xmlns:android="http://schemas.android.com/apk/res/android"
    android:fromDegrees="90"
    android:toDegrees="90"
    android:drawable="@drawable/horizontal_line" />

हालाँकि, मैंने इसका परीक्षण नहीं किया है और उम्मीद है कि इसमें समान मुद्दे होंगे।

- संपादित करें -

ओह, मैं वास्तव में एक तय कर लिया। अनिर्दिष्ट अतिरिक्त स्थान से छुटकारा पाने के लिए आप अपने लेआउट xml में एक नकारात्मक मार्जिन का उपयोग कर सकते हैं। जैसे कि:

<ImageView
    android:layout_width="35dp"
    android:layout_height="35dp"
    android:layout_marginLeft="-15dp"
    android:layout_marginRight="-15dp"
    android:src="@drawable/dashed_vertical_line" />

4
जबकि ऋणात्मक मार्जिन 99% डिवाइसों के लिए काम करेगा .... बस पता है, वहाँ डिवाइस हैं जो फोर्स क्लोज़ करेंगे यदि आप ऐसा करते हैं। कुछ उपकरणों को एक नकारात्मक अंतर को बढ़ाने में परेशानी होती है
केंट एंडरसन

2
@cephus मैं आपके पहले कोड का उपयोग करता हूं, लेकिन मुझे दृश्य के ऊपर लाइन की आवश्यकता है। यह मेरे विचार के केंद्र में है। मैं इसके लिए गुरुत्वाकर्षण कैसे बना सकता हूं (आकार xml फ़ाइल के अंदर)?
बेहज़ाद

20

आप रोटेट विशेषता का उपयोग कर सकते हैं

 <item>
    <rotate
        android:fromDegrees="90"
        android:toDegrees="90"
        android:pivotX="50%"
        android:pivotY="50%" >
        <shape
            android:shape="line"
            android:top="1dip" >
            <stroke
                android:width="1dip"
                 />
        </shape>
    </rotate>
</item>

6
यह निश्चित रूप से एक बेहतर (या सर्वोत्तम) उत्तर है क्योंकि, @ कॉमन्सवेयर का उत्तर सामान्य ऊर्ध्वाधर लाइनों के लिए पर्याप्त है। यदि हम धराशायी लाइनें (उदाहरण के लिए कहें) नहीं बनाना चाहते हैं, तो यह एकमात्र उत्तर है जो ठीक से काम करेगा।
सुबीन सेबेस्टियन

16
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
  android:shape="rectangle" >
    <stroke android:width="1dp" android:color="@color/white" />
    <size android:width="2dp" />
</shape>

मेरे लिये कार्य करता है । इसे dp ऊंचाई में fill_parent या निश्चित आकार के साथ देखने की पृष्ठभूमि के रूप में रखें


11

मैं एक अलग समाधान के साथ आया था। विचार यह है कि ड्रॉबल को पहले उस रंग के साथ भरें जिसे आप रेखा के रूप में पसंद करते हैं और फिर बाएं या दाएं पैडिंग का उपयोग करते हुए पूरे क्षेत्र को फिर से पृष्ठभूमि रंग के साथ भरें। जाहिर है यह केवल आपके ड्रॉबल के बाएं या दाएं में एक ऊर्ध्वाधर रेखा के लिए काम करता है।

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
    <item android:drawable="@color/divider_color" />
    <item android:left="6dp" android:drawable="@color/background_color" />
</layer-list>

मुझे बाएं, दाएं, नीचे की सीमाओं के साथ पृष्ठभूमि की आवश्यकता थी और इसने मेरे लिए काम किया, धन्यवाद!
एंड्री चेर्नेंको

बहुत बढ़िया, इस के साथ मैं अपने LinearLayout ( showDividers="middle") में साफ-सुथरा डिवाइडर बनाने में कामयाब रहा । 2dp विभाजक प्राप्त करने के लिए, मुझे android:left="3dp"यहां निर्दिष्ट करने की आवश्यकता है।
जोनीक

युक्ति: इस ड्रॉएबल को अधिक आम तौर पर उपयोगी बनाने के लिए, @android:color/transparentहार्डकोडिंग के बजाय उपयोग करें @color/background_color
जोनीक

वास्तव में मेरी ऊर्ध्वाधर विभक्त आवश्यकताओं के लिए, यह समाधान और भी सरल है । :)
जोनीक

@ जोंक श्योर, लेकिन यह केवल एक निश्चित ऊंचाई के दृश्य के साथ काम करता है, साथ नहीं wrap_content
एरिक कोक

10

मुझे लगता है कि यह सबसे सरल उपाय है:

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

    <item
        android:gravity="center">
        <shape android:shape="rectangle">
            <size android:width="1dp" />
            <solid android:color="#0000FF" />
        </shape>
    </item>

</layer-list>

आश्चर्यजनक। जोड़े android:heightको sizeयदि आपने उस आयाम को नियंत्रित करना चाहते हैं।
Giulio Piancastelli

4

मुझे अपने विचारों को गतिशील रूप से / प्रोग्रामेटिक रूप से जोड़ने की आवश्यकता थी, इसलिए एक अतिरिक्त दृश्य जोड़ना बोझिल हो जाता। मेरे दृश्य की ऊंचाई WRAP_CONTENT थी, इसलिए मैं आयत समाधान का उपयोग नहीं कर सका। मुझे यहां TextView का विस्तार करने, ऑनड्राइड () और लाइन में पेंटिंग के बारे में एक ब्लॉग-पोस्ट मिली , इसलिए मैंने इसे लागू किया और यह अच्छी तरह से काम करता है। नीचे मेरा कोड देखें:

public class NoteTextView extends TextView {
    public NoteTextView(Context context) {
       super(context);
    }
    private Paint paint = new Paint();
    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        paint.setColor(Color.parseColor("#F00000FF"));
        paint.setStrokeWidth(0);
        paint.setStyle(Paint.Style.FILL);
        canvas.drawLine(0, 0, 0, getHeight(), paint);
    }
}

मुझे बाईं ओर एक वर्टिकल लाइन की आवश्यकता थी, लेकिन ड्रॉलाइन पैरामीटर हैं drawLine(startX, startY, stopX, stopY, paint)ताकि आप किसी भी दिशा में किसी भी सीधी रेखा को दृश्य के पार खींच सकें। फिर मेरी गतिविधि में मुझे NoteTextView note = new NoteTextView(this); आशा है कि यह मदद करता है।


3

इसका बहुत ही सरल ... android xml में एक वर्टिकल लाइन जोड़ने के लिए ...

<View
android:layout_width="fill_parent"
android:layout_height="1dp"
android:layout_marginTop="5dp"
android:rotation="90"
android:background="@android:color/darker_gray"/>

जब आप ऊँचाई के लिए fill_parent का उपयोग नहीं कर सकते हैं तो यह बहुत अच्छा काम करता है क्योंकि पैरेंट ऊँचाई लपेटने के लिए सेट की जाती है।
सर्गेई एल्डुखोव

2

निर्भर करता है, जहां आप वर्टिकल लाइन रखना चाहते हैं, लेकिन यदि आप उदाहरण के लिए वर्टिकल बॉर्डर चाहते हैं, तो आपके पास माता-पिता का एक बैकग्राउंड एक कस्टम ड्रॉबल हो सकता है। और फिर आप इस तरह से ड्राइंग को परिभाषित कर सकते हैं:

<?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:width="1dp" android:color="#000000" />
            <solid android:color="#00ffffff" />

        </shape>
    </item>

    <item android:right="1dp">
        <shape android:shape="rectangle">
            <solid android:color="#00ffffff" />
        </shape>
    </item>

</layer-list>

यह उदाहरण दृश्य के दाईं ओर एक 1dp पतली काली रेखा बनाएगा, जिसकी पृष्ठभूमि के रूप में यह चित्रण होगा।


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

    <item
        android:bottom="-3dp"
        android:left="-3dp"
        android:top="-3dp">

        <shape android:shape="rectangle">
            <solid android:color="@color/colorPrimary" />
            <stroke
                android:width="2dp"
                android:color="#1fc78c" />
        </shape>

    </item>

</layer-list>

2

ऐसा लगता है कि किसी ने इस विकल्प का उल्लेख नहीं किया है:

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
    <item android:drawable="@color/white" android:width="1dp"/>
</layer-list>

1

आप एक आकृति का उपयोग कर सकते हैं लेकिन एक पंक्ति के बजाय इसे आयत बनाते हैं।

android:shape="rectangle">
<stroke
    android:width="5dp"
    android:color="#ff000000"
    android:dashGap="10px"
    android:dashWidth="30px" />

और अपने लेआउट में इस का उपयोग करें ...

<ImageView
    android:layout_width="7dp"
    android:layout_height="match_parent"
    android:src="@drawable/dashline"
    android:layout_alignParentTop="true"
    android:layout_centerHorizontal="true"
    android:layerType="software"/>

आपको डैश के आकार के आधार पर चौड़ाई के साथ खेलना पड़ सकता है, इसे एक पंक्ति में लाने के लिए।

आशा है कि यह चीयर्स में मदद करता है


1
add this in your styles.xml

        <style name="Divider">
            <item name="android:layout_width">1dip</item>
            <item name="android:layout_height">match_parent</item>
            <item name="android:background">@color/divider_color</item>
        </style>

        <style name="Divider_invisible">
            <item name="android:layout_width">1dip</item>
            <item name="android:layout_height">match_parent</item>
        </style>

then wrap this style in a linear layout where you want the vertical line, I used the vertical line as a column divider in my table. 

     <TableLayout
                android:id="@+id/table"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:orientation="horizontal"
                android:stretchColumns="*" >

                <TableRow
                    android:id="@+id/tableRow1"
                    android:layout_width="fill_parent"
                    android:layout_height="match_parent"
                    android:background="#92C94A" >

                    <TextView
                        android:id="@+id/textView11"
                        android:paddingBottom="10dp"
                        android:paddingLeft="5dp"
                        android:paddingRight="5dp"
                        android:paddingTop="10dp" />
    //...................................................................    

                    <LinearLayout
                        android:layout_width="1dp"
                        android:layout_height="match_parent" >

                        <View style="@style/Divider_invisible" />
                    </LinearLayout>
        //...................................................................
                    <TextView
                        android:id="@+id/textView12"
                        android:paddingBottom="10dp"
                        android:paddingLeft="5dp"
                        android:paddingRight="5dp"
                        android:paddingTop="10dp"
                        android:text="@string/main_wo_colon"
                        android:textColor="@color/white"
                        android:textSize="16sp" />
  //...............................................................  
                    <LinearLayout
                        android:layout_width="1dp"
                        android:layout_height="match_parent" >

                        <View style="@style/Divider" />
                    </LinearLayout>

    //...................................................................
                    <TextView
                        android:id="@+id/textView13"
                        android:paddingBottom="10dp"
                        android:paddingLeft="5dp"
                        android:paddingRight="5dp"
                        android:paddingTop="10dp"
                        android:text="@string/side_wo_colon"
                        android:textColor="@color/white"
                        android:textSize="16sp" />

                    <LinearLayout
                        android:layout_width="1dp"
                        android:layout_height="match_parent" >

                        <View style="@style/Divider" />
                    </LinearLayout>

                    <TextView
                        android:id="@+id/textView14"
                        android:paddingBottom="10dp"
                        android:paddingLeft="5dp"
                        android:paddingRight="5dp"
                        android:paddingTop="10dp"
                        android:text="@string/total"
                        android:textColor="@color/white"
                        android:textSize="16sp" />
                </TableRow>

                <!-- display this button in 3rd column via layout_column(zero based) -->

                <TableRow
                    android:id="@+id/tableRow2"
                    android:layout_width="match_parent"
                    android:layout_height="match_parent"
                    android:background="#6F9C33" >

                    <TextView
                        android:id="@+id/textView21"
                        android:padding="5dp"
                        android:text="@string/servings"
                        android:textColor="@color/white"
                        android:textSize="16sp" />

                    <LinearLayout
                        android:layout_width="1dp"
                        android:layout_height="match_parent" >

                        <View style="@style/Divider" />
                    </LinearLayout>

    ..........
    .......
    ......

0

एक ऊर्ध्वाधर रेखा बनाने के लिए, बस 1dp की चौड़ाई के साथ एक आयत का उपयोग करें:

<shape>
    <size
        android:width="1dp"
        android:height="16dp" />
    <solid
        android:color="#c8cdd2" />
</shape>

लाइन का रंग निर्दिष्ट करने के लिए stroke, उपयोग न करें solid(जो कि "फिल" रंग है)।


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