Как сделать форму с закругленным левым верхним скругленным углом и скругленным левым нижним углом?


84

Я хочу создать фигуру с закругленным левым верхним углом и закругленным левым нижним углом:

<?xml version="1.0" encoding="UTF-8"?> 
<shape xmlns:android="http://schemas.android.com/apk/res/android"> 
    <solid android:color="#555555"/>    

    <stroke android:width="3dp"
            android:color="#555555"
            />

    <padding android:left="1dp"
             android:top="1dp"
             android:right="1dp"
             android:bottom="1dp"
             /> 

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

Но форма выше не дала мне того, что я хочу. Получился прямоугольник без закругленных углов.

Ответы:


62

Похоже на ошибку http://code.google.com/p/android/issues/detail?id=939 .

Наконец, мне нужно написать что-то вроде этого:

 <stroke android:width="3dp"
         android:color="#555555"
         />

 <padding android:left="1dp"
          android:top="1dp"
          android:right="1dp"
          android:bottom="1dp"
          /> 

 <corners android:radius="1dp"
  android:bottomRightRadius="2dp" android:bottomLeftRadius="0dp" 
  android:topLeftRadius="2dp" android:topRightRadius="0dp"/> 

Я должен указать android: bottomRightRadius = "2dp" для левого нижнего закругленного угла (здесь еще одна ошибка).


1
Да, я могу подтвердить ваше последнее утверждение / ошибку, что там переключено влево / вправо. То же самое я испытал и в своем приложении. (SDK 2.1). Вы уже отправили отчет об ошибке на b.android.com или уже сообщили об этом там?
Матиас Конрад,

3
Я только что сообщил об ошибке, code.google.com/p/android/issues/detail?id=9161 . Печально то, что после исправления ошибки мне снова приходится менять код :(
user256239

58

Хотя на этот вопрос уже был дан ответ (это ошибка, из-за которой меняются местами bottomLeftRadius и bottomRightRadius), ошибка исправлена ​​в android 3.1 (уровень API 12 - проверено на эмуляторе).

Таким образом, чтобы убедиться, что ваши чертежи выглядят правильно на всех платформах, вы должны поместить «исправленные» версии чертежей (то есть там, где нижний левый / правый радиусы действительно верны в xml) в папку res / drawable-v12 вашего приложения. Таким образом, все устройства, использующие версию Android> = 12, будут использовать правильные файлы для рисования, в то время как устройства, использующие более старые версии Android, будут использовать чертежи «обходного пути», которые находятся в папке res / drawables.


4
Другой вариант - использовать values/dimens.xmlфайл по умолчанию , содержащий инвертированные значения bottom_left и bottom_right, и новый values-v12/dimens.xmlфайл с правильными значениями. Таким образом, вы можете сохранить только одну версию графического XML-файла, и только значение размера будет заменено на основе версии API.
Джо

35

Из документации :

ПРИМЕЧАНИЕ. Каждый угол (изначально) должен иметь радиус больше 1, иначе углы не будут закруглены. Если вы хотите, чтобы определенные углы не скруглялись, можно использовать android: radius для установки радиуса угла по умолчанию больше 1, но затем переопределить каждый угол желаемыми значениями, предоставив ноль ("0dp" ), где не нужны закругленные углы.

Например, вы должны установить, android:radius="<bigger than 1dp>"чтобы иметь возможность делать то, что вы хотите:

<corners 
    android:radius="2dp"
    android:bottomRightRadius="0dp" 
    android:topRightRadius="0dp"/> 

14

Вы также можете использовать очень маленькие числа для своего радиуса ».

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

это было первое, что я попробовал ... но без надежды .... я тестирую Android 2.2 ... любые другие идеи ... Спасибо
Аамир Шах

12

для других есть решение для любого уровня API, вы можете разместить элемент друг над другом, например:

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

<!-- my firt item with 4 corners radius(8dp)
 -->
    <item>
        <shape>
            <solid
                android:angle="270.0"
                android:color="#3D689A" />

            <corners android:topLeftRadius="8dp" />
        </shape>
    </item>
<!-- my second item is on top right for a fake corner radius(0dp)
 -->
    <item
        android:bottom="30dp"
        android:left="50dp">
        <shape>
            <solid android:color="#5C83AF" />
        </shape>
    </item>
<!-- my third item is on bottom left for a fake corner radius(0dp)
 -->
    <item
        android:right="50dp"
        android:top="30dp">
        <shape>
            <solid android:color="#5C83AF" />
        </shape>
    </item>

</layer-list>

результат светлым цветом, чтобы показать вам три элемента:

введите описание изображения здесь

конечный результат:

введите описание изображения здесь

С уважением.


8

Эта ошибка записана здесь . Это ошибка устройств Android с уровнем API ниже 12. Вы должны поместить правильные версии своих макетов в папку drawable-v12, которая будет использоваться для уровня API 12 или выше. А ошибочная версия (углы переключены / перевернуты) того же макета будет помещена в папку с возможностью переноса по умолчанию, которая будет использоваться устройствами с уровнем API менее 12.

Например: мне нужно было создать кнопку с закругленным углом в правом нижнем углу.

В папке 'drawable' - button.xml: мне пришлось сделать скругленный нижний левый угол.

<shape>
    <corners android:bottomLeftRadius="15dp"/>
</shape>

В папке 'drawable-v12' - button.xml: здесь была размещена правильная версия макета для использования на уровне API 12 или выше.

<shape>
    <corners android:bottomLeftRadius="15dp"/>
</shape>

7

попробуй это

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<solid android:color="@color/upkia"/>
<corners android:radius="10dp"
    android:topRightRadius="0dp"
    android:bottomRightRadius="0dp" />
</shape>
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.