Як зробити фігуру із закругленим лівим верхнім кутом та закругленим лівим нижнім кутом?


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 вашого додатка. Таким чином, усі пристрої, що використовують версію андроїда> = 12, використовуватимуть правильні файли, які можна малювати, тоді як пристрої, які використовують старіші версії андроїда, використовуватимуть "обхідні" шляхи, які можна знайти в папці res / drawables.


4
Інший варіант - використовувати values/dimens.xmlфайл за замовчуванням, який містить перевернуті значення bottom_left та bottom_right, а також новий values-v12/dimens.xmlфайл, який має правильні значення. Таким чином ви можете зберегти лише одну версію файлу XML, який можна малювати, і лише значення dimen замінюється на основі версії 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.