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

Всем привет,

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

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

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


person strange quark    schedule 29.03.2010    source источник


Ответы (1)


Похоже, вы хотите поэкспериментировать с 2D-графикой - для этого вам следует использовать 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 потока и то, как реализовать непрерывную анимацию.

person Steve Haley    schedule 29.03.2010