2012-01-19 32 views
96

Tôi có thể vẽ này để có một hình chữ nhật tròn như một nền tảng:Android - drawable với góc tròn ở phía trên chỉ

<shape xmlns:android="http://schemas.android.com/apk/res/android"> 
    <solid android:color="@color/white" /> 
    <stroke android:width="1dp" android:color="@color/light_gray" /> 
    <padding android:left="10dp" android:top="10dp" android:right="10dp" android:bottom="10dp" /> 
    <corners android:radius="6dp" /> 
</shape> 

này đang làm việc tốt, như mong đợi.

Bây giờ, tôi muốn thay đổi điều này để chỉ tròn các góc trên cùng, vì vậy tôi thay đổi nó như thế này:

<shape xmlns:android="http://schemas.android.com/apk/res/android"> 
    <solid android:color="@color/white" /> 
    <stroke android:width="1dp" android:color="@color/light_gray" /> 
    <padding android:left="10dp" android:top="10dp" android:right="10dp" android:bottom="10dp" /> 
    <corners android:topLeftRadius="6dp" android:topRightRadius="6dp" 
      android:bottomLeftRadius="0dp" android:bottomRightRadius="0dp"/> 
</shape> 

Nhưng bây giờ không ai trong số các góc được bo tròn và tôi nhận được một hình chữ nhật đơn giản. Tôi đang thiếu gì ở đây?

+0

Điều này thực sự không phải là một giải pháp nhưng tôi nghĩ rằng tôi đã từng có một vấn đề tương tự. Việc tăng stoke lên 2 pixel đã giúp, nhưng bạn biết đó không phải là giải pháp. –

+0

Đây là vấn đề với góc hình dạng: http://code.google.com/p/android/issues/detail?id = 939 – Knickedi

Trả lời

191

Cố gắng đưa ra những giá trị này:

<corners android:topLeftRadius="6dp" android:topRightRadius="6dp" 
     android:bottomLeftRadius="0.1dp" android:bottomRightRadius="0.1dp"/> 

Lưu ý rằng tôi đã thay đổi 0dp-0.1dp.

CHỈNH SỬA: Xem nhận xét của Alex bên dưới để có phiên bản sạch hơn

+95

Khám phá thêm điều này, tôi đã tìm thấy giải pháp tốt hơn nữa: ' '- điều này tạo ra các góc dưới vuông hoàn hảo mà không cần gợi ý làm tròn. Tuy nhiên giải pháp của bạn khá nhiều công trình. –

+1

@AleksG tuyệt vời !! – aqs

+0

Làm thế nào để làm điều đó trong mã, đưa ra một bitmap? Và làm thế nào để thêm phác thảo (đột quỵ AKA) xung quanh nó? –

2

Tôi đã thử mã của bạn. tôi có một nút góc tròn trên cùng. tôi đã cho các màu sắc như @ffffff và srtoke tôi đã cho # C0C0C0. thử 1) cho android: bottomLeftRadius = "0.1dp" thay vì 0. nếu nó không hoạt động 2) kiểm tra những gì có thể drawable và độ phân giải giả lập. tôi tạo ra một thư mục drawable dưới res và sử dụng nó. (hdpi, mdpi ldpi) thư mục bạn có xml này. đây là ouput của tôi

enter image description here

+0

Phiên bản Android này là gì? Ứng dụng của tôi phải chạy trên 1.6 - và trình mô phỏng 1.6 có vấn đề. –

+0

tôi đã thử với Android 2.1 và 2.3 – AD14

11

Cố gắng làm một cái gì đó như thế này:

<?xml version="1.0" encoding="utf-8"?> 
<layer-list xmlns:android="http://schemas.android.com/apk/res/android"> 
    <item android:bottom="-20dp" android:left="-20dp"> 
     <shape android:shape="rectangle"> 
      <solid android:color="@color/white" /> 

      <corners android:radius="20dp" /> 
     </shape> 
    </item> 
</layer-list> 

Có vẻ như không phù hợp để đặt bán kính góc khác nhau của hình chữ nhật. Vì vậy, bạn có thể sử dụng hack này.

+0

Xem câu trả lời của riêng tôi - hoàn toàn có thể chấp nhận được bán kính khác nhau cho các góc khác nhau. –

+0

Tôi đã thử phương pháp này, nó không được chấp nhận, ide nói rằng nó không phù hợp để có rsdius khác nhau và bỏ qua nó – busylee

+0

yeah cùng ở đây nó không cho phép bán kính khác nhau ... – bvsss

7

xây dựng trên busylee's answer, đây là cách bạn có thể làm cho một drawable rằng chỉ có một un góc tròn (góc cao bên, trong ví dụ 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"> 
      <solid android:color="@color/white" /> 
      <!-- A numeric value is specified in "radius" for demonstrative purposes only, 
        it should be @dimen/val_name --> 
      <corners android:radius="10dp" /> 
     </shape> 
    </item> 
    <!-- To keep the TOP-LEFT corner UNROUNDED set both OPPOSITE offsets (bottom+right): --> 
    <item 
     android:bottom="10dp" 
     android:right="10dp"> 
     <shape android:shape="rectangle"> 
      <solid android:color="@color/white" /> 
     </shape> 
    </item> 
</layer-list> 

Xin lưu ý rằng ở trên drawablekhông phải được hiển thị chính xác trong bản xem trước của Android Studio (2.0.0p7). Để xem trước, hãy tạo chế độ xem khác và sử dụng chế độ xem này dưới dạng android:background="@drawable/...".

+0

Cảm ơn. Bạn có nhận ra câu hỏi này là 4 tuổi và giải pháp đã được tìm thấy cách đây 4 năm? –

+6

@AleksG - Tất nhiên. Nó là có liên quan ngày hôm nay như nó sau đó (như bằng chứng - Tôi cần một cái gì đó như thế). Bạn phải biết rằng trong những năm qua một số cách làm việc trở nên không được chấp nhận và có thể cần phải được thay thế bằng những cái hiện đại hơn. Như ** busylee ** đã đề cập, IDE phàn nàn khi xác định bán kính góc khác nhau, không phải là trường hợp với phương pháp hiện tại. Hơn nữa, vì câu hỏi này là lần truy cập đầu tiên của tôi trên Google (iirc), nên tôi có thể cập nhật nó. Nhưng dù sao, tôi chắc chắn SO sẽ không nhớ thêm một vài KB mã nữa ... :) –

3

Trong trường hợp của tôi dưới đây đang

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

     <shape android:shape="rectangle"> 
      <solid android:color="@color/maincolor" /> 

      <corners 
       android:topLeftRadius="10dp" 
       android:topRightRadius="10dp" 
       android:bottomLeftRadius="0dp" 
       android:bottomRightRadius="0dp" 
      /> 
     </shape> 

    </item> 
    </layer-list> 
+0

Thuộc tính trên cùng và dưới cùng trên mục không cần thiết trừ khi bạn muốn có một phần đệm trong khung nhìn, nhưng nếu không thì nó sẽ hoạt động. – RominaV

1

Bạn có thể cần đọc https://developer.android.com/guide/topics/resources/drawable-resource.html#Shape

và bên dưới có một chú.

Lưu ý Mỗi góc phải (ban đầu) được cung cấp bán kính góc lớn hơn 1, nếu không không có góc nào được làm tròn. Nếu bạn muốn các góc cụ thể không được làm tròn, thì công việc xung quanh là sử dụng android: radius để đặt bán kính góc mặc định lớn hơn 1, nhưng sau đó ghi đè từng góc và với các giá trị bạn thực sự muốn, cung cấp số không ("0dp") nơi bạn không muốn các góc tròn.