
- •Глава 4
- •ViewGroup. Правильное использование разметки чрезвычайно важно при
- •Знакомство с Представлениями
- •ViewGroup — это производный от View класс, спроектированный для
- •Знакомство с менеджерами компоновки
- •Использование разметки
- •Оптимизация разметки
- •Изменение существующих Представлений
- •5. Чтобы отобразить лист, переопределите метод onDraw и нарисуйте
- •Создание нового графического интерфейса
- •Внимание
- •10 Dp и такой же толщины контур. Результат представлен на рис. 4.3.
- •LayerDrawable
- •StateListDrawable
- •LevelListDrawable
- •ImageView.SetImageLevel(5);
- •Ресурс NinePatch
- •800 480 И 854 480). Точно так же физические размеры экрана начинаются
Изменение существующих Представлений
Android содержит набор Представлений, которые способны удовлетворить
большинство потребностей пользовательского интерфейса. Изменяя их, вы
избегаете повторной реализации существующего поведения, адаптируя при
этом пользовательский интерфейс и функциональность под требования
своего приложения.
Чтобы разработать новое Представление, основанное на уже существу-
ющем элементе, создайте класс, который его наследует. Этот процесс по-
казан в листинге 4.5.
140 бет
Листинг 4.5. Расширение элемента TextView
import android.content.Context;
import android.util.AttributeSet;
import android.widget.TextView;
public class MyTextView extends TextView {
public MyTextView (Context context, AttributeSet attrs, int defStyle)
{
super(context, attrs, defStyle);
}
public MyTextView (Context context) {
super(context);
}
public MyTextView (Context context, AttributeSet attrs) {
super(context, attrs);
}
}
Чтобы изменить внешний вид или поведение нового Представления,
переопределите и расширьте соответствующие обработчики событий.
В следующем дополнении к листингу 4.5 переопределяется метод onDraw,
чтобы изменить внешний вид элемента, а также обработчик onKeyDown,
чтобы добавить реакцию на нестандартные нажатия клавиш:
public class MyTextView extends TextView {
public MyTextView (Context context, AttributeSet ats, int defStyle) {
super(context, ats, defStyle);
}
public MyTextView (Context context) {
super(context);
}
public MyTextView (Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
public void onDraw(Canvas canvas) {
[ ... Нарисуйте что-либо на Холсте под текстом ... ]
// Render the text as usual using the TextView base class.
super.onDraw(canvas);
[ ... Нарисуйте что-либо на Холсте над текстом ... ]
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent keyEvent) {
141 бет
[ ... Обработайте каким-то образом ... ]
[ ... нажатия конкретных клавиш ... ]
// Используйте уже имеющуюся функциональность, реализованную
// в базовом классе, чтобы реагировать на нажатия клавиш
return super.onKeyDown(keyCode, keyEvent);
}
}
Обработчики событий, доступные внутри Представлений, более подробно
будут рассмотрены ниже в этой главе.
Изменение приложения To-Do List. Приложение To-Do List из главы 2
использует элементы TextView для отображения каждой строки в спи-
ске ListView. Вы можете изменить внешний вид списка, наследовав класс
TextView и переопределив метод onDraw.
В этом примере1 вы создадите новое Представление TodoListItemView,
которое будет выводить элементы списка так, как будто они записаны в бу-
мажном блокноте. По завершении измененная программа To-Do List должна
выглядеть, как на рис. 4.1.
Рис. 4.1.
1 Все фрагменты кода в этом примере — часть проекта Todo List из главы 4, их можно за-
грузить с сайта Wrox.com.
142 бет
1. Создайте новый класс TodoListItemView, который наследует TextView.
Добавьте заглушку для переопределения метода onDraw, реализуйте
конструктор, в котором вызывается новый метод-заглушка init.
package com.paad.todolist;
import android.content.Context;
import android.content.res.Resources;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.util.AttributeSet;
import android.widget.TextView;
public class TodoListItemView extends TextView {
public TodoListItemView (Context context, AttributeSet ats, int ds) {
super(context, ats, ds);
init();
}
public TodoListItemView (Context context) {
super(context);
init();
}
public TodoListItemView (Context context, AttributeSet attrs) {
super(context, attrs);
init();
}
private void init() {
}
@Override
public void onDraw(Canvas canvas) {
// Используйте родительский класс TextView для вывода текста.
super.onDraw(canvas);
}
}
2. Создайте новый ресурс colors.xml в каталоге res/values. Добавьте
значения, описывающие цвета бумаги, кромки страницы, линии
и текста.
<?xml version="1.0" encoding="utf-8"?>
<resources>
<color name="notepad_paper">#AAFFFF99</color>
<color name="notepad_lines">#FF0000FF</color>
<color name="notepad_margin">#90FF0000</color>
<color name="notepad_text">#AA0000FF</color>
</resources>
3. Создайте новый файл dimens.xml и добавьте в него значение, опи-
сывающее ширину кромки страницы.
143 бет
<?xml version="1.0" encoding="utf-8"?>
<resources>
<dimen name="notepad_margin">30dp</dimen>
</resources>
4. Закончив описание ресурсов, можно начинать изменять внешний
вид TodoListItemView. Создайте новые приватные поля для хране-
ния объектов Paint, которые вы будете использовать при рисовании
фона и кромки бумажного листа. Также создайте поля для цвета листа
и ширины кромки.
Наполните кодом метод init, добавив в него создание объектов Paint
и получение экземпляров тех ресурсов, которые вы создали в двух
предыдущих шагах.
private Paint marginPaint;
private Paint linePaint;
private int paperColor;
private float margin;
private void init() {
// Получите ссылку на таблицу ресурсов.
Resources myResources = getResources();
// Создайте кисти для рисования, которые мы будем использовать в методе
onDraw.
marginPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
marginPaint.setColor(myResources.getColor(R.color.notepad_margin));
linePaint = new Paint(Paint.ANTI_ALIAS_FLAG);
linePaint.setColor(myResources.getColor(R.color.notepad_lines));
// Получите цвет фона для листа и ширину кромки.
paperColor = myResources.getColor(R.color.notepad_paper);
margin = myResources.getDimension(R.dimen.notepad_margin);
}