Android - có thể vẽ được với các góc tròn ở trên cùng


151

Tôi đã có thể vẽ này để có một hình chữ nhật tròn làm nền:

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

Điều 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ỉ làm tròn các góc trên cùng, vì vậy tôi thay đổi nó thà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 có góc nào được làm tròn và tôi có một hình chữ nhật đơn giản. Tôi đang thiếu gì ở đây?


Đây thực sự không phải là một giải pháp nhưng tôi nghĩ tôi đã từng gặp vấn đề tương tự. Tăng stoke lên 2 pixel, nhưng bạn biết đấy, đó không phải là một giải pháp.
Mã nhà thơ

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

Câu trả lời:


303

Hãy thử đưa ra các giá trị sau:

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

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

EDIT: Xem bình luận của Aleks G bên dưới để biết phiên bản sạch hơn


131
Khám phá điều này hơn nữa, tôi tìm thấy một giải pháp thậm chí còn tốt hơn: <corners android:radius="1dp" android:topLeftRadius="6dp" android:topRightRadius="6dp" android:bottomLeftRadius="0dp" android:bottomRightRadius="0dp"/>- điều này tạo ra các góc dưới cùng hoàn hảo mà không cần làm tròn. Tuy nhiên giải pháp của bạn khá nhiều công việc.
Aleks G

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 (AKA Stroke) xung quanh nó?
nhà phát triển Android

@Aleks G Tôi không thấy rằng cần phải chỉ địnhandroid:radius="1dp"
hmac

@hmac nó là cần thiết. Đọc tài liệu, nó làm cho nó rõ ràng.
Aleks G

@AleksG Vâng tài liệu sai, thử nghiệm trên Samsung 10, Android 9: "Mọi góc phải (ban đầu) phải được cung cấp bán kính góc lớn hơn 1 hoặc 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, a 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 đè "- không đúng, tôi chỉ định dưới cùng bên phải, trên cùng bên phải, trên cùng bên trái là 0 và dưới bên trái + ve và dưới cùng bên trái được uốn cong chính xác
hmac

14

Hãy thử 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.


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

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

11

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

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

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

9

Dựa trên câu trả lời của busylee , đây là cách bạn có thể tạo một drawablecái chỉ có một góc không tròn (trên cùng bên trái, 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>

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


6
@AleksG - Tất nhiên rồi. Nó có liên quan ngày hôm nay như lúc đó (như một 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ách 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, đây 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 nên cập nhật nó. Dù sao đi nữa, tôi chắc chắn rằng SO sẽ không bận tâm thêm vài KB mã ... :)
Dev-iL

2

Tôi đã thử mã của bạn và có một nút góc tròn trên cùng. Tôi đã cho màu sắc như @ffffffvà đột quỵ tôi đã đưa ra #C0C0C0.

thử

  1. Tặng android: bottomLeftRadius = "0.1dp" thay vì 0. nếu nó không hoạt động
  2. Kiểm tra xem cái gì có thể vẽ và độ phân giải của trình giả lập. Tôi đã tạo một thư mục drawable dưới độ phân giải và sử dụng nó. (hdpi, mdpi ldpi) thư mục bạn có XML này. đây là đầu ra của tôi

nhập mô tả hình ảnh ở đây


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 giả lập 1.6 có vấn đề.
Aleks G

1

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

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

Lưu ý Mỗi góc phải (ban đầu) phải được cung cấp bán kính góc lớn hơn 1 hoặc 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, cách khắc phục 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 đè lên từng góc bằng 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.


1

Tạo roung_top_corners.xml trên drawable và sao chép mã dưới đây

<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle" >
<corners
    android:topLeftRadius="22dp"
    android:topRightRadius="22dp"
    android:bottomLeftRadius="0dp"
    android:bottomRightRadius="0dp"
    />
<gradient
    android:angle="180"
    android:startColor="#1d2b32"
    android:centerColor="#465059"
    android:endColor="#687079"
    android:type="linear" />
<padding
    android:left="0dp"
    android:top="0dp"
    android:right="0dp"
    android:bottom="0dp"
    />
<size
    android:width="270dp"
    android:height="60dp"
    /></shape>
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.