2012-01-12 34 views
13

Tôi có một mục tiêu đơn giản. Tôi muốn có một nền màu xám nhạt trên FrameLayout của tôi với một đường phân chia màu đen bên dưới nó (chỉ dưới không, không phải tất cả xung quanh). Cho đến nay tôi có điều này:Làm thế nào để có được lực hấp dẫn 'đáy' làm việc trên một drawable trong xml

<?xml version="1.0" encoding="utf-8"?> 
    <layer-list xmlns:android="http://schemas.android.com/apk/res/android"> 
    <item> 
    <shape android:shape="rectangle" android:gravity="center"> 
     <solid android:color="#EEEEEE" /> 
    </shape> 
    </item> 
    <item> 
    <shape android:shape="line" android:gravity="bottom" > 
     <stroke android:width="1dip" android:color="#010101"/> 
    </shape> 
    </item> 
    </layer-list> 

Nhưng nó vẽ đường thẳng qua tâm, nghĩa là bỏ qua trọng lực = 'đáy' bit. Làm thế nào tôi có thể sửa lỗi này?

EDIT: Câu hỏi này là rất cũ. Câu trả lời được chọn có thể hoặc không thể phù hợp với các API hiện tại, v.v. Bạn được khuyến khích bắt đầu câu hỏi của riêng bạn thay vì thêm vào câu hỏi này, điều này không còn được giám sát nữa.

Trả lời

5

tôi khuyên bạn nên sử dụng một hình ảnh chín miếng vá cho điều này - đây là một ví dụ mà nên thực hiện công việc:

Example nine-patch image

(! Nó chỉ nhỏ nhưng nó là có)

Nếu bạn Đặt điều này trong thư mục drawable của bạn và thiết lập nền FrameLayout của bạn để nó sau đó bạn sẽ nhận được kết quả mong muốn. Nội dung sẽ xuất hiện trong vùng màu xám và pixel # 010101 sẽ được kéo dài theo chiều ngang để tạo thành một dòng ở dưới cùng. Chỉ cần đảm bảo giữ phần mở rộng .9.png để đảm bảo nó được tải dưới dạng bản vá chín.

Hy vọng rằng sẽ giúp bạn

+1

Đó là một điểm tốt, tôi có thể làm theo cách đó. Trong thực tế, tôi sẽ nhưng tôi vẫn muốn được quan tâm để biết nóng để có được thẻ trọng lực làm việc cho dòng đó - có vẻ như một giải pháp đẹp hơn rất nhiều cho tôi, nhưng cảm ơn cho đề xuất của bạn. –

+1

Không đề cập đến thẻ trọng lực [ở đây] (http://developer.android.com/reference/android/graphics/drawable/ShapeDrawable.html).Tôi không thể nhìn thấy bất kỳ cách nào để đạt được điều này bằng cách sử dụng xml tinh khiết, bạn có thể tạo ShapeDrawable trong mã và thiết lập giới hạn của nó dựa trên các giới hạn của bố trí? – kingraam

17

Đáng tiếc là tôi đã không tìm thấy một cách để có được mức độ nghiêm trọng làm việc cho drawables, nhưng tôi thấy làm thế nào bạn có thể đạt được những gì bạn muốn với xml tinh khiết:

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

Chúc may mắn :)

+1

usman

22

Tôi cũng đã phải vật lộn với điều này. Về cơ bản, để tạo ra một biên giới ở phía dưới, bạn phải suy nghĩ theo hướng ngược lại từ những gì bạn mong đợi. Bạn bắt đầu với một hình chữ nhật với màu viền của bạn. Ngày đầu đó, bạn vẽ màu thực tế, với một bù đắp từ phía dưới. tôi sử dụng này:

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

    <!-- CREATE A RECTANGLE WITH YOUR BORDER COLOR --> 
    <item> 
     <shape android:shape="rectangle" > 
      <solid android:color="#fff"/> 
     </shape> 
    </item> 

    <!-- NOW DEFINE THE NORMAL COLOR--> 
    <item android:bottom="BOTTOM_BORDER_THICKNESS E.G. 4dp"> 
     <shape android:shape="rectangle" > 
      <solid android:color="#ccc"/> 
     </shape> 
    </item> 
</layer-list> 

Hoặc, như Juan Pablo Saraceno gợi ý:

<layer-list xmlns:android="http://schemas.android.com/apk/res/android" > 
    <item> 
     <color android:color="YOUR_BORDER_COLOR" /> 
    </item> 
    <item android:top="YOUR_BORDER_THICKNESS"> 
     <color android:color="YOUR_BG_COLOR" /> 
    </item> 
</layer-list> 
+3

Đây là một câu trả lời thực sự tốt và xứng đáng để được IMHO vị trí tốt hơn. Tôi nghĩ là một chút xấu hổ mà android không hỗ trợ lực hấp dẫn một cách thích hợp và buộc một người phải làm điều này. Nó làm việc cho tôi ngay cả khi sử dụng các thẻ thay vì hình chữ nhật, hình dạng, vì vậy thậm chí còn đơn giản hơn.

+5

Vấn đề duy nhất là tôi tạo ra quá mức, bởi vì bạn vẽ một hình chữ nhật đầy đủ với màu biên giới của bạn chỉ để rút nó bằng thực tế hình chữ nhật. Nếu không có trọng lực thực sự vẫn còn 9-patch thắng. –

+1

Điều này sẽ không hoạt động nếu bạn cần một phần trên mờ và một phần dưới rắn. Vì vậy, tôi đoán tôi sẽ * có * để làm việc với một bản vá chín? –

1
<?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/Black" /> 
     </shape> 
    </item> 
    <item android:bottom="5dp"> 
     <shape android:shape="rectangle" > 
      <solid android:color="@color/White" /> 
     </shape> 
    </item> 

</layer-list> 
2

này hoạt động!

<item> 
     <bitmap 
     android:gravity="left|bottom" 
     android:src="@drawable/myDrawable" /> 
</item> 
+0

Nộp nó không cho ShapeDrawable vì nó là một drawable, không phải là một Bitmap. – nsvir

1

Vâng, đó là câu hỏi khá cũ, nhưng không ai trong số các câu trả lời dường như để trả lời các câu hỏi thực tế (làm thế nào để làm cho gravity làm việc) vì vậy đây là một ví dụ làm việc:

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

    <item> 
     <color android:color="#2196F3"/>  <!-- Background color --> 
    </item> 

    <item android:gravity="bottom"> 
     <shape> 
      <size android:height="10dp" />  <!-- I would suggest 1dp --> 
      <solid android:color="#F50057" /> <!-- Line color --> 
     </shape> 
    </item> 
</layer-list> 

Bằng cách tương tự, nếu bạn muốn sử dụng trọng lực left hoặc right thay đổi thuộc tính height thành width

Các vấn đề liên quan