Новое в Android — рисование представления во время выполнения

StackOverflow https://stackoverflow.com/questions/2539396

Вопрос

Всем привет,

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

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

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

Это было полезно?

Решение

Похоже, вы хотите поэкспериментировать с 2D-графикой — для этого вам следует использовать Canvas.Вы можете управлять рисованием Canvas через invalidate() метод, который сообщает Android перерисовать все, что запускает ваш индивидуальный onDraw() метод.Вы упоминаете, что не хотите использовать XML-файл, но это самый простой способ разместить Canvas — вам не нужно определять его содержимое в XML-файле, а просто сообщить файлу макета, что оно есть.Мощный, но простой способ разместить Canvas в вашем приложении — настроить представление.Например, включите в свой 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);
}

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top