Đường dọc sử dụng XML drawable


162

Tôi đang cố gắng tìm ra cách xác định một đường thẳng đứng (dày 1dp) để được sử dụng như một hình vẽ.

Để tạo một chiều ngang, nó khá đơn giản:

<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>

Câu hỏi là, làm thế nào để làm cho dòng này thẳng đứng?

Có, có các cách giải quyết, chẳng hạn như vẽ hình chữ nhật dày 1px, nhưng điều đó làm phức tạp XML có thể vẽ được, nếu nó bao gồm nhiều <item>phần tử.

Bất cứ ai cũng có cơ hội với điều này?

CẬP NHẬT

Trường hợp vẫn chưa được giải quyết. Tuy nhiên, đối với bất kỳ ai trong cuộc thập tự chinh tài liệu Android - bạn có thể thấy điều này hữu ích: Thiếu Hướng dẫn sử dụng Android XML

CẬP NHẬT

Tôi không tìm thấy cách nào khác ngoài cách tôi đánh dấu là chính xác. Nó thực hiện thủ thuật mặc dù cảm thấy hơi "nặng", do đó nếu bạn tình cờ biết câu trả lời đừng quên chia sẻ;)

Câu trả lời:


394

Thay vì hình dạng, bạn có thể thử View:

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

Tôi chỉ sử dụng điều này cho các đường ngang, nhưng tôi sẽ nghĩ rằng nó cũng hoạt động cho các đường thẳng đứng.

Sử dụng:

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

cho một đường ngang.


4
cảm ơn Mark :)! Tôi biết tôi có thể sử dụng một quan điểm để đạt được điều này. Vấn đề là tôi đang lắp ráp một khung nhìn phức tạp hơn một chút mà tôi muốn sử dụng như một hình vẽ có thể vẽ được cho nền của một ô của bảng. Có nhiều loại hình dạng / độ dốc / đường khác nhau ở đó. Sử dụng chế độ xem sẽ là một giải pháp, tuy nhiên tôi sẽ phải đặt nó vào một "lớp" bản vẽ khác và điều đó có khả năng tự bắn vào chân tôi khi tôi bắt gặp thay đổi kích thước, v.v. Tôi tự hỏi tại sao không có tài liệu nào về " hình dạng "xmls, có lẽ ai đó từ google có thể khai sáng chúng ta? :)
Muffa

1
Sử dụng marginRight / Start và Left / End đôi khi cũng thú vị để có không gian ở hai bên.
George

108

Bạn có thể lồng hình dạng của bạn bên trong một thẻ xoay.

<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>

Tuy nhiên, vấn đề duy nhất là các thông số bố cục được xác định trong xml bố cục của bạn sẽ là kích thước được sử dụng để vẽ hình dạng ban đầu. Có nghĩa là nếu bạn muốn dòng của bạn cao 30dp, bạn cần xác định layout_ thong 30dp trong layout xml của bạn. Nhưng chiều rộng cuối cùng cũng sẽ là 30dp trong trường hợp đó, điều này có thể không mong muốn trong hầu hết các tình huống. Điều này về cơ bản có nghĩa là cả chiều rộng và chiều cao phải có cùng giá trị, giá trị độ dài mong muốn của bạn cho dòng. Tôi không thể tìm ra cách khắc phục điều này.

Đây có vẻ là giải pháp "cách android", nhưng trừ khi có một số cách khắc phục hoặc giải pháp cho vấn đề kích thước tôi đề cập thì có thể điều này sẽ không hiệu quả với hầu hết mọi người. Những gì chúng ta thực sự cần là một thuộc tính định hướng trong <shape /> hoặc <Stro />.

Bạn cũng có thể thử tham khảo một drawable khác trong các thuộc tính của thẻ xoay, chẳng hạn như:

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

Tuy nhiên tôi đã không kiểm tra điều này và hy vọng nó cũng có vấn đề tương tự.

-- BIÊN TẬP --

Ồ, tôi thực sự đã tìm ra một sửa chữa. Bạn có thể sử dụng lề âm trong bố cục xml để loại bỏ không gian thừa không mong muốn. Nhu la:

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

4
trong khi lề âm sẽ hoạt động cho 99% thiết bị .... chỉ cần biết, có những thiết bị ngoài đó sẽ Buộc đóng nếu bạn làm điều này. Một số thiết bị gặp sự cố làm tăng biên âm
Kent Andersen

2
@cephus Tôi sử dụng mã đầu tiên của bạn, nhưng tôi cần dòng trên đầu xem. Nó nằm ở trung tâm của quan điểm của tôi. Làm cách nào tôi có thể đặt trọng lực cho nó (bên trong tệp hình xml)?
Behzad

20

Bạn có thể sử dụng thuộc tính xoay

 <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
Đây chắc chắn là một câu trả lời tốt hơn (hoặc tốt nhất) bởi vì, trong khi câu trả lời của @ commonsware đủ cho các đường thẳng đứng thông thường. Nếu chúng ta không tạo ra các đường đứt nét (ví dụ: ví dụ), đây là câu trả lời duy nhất sẽ hoạt động đúng.
Subin Sebastian

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>

Làm việc cho tôi. Đặt nó làm nền của chế độ xem với fill_parent hoặc có kích thước cố định theo chiều cao dp


11

Tôi đã đưa ra một giải pháp khác. Ý tưởng là làm đầy màu vẽ có thể vẽ trước bằng màu mà bạn thích và sau đó tô lại toàn bộ khu vực bằng màu nền trong khi sử dụng phần đệm bên trái hoặc bên phải. Rõ ràng điều này chỉ hoạt động cho một đường thẳng đứng ở phía bên trái hoặc bên phải của drawable của bạn.

<?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>

Tôi cần nền với các đường viền ở bên trái, phải, dưới và điều này làm việc cho tôi, cảm ơn!
Andrii Chernenko

Thật tuyệt vời, với điều này, tôi đã quản lý để tạo các bộ chia gọn gàng trong linearLayout ( showDividers="middle") của mình. Để có được một bộ chia 2dp, tôi cần chỉ định android:left="3dp"ở đây.
Jonik

Mẹo: để làm cho bản vẽ này hữu ích hơn nói chung, hãy sử dụng @android:color/transparentthay vì mã hóa cứng @color/background_color.
Jonik

Trên thực tế cho nhu cầu chia dọc của tôi, giải pháp này thậm chí còn đơn giản hơn . :)
Jonik

@Jonik Chắc chắn, nhưng điều đó chỉ hoạt động với chế độ xem chiều cao cố định, không phải với wrap_content.
Eric Kok

10

Tôi nghĩ rằng đây là giải pháp đơn giản nhất:

<?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>

Tuyệt vời. Thêm android:heightvào sizenếu bạn muốn kiểm soát kích thước đó.
Giulio Piancastelli

4

Tôi cần phải thêm quan điểm của mình một cách linh hoạt / lập trình, vì vậy việc thêm một chế độ xem bổ sung sẽ rất khó khăn. Chiều cao chế độ xem của tôi là WRAP_CONTENT, vì vậy tôi không thể sử dụng giải pháp hình chữ nhật. Tôi đã tìm thấy một bài đăng blog ở đây về việc mở rộng TextView, ghi đè onDraw () và vẽ theo dòng, vì vậy tôi đã thực hiện điều đó và nó hoạt động tốt. Xem mã của tôi dưới đây:

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);
    }
}

Tôi cần một đường thẳng đứng ở bên trái, nhưng các tham số drawLine(startX, startY, stopX, stopY, paint)vẽ là để bạn có thể vẽ bất kỳ đường thẳng nào theo bất kỳ hướng nào trong tầm nhìn. Sau đó, trong hoạt động của tôi, tôi có NoteTextView note = new NoteTextView(this); hy vọng điều này sẽ giúp.


3

rất đơn giản ... để thêm một đường thẳng đứng trong 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"/>

Điều này hoạt động rất tốt khi bạn không thể sử dụng fill_parent cho chiều cao vì chiều cao gốc được đặt thành quấn_content.
Serge Aldoukhov

2

Tùy thuộc vào nơi bạn muốn có đường thẳng đứng, nhưng nếu bạn muốn có đường viền dọc chẳng hạn, bạn có thể có chế độ xem chính có nền có thể vẽ tùy chỉnh. Và sau đó bạn có thể định nghĩa drawable như thế này:

<?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>

Ví dụ này sẽ tạo ra một đường màu đen mỏng 1dp ở phía bên phải của khung nhìn, nó sẽ có thể vẽ này làm nền.


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

Có vẻ như không ai đề cập đến tùy chọn này:

<?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

Bạn có thể sử dụng một hình dạng nhưng thay vì một dòng làm cho nó hình chữ nhật.

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

và trong bố cục của bạn sử dụng ...

<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"/>

Bạn có thể phải chơi với chiều rộng, tùy thuộc vào kích thước của dấu gạch ngang, để đưa nó vào một dòng duy nhất.

Hy vọng điều này sẽ giúp Cheers


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

Để tạo một đường thẳng đứng, chỉ cần sử dụng một hình chữ nhật có chiều rộng 1dp:

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

Không sử dụng stroke, sử dụng solid(là màu "tô") để chỉ định màu của dòng.


-1
 <View
        android:layout_width="2dp"
        android:layout_height="40dp"

        android:background="#ffffff"
        android:padding="10dp" />`
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.