Source Code
English translation
В качестве следующего упражнения, я покажу как сделать диалог, похожий на iPhone AlertView.
Мы не будем использовать для этого какие-либо файлы с картинками. Только XML.
В действительности это не сложно. Для начала создадим define xml-drawable для кнопки:
Здесь у нас два слоя. Первый слой – прямоугольник с градиентом. Второй слой – прямоугольник, сдвинутый вверх на 20dip. Этот слой должен перекрывать половину первого слоя. В итоге, реальная кнопка должна быть высотой в 40dip .
Теперь определим содержимое диалога – заголовок, сообщение и кнопка OK:
И последнее - фон диалога будет определен в коде. На нужен будет "drawable" с тремя слоями – прямоугольник с белой окантовкой, прямоугольник с основным фоновым цветом и прямоугольник с глянцем.
Для того, чтобы белая окантовка была видна, в первом слое устанавливаем отступы:
Более сложные вещи - в классе GlossDrawable. Перегружаем метод onDraw для расчета эффекта глянца.
Картинка, описывающая расчеты:
По теореме Пифагора находим стороны треугольника:
Далее, используя формулу Герона, находим площадь треугольника:
И радиус описанной окружности:
Теперь рисуем окружность чуть ниже (на 1/8 высоты прямоугольника). Центр окружности:
Прямоугольник для отрисовки окружности:
И, применяя градиент, получаем:
Используйте эту же технику для создания "info" и "confirm" диалогов. Все, что необходимо сделать - это поменять цвет фона и изменить лэйаут.
Спасибо за внимание.
English translation
В качестве следующего упражнения, я покажу как сделать диалог, похожий на iPhone AlertView.
Мы не будем использовать для этого какие-либо файлы с картинками. Только XML.
В действительности это не сложно. Для начала создадим define xml-drawable для кнопки:
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" > <item> <shape android:shape="rectangle" > <corners android:radius="8dip" /> <gradient android:angle="270" android:endColor="#FF440000" android:startColor="#FF990000" android:type="linear" /> </shape></item> <item android:top="20dip"> <shape android:shape="rectangle" > <corners android:bottomLeftRadius="8dp" android:bottomRightRadius="8dp" /> <solid android:color="#40000000" /> </shape></item> </layer-list>
Здесь у нас два слоя. Первый слой – прямоугольник с градиентом. Второй слой – прямоугольник, сдвинутый вверх на 20dip. Этот слой должен перекрывать половину первого слоя. В итоге, реальная кнопка должна быть высотой в 40dip .
Теперь определим содержимое диалога – заголовок, сообщение и кнопка OK:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_gravity="center_horizontal|center_vertical" android:orientation="vertical" > <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/alert_wrapper" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_marginLeft="20dip" android:layout_marginRight="20dip" android:gravity="center_horizontal" android:orientation="vertical" > <TextView android:id="@+id/dialog_title" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="5dip" android:text="Header container" android:textColor="#ffffff" android:textSize="17dip" android:textStyle="bold" /> <TextView android:id="@+id/dialog_message" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_margin="10dip" android:gravity="center_horizontal" android:maxLines="5" android:scrollbars="vertical" android:text="Text container" android:textColor="#ffffff" android:textSize="15dip" /> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_marginBottom="10dip" android:layout_marginTop="10dip" android:gravity="center_horizontal" android:orientation="horizontal" > <Button android:id="@+id/ok" android:layout_width="fill_parent" android:layout_height="40dip" android:layout_marginBottom="10dip" android:layout_marginLeft="10dip" android:layout_marginRight="10dip" android:background="@drawable/iphone_style_button" android:text="@string/ok" android:textColor="@color/White" android:textSize="17dip" android:textStyle="bold" /> </LinearLayout> </LinearLayout> </LinearLayout>
И последнее - фон диалога будет определен в коде. На нужен будет "drawable" с тремя слоями – прямоугольник с белой окантовкой, прямоугольник с основным фоновым цветом и прямоугольник с глянцем.
Для того, чтобы белая окантовка была видна, в первом слое устанавливаем отступы:
// Layers array Drawable[] arr = new Drawable[3]; float roundedCorner[] = new float[] { 8, 8, 8, 8, 8, 8, 8, 8 }; // First layer - to make a border GradientDrawable first = new GradientDrawable(); first.setShape(GradientDrawable.RECTANGLE); first.setCornerRadii(roundedCorner); first.setStroke(2, Color.WHITE); // Second layer - background GradientDrawable second = new GradientDrawable(); second.setShape(GradientDrawable.RECTANGLE); second.setCornerRadii(roundedCorner); second.setColor(Color.argb(255, 127, 0, 0)); // Third layer - for the gloss effect GlossDrawable third = new GlossDrawable(); arr[0] = first; arr[1] = second; arr[2] = third; LayerDrawable background = new LayerDrawable(arr);
Более сложные вещи - в классе GlossDrawable. Перегружаем метод onDraw для расчета эффекта глянца.
Картинка, описывающая расчеты:
По теореме Пифагора находим стороны треугольника:
Далее, используя формулу Герона, находим площадь треугольника:
И радиус описанной окружности:
Теперь рисуем окружность чуть ниже (на 1/8 высоты прямоугольника). Центр окружности:
int centerX = (int) shape.getWidth() / 2; int centerY = (int) (-radius + shape.getHeight() / 2);
Прямоугольник для отрисовки окружности:
RectF rectf = new RectF(shape.getWidth() / 2 - radius, shape.getHeight() / 4 - radius * 2, shape.getWidth() / 2 + radius, shape.getHeight() / 4);
И, применяя градиент, получаем:
Используйте эту же технику для создания "info" и "confirm" диалогов. Все, что необходимо сделать - это поменять цвет фона и изменить лэйаут.
Спасибо за внимание.
Комментариев нет:
Отправить комментарий