Главная » Разработка для Android » Создание нестандартных Представлений

0

Создавая полностью новые Представления, вы получаете полный контроль над формированием внешнего вида и поведением  своих программ. Можно создавать  пользовательские интерфейсы, которые идеально  подходят  под нужды пользователей. Чтобы выполнить новый элемент с чистого листа, не- обходимо наследовать один из двух классов — либо View, либо SurfaceView.

Класс View предоставляет объект Canvas, который помимо классов Paint содержит методы для рисования. Используйте их для создания визуального интерфейса на основе растровой  графики.  Затем  вы можете переопреде- лить пользовательские события,  такие как нажатия  клавиш  или касания сенсорного экрана, чтобы обеспечить необходимую интерактивность. Если приложение не должно поддерживать чрезвычайно быструю перерисовку и трехмерную графику,  базовый класс View подойдет в качестве мощного и легковесного  решения.

Класс SurfaceView предоставляет объект Surface, который поддерживает рисование в фоновом потоке и дает возможность использовать OpenGL для трехмерной графики. Это отличный вариант для насыщенных графикой эле- ментов, которые нуждаются в частых обновлениях или должны отображать сложную графическую  информацию, как в случае с играми и трехмерной визуализацией.

Далее вы познакомитесь с двумерными элементами управления, осно- ванными на классе View. Больше информации о классе SurfaceView и о не- которых продвинутых возможностях Canvas, доступных  в Android,  пред- ставлено в главе 15.

Создание нового графического интерфейса

Базовый класс View — это пустая область экрана размером 100 ? 100 пик- селов. Если нужно изменить размер элемента и сделать так, чтобы он выво- дил на экран более привлекательный графический интерфейс, необходимо переопределить методы onMeasure и onDraw.

Внутри метода onMeasure новое Представление вычисляет высоту и ши- рину области, которую оно будет занимать,  исходя из заданных  условий. В методе onDraw происходит рисование на объекте Canvas.

В листинге 4.10 показан каркас кода для нового класса MyView, который будет рассматриваться и дорабатываться в следующих разделах.

Листинг 4.10. Создание нового класса для Представления

public class MyView extends View {

// Конструктор, необходимый для создания элемента внутри кода программы public MyView(Context context) {

super(context);

}

// Конструктор, необходимый для наполнения элемента из файла с ресурсом public MyView (Context context, AttributeSet ats, int defaultStyle) {

super(context, ats, defaultStyle );

}

// Конструктор, необходимый для наполнения элемента из файла с ресурсом public MyView (Context context, AttributeSet attrs) {

super(context, attrs);

}

@Override

protected void onMeasure(int wMeasureSpec, int hMeasureSpec) {

int measuredHeight = measureHeight(hMeasureSpec);

int measuredWidth = measureWidth(wMeasureSpec);

// Вы ДОЛЖНЫ сделать вызов метода setMeasuredDimension,

// иначе получится выброс исключения при

// размещении элемента внутри разметки. setMeasuredDimension(measuredHeight, measuredWidth);

}

private int measureHeight(int measureSpec) {

int specMode = MeasureSpec.getMode(measureSpec);

int specSize = MeasureSpec.getSize(measureSpec);

[ … Вычисление высоты Представления … ]

return specSize;

}

private int measureWidth(int measureSpec) {

int specMode = MeasureSpec.getMode(measureSpec);

int specSize = MeasureSpec.getSize(measureSpec);

[ … Вычисление ширины Представления  … ]

return specSize;

}

@Override

protected void onDraw(Canvas canvas) {

[ … Рисуйте здесь ваш графический интерфейс … ]

}

}

ВНИМАНИЕ

Внутри обработчика onMeasure вызывается метод setMeasuredDimension. Вы должны всегда выполнять это действие, иначе ваш элемент выбросит исключение, когда родительский контейнер попытается разместить его на экране.

Источник: Майер P. Android 2 : программирование приложений для планшетных компьютеров и смартфонов : [пер. с англ. ] / Рето Майер. — М. : Эксмо, 2011. — 672 с. — (Мировой компьютерный бестселлер).

По теме:

  • Комментарии