2010-04-17 24 views
120

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

Để thực hiện một 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 đặt ra là, làm thế nào để làm cho dòng này dọc?

Có, có các cách giải quyết khác, 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ẽ, nếu nó bao gồm nhiều phần tử <item>.

Bất kỳ ai cũng có cơ hội 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 cứ ai trên một cuộc thập tự chinh tài liệu Android - bạn có thể tìm thấy điều này hữu ích: Missing Android XML Manual

CẬP NHẬT

tôi thấy không có cách nào khác ngoài cái mà tôi đánh dấu là chính xác. Nó lừa mặc dù cảm thấy một chút "nặng", do đó nếu bạn tình cờ biết được câu trả lời không quên chia sẻ;)

Trả lời

319

Thay vì một hình dạng, bạn có thể thử một 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 nghĩ rằng nó sẽ làm việc cho các đường thẳng đứng là tốt.

Sử dụng:

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

cho một đường ngang.

+2

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

+0

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

86

Bạn có thể lồng hình dạng của mình bên trong 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à thông số bố cục được xác định trong bố cục xml sẽ là thứ nguyên được sử dụng để vẽ hình gốc. 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_width là 30dp trong xml bố cục của mình. Nhưng chiều rộng cuối cùng cũng sẽ là 30dp trong trường hợp đó, có khả năng không mong muốn đối với 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ị của độ dài mong muốn của bạn cho dòng. Tôi không thể tìm ra cách sửa lỗi này.

Điều này có vẻ là giải pháp "android way", nhưng trừ khi có một số sửa chữa hoặc giải pháp cho vấn đề thứ nguyên tôi đề cập thì điều này có thể sẽ không hiệu quả với hầu hết mọi người. Những gì chúng tôi thực sự cần là thuộc tính định hướng ở dạng </> hoặc < đột quỵ/>.

Bạn cũng có thể thử tham khảo drawable khác trong thuộc tính 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 này và hy vọng nó sẽ có vấn đề tương tự.

- EDIT -

Ồ, tôi thực sự đã tìm ra cách khắc phục. 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. Chẳng hạn như:

<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ẽ làm việc cho 99% các thiết bị .... chỉ cần biết, có những thiết bị ra khỏi đó sẽ buộc đóng nếu bạn làm điều này. Một số thiết bị gặp khó khăn khi làm tăng biên độ âm –

+0

@cephus Tôi sử dụng mã đầu tiên của bạn, nhưng tôi cần dòng ở đầu chế độ xem. Nó ở giữa tầm nhìn của tôi. Làm thế nào tôi có thể thiết lập một lực hấp dẫn cho nó (bên trong file xml hình dạng)? – Behzad

15
<?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 kích thước cố định ở chiều cao dp

4

Tôi cần thêm chế độ xem của mình theo cách động/lập trình, vì vậy việc thêm chế độ xem bổ sung sẽ rất cồng kềnh. Chiều cao 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 trên blog here về việc mở rộng TextView, ghi đè onDraw() và vẽ trong dòng, vì vậy tôi đã triển khai và 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 thông số DrawLine là drawLine(startX, startY, stopX, stopY, paint), do đó bạn có thể rút ra bất kỳ đường thẳng trong bất kỳ hướng trên xem. 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ẽ hữu ích.

9

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

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

Tôi cần nền với biên giới ở bên trái, bên phải, phía dưới và điều này làm việc cho tôi, cảm ơn! –

+0

Tuyệt vời, với điều này tôi quản lý để tạo ngăn chia gọn gàng trong LinearLayout của tôi ('showDividers =" middle "'). Để có bộ chia 2dp, tôi cần chỉ định 'android: left =" 3dp "' tại đây. – Jonik

+0

Mẹo: để làm cho điều này hữu ích dễ hiểu hơn, hãy sử dụng '@android: color/transparent' thay vì hardcoding' @ color/background_color'. – Jonik

1

Bạn có thể sử dụng hình dạng thay vì một đường thẳng làm 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 này ...

<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 độ rộng, tùy thuộc vào kích thước của dấu gạch ngang, để có được nó vào một đĩa đơn hàng.

Hope this helps Cheers

3

của nó rất đơn giản ... để thêm một đường thẳng đứng trong xml android ...

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

Công trình này tuyệt vời khi bạn có thể ' t sử dụng fill_parent cho chiều cao vì chiều cao gốc được đặt thành wrap_content. –

2

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

<?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 một đường kẻ sọc đen 1dp ở bên phải của chế độ xem, điều này có thể vẽ được làm nền.

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

    .......... 
    ....... 
    ...... 
-2

Rất đơn giản và tôi nghĩ cách tiếp cận tốt hơn.

<TextView 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:textAppearance="?android:attr/textAppearanceMedium" 
      android:text="Section Text" 
      android:id="@+id/textView6" 
      android:textColor="@color/emphasis" 
      android:drawableBottom="@drawable/underline"/> 

gạch dưới.xml

<?xml version="1.0" encoding="utf-8"?> 
<shape 
     xmlns:android="http://schemas.android.com/apk/res/android" 
     android:shape="rectangle"> 
     <size android:width="1000dp" android:height="2dp" /> 
     <solid android:color="@color/emphasis"/> 
</shape> 
+0

Đây là một đường ngang, không phải là một đường thẳng đứng. –

+0

Ngoài ra, không cần android: width = "1000dp". Cứ để nó ra. –

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

     android:background="#ffffff" 
     android:padding="10dp" />` 
10

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

Hãy giải thích thêm một chút lý do tại sao đây là câu trả lời hay hơn ... – fijas

+5

Đây chắc chắn là câu trả lời tốt hơn (hoặc tốt nhất) vì, trong khi câu trả lời của @ commonsware đủ cho các đường thẳng đứng bình 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 có thể hoạt động đúng. –

0

Để thực hiện một đường thẳng đứng, chỉ cần sử dụng một hình chữ nhật với chiều rộng của 1dp:

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

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