ГлавнаяНеобходимые приложенияНастройка приложенийГлавный классВысокоуровневое программированиеНизкоуровневое программированиеКласс GameCanvasРисование. Класс GraphicsИзображения. Класс ImageОбработка нажатийФайл манифестаСохранения. Работа с RecordStoreРабота с таймеромПолезные ссылкиОб автореСайт ФПМиКТСтуденческий сайт
Сайт о Java ME

Низкоуровневое программирование. Класс GameCanvas.

Пример
Начнем мы низкоуровневое программирование с изучения класса GameCanvas. Он является потомком Canvas-а и содержит более удобные методы для работы с телефоном.

Итак, для начала нам нужно создать новый класс и объявить его подклассом GameCanvas (для удобства вновь созданный класс назовем Canva). Теперь нужно переопределить конструктор класса (можно передать в качестве параметра к конструктору экземпляр главного класса). В конструкторе необходимо прописать команду super(true). Не забудьте создать экземпляр класса Canva в главном классе.

Вернемся опять к классу Canva. Пропишем там объект Display myDisplay и в конструктор добавим фразу myDisplay=Display.getDisplay(midlet);. Он получает экземпляр объекта Display для дальнейшей работы с ним. После этого также нужно написать там же строку myDisplay.setCurrent(this);. Это сфокусирует объект Display на данном классе.

Также можно добавить команду setFullScreenMode(true);. Она устанавилвает в качестве области рисования всю площадь экрана, что может оказаться полезным для некоторых моделей телефонов.

Некоторые сенсорные телефоны для поддержки старых мидлетов предоставляет экранную клавиатуру, которая отнимает пол-экрана. Как ее отключить, читайте в разделе "Файл манифеста".

Теперь разберемся, как рисовать графические объекты. Для этого существует public-метод paint(Graphics g). Этот метод получает в свое распоряжение внеэкранный буфер Graphics g, на котором и происходит рисование (о том, как именно его получить, читайте ниже). Переопределите его в классе Canva и добавьте в него такие строчки:
g.setColor(1000);
g.fillRect(0, 0, g.getClipWidth(), g.getClipHeight());
Первая строка задает цвет, которым будут рисоваться объекты на экране. Вторая строка рисует закрашенный прямоугольник, начинающийся с верхнего левого угла телеяона и заканчивающийся правым нижним углом, который получен методами g.getClipWidth() и g.getClipHeight(). Подробнее с методами класса Graphics мы познакомимся в следующей главе, сейчас же посмотрим, как вывести это на экран.

Для этого есть два способа: вызвать метод repaint класса Canva либо 2 метода:
paint(getGraphics());
flushGraphics();
Первый метод мызыаает наш public-метод paint(Graphics g), получая при этом буфер Graphics методом getGraphics() (который, как показыаает практика, по сути один и тот же, так что можно его всего один раз получить, а потом много раз использовать), второй же метод (flushGraphics) отрисовывает наш буфер на экран.

Как можно догадаться, метод repaint просто заменяет эти два метода, но почему-то везде предлагают идти более длинным путем, то есть использовать связку paint(getGraphics()); flushGraphics();

Итак, для того, чтобы воспользоваться этими методами, создадим в классе Canva метод paint() и впишем в него данные методы. После чего, в методе startApp главного класса вызовем наш только что созданный метод Для того, чтобы запустить программу, необходимо для начала убрать все лишнее из метода startApp (все лишнее - это все, кроме метода canva.paint()).

Весь код программы целиком выглядит таким образом:

Файл HelloMIDlet.java

package hello;

import javax.microedition.midlet.*;

public class HelloMIDlet extends MIDlet{

    Canva canva;

    public HelloMIDlet() {
        canva=new Canva(this);
    }

    public void startApp() {
        canva.paint();
    }

    public void pauseApp() {
    }

    public void destroyApp(boolean unconditional) {
    }
}

Файл Canva.java:

package hello;

import javax.microedition.lcdui.Display;
import javax.microedition.lcdui.Graphics;
import javax.microedition.lcdui.game.GameCanvas;

public class Canva extends GameCanvas{

    Display myDisplay;

    Canva(HelloMIDlet midlet){
        super(true);
        myDisplay=Display.getDisplay(midlet);
        myDisplay.setCurrent(this);
        setFullScreenMode(true);
    }

    void paint(){
        paint(getGraphics());
        flushGraphics();
    }

    public void paint(Graphics g){
        g.setColor(1000);
        g.fillRect(0, 0, g.getClipWidth(), g.getClipHeight());
    }
}
MobileApplication4.jad
MobileApplication4.jar

Необходимо понимать, что метод paint(Graphics g) может вызывать и сам телефон в какой угодно момент (естественно, если в момент вызова метода предыдущий еще не отработал, то вызов метода ставится в очередь). Поэтому данное поведение необходимо учитывать. Например, следущая программа вместо того, чтобы показать белый фон с надписью "call" будет демонстрировать красный фон (по крайней мере, на стандартном эмуляторе).

Файл HelloMIDlet.java

package hello;

import javax.microedition.midlet.*;

public class HelloMIDlet extends MIDlet{

    Canva canva;

    public HelloMIDlet() {
        canva=new Canva(this);
    }

    public void startApp() {
        canva.paint();
    }

    public void pauseApp() {
    }

    public void destroyApp(boolean unconditional) {
        canva=null;
    }
}

Файл Canva.java

package hello;

import javax.microedition.lcdui.Display;
import javax.microedition.lcdui.Graphics;
import javax.microedition.lcdui.game.GameCanvas;

public class Canva extends GameCanvas{

    Display myDisplay;
    boolean call=false;

    Canva(HelloMIDlet midlet){
        super(true);
        myDisplay=Display.getDisplay(midlet);
        myDisplay.setCurrent(this);
        setFullScreenMode(true);
    }

    void paint(){
        call=true;
        paint(getGraphics());
        flushGraphics();
        call=false;
    }

    public void paint(Graphics g){
        if(call){ //Если вызов от нас, рисуем белый фон и надпись call
            g.setColor(Integer.MAX_VALUE);
            g.fillRect(0, 0, g.getClipWidth(), g.getClipHeight());
            g.setColor(0);
            g.drawString("call", 10, 10, 0);
        }else{// Если вызов произошел не от нас, рисуем красный фон
            g.setColor(250, 0, 0);
            g.fillRect(0, 0, g.getClipWidth(), g.getClipHeight());
        }
    }
}
MobileApplication4.jad
MobileApplication4.jar
Назад	Далее