76 Глава 4 • Введение в 2D-графику
Sudokuv2/src/org/example/sudoku/PuzzleView.java private float width; // ширина одного тайла
private float height; // высота одного тайла
private int selX; // координата x выделенной области
private int selY; // координата y выделенной области
private final Rect selRect = new Rect();
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
width = w / 9f;
height = h / 9f;
getRect(selX, selY, selRect);
Log.d(TAG, "onSizeChanged: width " + width + ", height "
+ height);
super.onSizeChanged(w, h, oldw, oldh);
}
private void getRect(int x, int y, Rect rect) {
rect.set((int) (x * width), (int) (y * height), (int) (x
* width + width), (int) (y * height + height));
}
Мы и�пол�зуе�
onSizeChanged()
для вычи�ления раз�ера каждо�о тайла (�ле�ен�
та и�рово�о изображения) на �кране (1/9 от полно�о раз�ера в��вера по ширине
и вы�оте)� Обратите вни�ание на то� что �то — чи�ло � плава��ей запятой� по�то�
�у вполне воз�ожно� что �ы получи� дробное количе�тво пик�елей�
selRect
— �то
пря�о у�ол�ник� которы� �ы во�пол�зуе��я позже� чтобы от�леживат� положение
кур�ора�
ДРУГОЙ СПОСОБ СДЕЛАТЬ ЭТО Когда я писал этот пример, я перепробовал несколько различных подходов, таких как исполь-
зование кнопки для каждого тайла или объявление решетки классов ImageView в XML . После
многих неудачных попыток я обнаружил, что подход с использованием одного вьювера для
всего пазла и рисования линий и чисел внутри него обеспечивает наивысшую скорость и про-
стоту . Хотя и у него есть свои недостатки, такие как необходимость рисовать выделение и яв-
ная обработка событий клавиатуры и тач-скрина . Когда вы разрабатываете свою собственную
программу, я рекомендую сначала испробовать стандартные виджеты и вьюверы и переходить
к собственным рисованным объектам, только если стандартные виджеты вам не подходят .
На данный �о�ент �ы �оздали в��вер для и�ры и �ы знае�� како�о он раз�ера�
Следу��ий ша� закл�чает�я в ри�овании решетки из линий� которые разделя�т
клетки на и�ровой до�ке�
Рисование игровой доски
������� вызывает �етод
onDraw()
в��вера каждый раз� ко�да л�бая е�о ча�т� нуж�
дает�я в обновлении� Про�е �оворя�
onDraw()
делает вид� что вы во��оздаете ве��
�кран � нуля� В реал�но�ти вы �ожете ри�оват� тол�ко на �ален�кой ча�ти в��вера�
определенной пря�оу�ол�нико� хол�та� ������� �а� заботит�я о �оздании зоны
ри�ования для ва��
4 .2 . Добавление графики к Sudoku 77 Начне� � определения не�кол�ких новых �ветов в
res/values/color .xml
� � которы�и
�ожно будет �к�пери�ентироват��