Новое в Android - рисование вида во время выполнения - PullRequest
6 голосов
/ 29 марта 2010

Привет всем,

Я только начинаю разработку для Android. Я пытаюсь портировать одно из своих приложений для iPhone, но я немного растерялся из-за того, как нарисовать представление во время выполнения (представление, не объявленное в XML). По сути, я хочу нарисовать простой прямоугольник, но затем иметь возможность манипулировать его рамкой после рисования.

Извините, если это действительно очень простой вопрос, но я не могу найти какой-то эквивалент iPhone SDK здесь.

Заранее спасибо!

1 Ответ

7 голосов
/ 29 марта 2010

Звучит так, будто вы хотите поэкспериментировать с 2D-графикой - для этого вам следует использовать Canvas. Вы можете управлять рисованием Canvas с помощью метода invalidate(), который заставляет Android перерисовать все, что вызывает ваш настроенный метод onDraw(). Вы упоминаете, что не хотите использовать файл XML, но это самый простой способ вставить Canvas - вам не нужно определять его содержимое в файле XML, а просто сообщить файлу макета, что он есть. Мощный, но простой способ добавить Canvas в ваше приложение - это настроить View. Например, включите в ваш XML-файл элемент <your.package.CustomView android:.../>. Затем объявите класс CustomView extends View. Любой вид рисования, который вы хотите сделать, поместите в метод onDraw ().

Например, чтобы нарисовать прямоугольник, сделайте что-то вроде этого.

//First you define a colour for the outline of your rectangle
rectanglePaint = new Paint();
rectanglePaint.setARGB(255, 255, 0, 0);
rectanglePaint.setStrokeWidth(2);
rectanglePaint.setStyle(Style.STROKE);

//Then create yourself a Rectangle
Rect rectangle = new Rect(left, top, right, bottom) //in pixels

//And here's a sample onDraw()
@Override
public void onDraw(Canvas canvas){
    rectangle.offset(2, 2);
    canvas.drawRect(rectangle, rectanglePaint);
}

Каждый раз, когда invalidate () вызывается из вашей программы, представление будет перерисовываться, а прямоугольник перемещается на 2 пикселя вниз и вправо. Примечание: перерисовка происходит только в том случае, если основной поток «ждет». Другими словами, если у вас есть вызов цикла, который несколько раз аннулирует, представление фактически не будет отрисовано, пока цикл не завершится. Вы можете обойти это, но это добавляет больше осложнений. Для примера того, как это делается, посмотрите на пример игры LunarLander от Google - это простая игра, демонстрирующая пользовательский вид, 2 потока и способ реализации непрерывной анимации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...