Как можно обойти проблему Android 9161, где поменялись местами bottomRightRadius и bottomLeftRadius? - PullRequest
18 голосов
/ 14 мая 2011

Моя цель:

Figure 1: The Goal
Рисунок 1: Цель

Итак, прежде чем я узнал об этой проблеме, вот что я попробовал.

Во-первых, базовый макет:

<LinearLayout
    android:orientation="horizontal"
    android:layout_below="@id/heading"
    android:layout_marginTop="10dp"
    android:layout_width="@dimen/horizontal_two_button_width"
    android:layout_height="@dimen/button_height_small" >

    <Button
        android:id="@+id/button_one"
        android:layout_width="0dp"
        android:layout_weight="1.0"
        android:layout_height="fill_parent"
        android:padding="10dp"
        style="@style/ButtonText"
        android:background="@drawable/button_left_green" />

    <Button
        android:id="@+id/button_two"
        android:layout_width="0dp"
        android:layout_weight="1.0"
        android:layout_height="fill_parent"
        android:padding="10dp"
        style="@style/ButtonText"
        android:background="@drawable/button_right_green" />      

</LinearLayout>

Рисуемое «button_left_green»:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@drawable/button_left_green_pressed"
        android:state_pressed="true" />
    <item android:drawable="@drawable/button_left_green_focused"
        android:state_focused="true" />
    <item android:drawable="@drawable/button_left_green_default" />
</selector>

И, например, рисованное «button_left_green_default»:

<?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/shadow" />
            <corners
                android:radius="5dp"
                android:topLeftRadius="5dp"
                android:topRightRadius="0dp"
                android:bottomLeftRadius="5dp"
                android:bottomRightRadius="0dp" />      
        </shape>
    </item>
    <item
        android:bottom="19dp"
        android:top="1dp"
        android:left="1dp"
        android:right="1dp" >

        <shape android:shape="rectangle">
            <gradient
                android:startColor="@color/button_left_green_top_gradient_start"
                android:endColor="@color/button_left_green_top_gradient_end"
                android:angle="270" />

            <corners
                android:radius="5dp"
                android:topLeftRadius="5dp"
                android:topRightRadius="0dp"
                android:bottomLeftRadius="0dp"
                android:bottomRightRadius="0dp" />
        </shape>
    </item>

    <item
        android:top="19dp"
        android:bottom="1dp"
        android:left="1dp"
        android:right="1dp" >

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

            <corners
                android:radius="5dp"
                android:topLeftRadius="0dp"
                android:topRightRadius="0dp"
                android:bottomLeftRadius="5dp"
                android:bottomRightRadius="0dp" />
        </shape>
    </item>
</layer-list>

Итак, после всего этого я получил изображение на рисунке 2:
Figure 2: Take One
Рисунок 2: Take One

После двойной проверкиопределение нижних углов, я был убежден, что сошел с ума, пока не нашел известную проблему: http://code.google.com/p/android/issues/detail?id=9161

Я бы предпочел не просто поменять их местами, потому что тогда, если / когда проблема устранена, кнопкибудет сломан в более новых версиях.

Одна идея, которую я имел, состояла в том, чтобы оставить настоящие кнопки как обычные прямоугольники (т.е. без угловых радиусов) и обернуть обе кнопки скругленным прямоугольником.Я добавил фон для рисования в LinearLayout, у которого были закругленные углы, но углы кнопок перекрывали край закругленного края LinearLayout (см. Рисунок 3).

Figure 3: Take Two
Рисунок 3: ВзятьДва

Как сохранить фон кнопки в пределах фона родительского элемента для рисования?Или у вас есть другие предложения о том, как обойти эту ошибку?

Ответы [ 5 ]

17 голосов
/ 05 января 2012

Другое решение - создать еще одну папку с именем drawable-v12.

Здесь укажите правильный радиус (так: bottomLeftRadius, topLeftRadius), а в исходной папке для рисования вставьте поменяемые значения. Затем 3.1+ будет использовать папку v12, а до версии 3.1 будет использовать папку drawable.

15 голосов
/ 16 мая 2011

Это похоже на такой взлом, но это сработало.

Кнопки изначально состояли из (1) внешней тени, (2) градиента верхней половины и (3) сплошного нижнего цвета,Вот что я сделал:

  1. Сделал верхнюю и нижнюю половинки каждая закругленными по всем четырем углам.Это слева (1) разрыв в середине левой и правой сторон и (2) закругленные углы справа.
  2. Создан маленький прямоугольник, чтобы заполнить разрыв в середине слева.
  3. Создан еще один маленький прямоугольник, чтобы заполнить пробел в правой средней части и сделать верхний и нижний углы в правом квадрате.

Вот пример XML для нормального состояниялевая кнопка.

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

    <!-- Main part of button -->
    <item
        android:bottom="20dp"
        android:right="5dp" >

        <shape android:shape="rectangle">
            <solid android:color="@color/button_normal_green_top" />
            <corners android:radius="5dp" />
        </shape>
    </item>

    <item
        android:top="20dp"
        android:right="5dp" >

        <shape
            android:shape="rectangle" >
            <solid android:color="@color/button_normal_green_bottom" />
            <corners android:radius="5dp" />
        </shape>
    </item>

    <!-- Patch left middle part of button, which was left empty due to rounded 
    corners on top and bottom halves of button -->
    <item
        android:top="5dp"
        android:bottom="20dp"
        android:right="5dp" >

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

    <item
        android:top="20dp"
        android:bottom="5dp"
        android:right="5dp" >

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

    <!-- Patch right middle and make right side corners square -->
    <item
        android:bottom="20dp"
        android:left="15dp" >

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

    <item
        android:top="20dp"
        android:left="15dp" >

        <shape android:shape="rectangle" >
            <solid android:color="@color/button_normal_green_bottom" />
        </shape>
    </item>
</layer-list>

Я, однако, потерял градиент в верхней половине, но я могу жить с двухцветной кнопкой.Вот как выглядит результат:
Two Buttons Solution

1 голос
/ 07 марта 2014

Лучшее решение:

  • Создать другую папку values-12
  • Создать dimensions.xml файл в values-12.
  • Поместите 2 свойства измерения в values-12/dimensions.xml для левого нижнего края, и радиус нижнего правого угла.
  • Поместите 2 свойства измерения в values/dimensions.xml для значений радиуса нижнего левого и правого нижнего углов, но не забудьте перевернуть их.

Используйте значения размеров при назначении радиуса угла вместо жесткого кодирования их в чертежах. Когда загружается pre 3.1, он будет использовать значения радиуса обратного угла в папке values. Когда загружается 3.1+, он будет использовать правильные значения углового радиуса в папке values-12.

Почему это лучше? Вам не нужно дублировать нарисованный код. Теперь вы можете изменить любой код, не относящийся к угловым радиусам, без необходимости обновления 2 или более мест.

1 голос
/ 16 ноября 2011

Кажется, это было исправлено в Android 3.0 .И есть комментарий к этой проблеме, который объясняет, как обеспечить обратную совместимость.

1 голос
/ 28 октября 2011

Должно сработать, если мы предоставим уже измененную конфигурацию слева направо; так что при обмене ошибками будет восстановлена ​​необходимая конфигурация, как показано ниже для кнопки, только изогнутой слева, и кнопки с острой правой стороной

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