Низкоуровневое программирование. Класс 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
|