Модераторы: javastic, AntonSaburov

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Разворот картинки, Image.createImage() 
V
    Опции темы
valerchi
Дата 28.5.2008, 17:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 163
Регистрация: 27.5.2008
Где: Геническ

Репутация: нет
Всего: нет



Я загрузил в массив картинки, но всё осталось также
PM MAIL   Вверх
eugine_s
Дата 28.5.2008, 18:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 581
Регистрация: 14.11.2007
Где: Киев

Репутация: 17
Всего: 17



и из старого кода убрал загрузку картинок в цикле отрисовке ?

Нужно код посмотреть.



PM MAIL   Вверх
valerchi
Дата 28.5.2008, 19:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 163
Регистрация: 27.5.2008
Где: Геническ

Репутация: нет
Всего: нет



всё сделал, но результат остался тот же изображение не сливается, идёт мерцание и покадровая загрузка. Вот мой код , может я что не так сделал?
.......... Ещё хотел сказать , что у меня картинки разные (какие смог найти ) - разных размеров и рисунков

Код



import javax.microedition.lcdui.*;
import javax.microedition.midlet.MIDlet;
import java.io.IOException;
public class Glaz extends MIDlet implements CommandListener{
private Form f;
private Command n;
private Command b;
private Image i;
private int x;         // номер текущей картинки
private int y=1;
private int z=0;
private Display d;

private final static int IMAGE_COUNT = 6;

private Image mas[];

void initializeImages() throws IOException {
     int x;

     if (mas != null) {
          return;
     }

     mas = new Image[IMAGE_COUNT];

     for (x = 0; x < IMAGE_COUNT; x++) {
          mas[x] = Image.createImage("/" + Integer.toString(x+1) + ".png");
     }
}


public void destroyApp(boolean d){notifyDestroyed();}
public void pauseApp(){}
public void startApp (){



try {
         initializeImages();
    } catch (IOException ioe) {
         // какая-то обработка
    }



d = Display.getDisplay(this);   // получить ссылку на менеджер дисплея
f = new Form("grafa");          // создать новую форму
f.setCommandListener(this);     // установить приемник команд для формы
n=new Command("ОК", Command.OK, 0);// создать команду перехода
f.addCommand(n);
b = new Command("Back", Command.BACK, 1);  // создать команду возврата 
// добавить команду в форму
f.addCommand(b);
Ticker t = new Ticker("нажми ОК");  // создать объект бегущей строки
f.setTicker(t);// добавить бегущую строку в форму

// добавить в форму первую картинку
try {

i = Image.createImage("/1.png");
f.append(i);// вывести форму на экран
d.setCurrent(f);
}
catch (IOException ioe) {
// обработать исключительную ситуацию.
// если файл не может быть открыт
System.out.println(ioe.getMessage());
}

public void commandAction(Command c, Displayable s) // метод обработки команд реализует действия, предписанные командами


if (c == n)  // команда перехода к следующей картинке

for (x=0; x!=6; ++x)
{
d.setCurrent(null);
f.delete(0); // удалить из формы текущую картинку
i =  mas[x];       
f.append(i);  // добавить картинку в форму
d.setCurrent(f);

}


if (c == b) 
for (x=5; x!=-1; --x)
{

d.setCurrent(null);
f.delete(0); // удалить из формы текущую картинку
i =  mas[x];  
f.append(i);  // добавить картинку в форму
d.setCurrent(f);}
}}








Это сообщение отредактировал(а) W0LF - 29.5.2008, 17:40
PM MAIL   Вверх
Dancer
Дата 28.5.2008, 19:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 537
Регистрация: 29.4.2005
Где: Nizhniy Novgorod

Репутация: 33
Всего: 37



да тут большее зло это то, что пытаемся в Form пихать каждую картинку и эту формочку через setCurrent() рисовать. Это очень медленная операция. Для такой анимашки нужно пользовать Canvas и определять paint() для него и рисовать лишь в этом Canvas.
То есть при старте аппликухи делается объект класса наследника от Canvas, и именно этот класс пихаем на дисплей, а paint() этой самой канвы и делает отрисовку. как всё отрисовали, повисели малешко, а после этого уже формочку (незабыв почистить память от Image[])


--------------------
У программистов есть великая тайна: всё, что только можно, было давно кем-то когда-то написано. Разработчику только нужно знать в какое место кода какие строчки вставить! smile
PM MAIL   Вверх
valerchi
Дата 28.5.2008, 19:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 163
Регистрация: 27.5.2008
Где: Геническ

Репутация: нет
Всего: нет



всё сделал, но результат тот же - картинки не сливаются, а покадрово мерцают и проскакивает фоновый рисунок телефона.
Вот мой код, может я что сделал нетак





Код


import javax.microedition.lcdui.*;
import javax.microedition.midlet.MIDlet;
import java.io.IOException;
public class Glaz extends MIDlet implements CommandListener{
private Form f;
private Command n;
private Command b;
private Image i;
private int x;         // номер текущей картинки
private int y=1;
private int z=0;
private Display d;

private final static int IMAGE_COUNT = 20;

private Image mas[];

void initializeImages() throws IOException {
     int x;

     if (mas != null) {
          return;
     }

     mas = new Image[IMAGE_COUNT];

     for (x = 0; x < IMAGE_COUNT; x++) {
          mas[x] = Image.createImage("/" + Integer.toString(x+1) + ".png");
     }
}


public void destroyApp(boolean d){notifyDestroyed();}
public void pauseApp(){}
public void startApp (){



try {
         initializeImages();
    } catch (IOException ioe) {
         // какая-то обработка
    }



d = Display.getDisplay(this);   // получить ссылку на менеджер дисплея
f = new Form("grafa");          // создать новую форму
f.setCommandListener(this);     // установить приемник команд для формы
n=new Command("ОК", Command.OK, 0);// создать команду перехода
f.addCommand(n);
b = new Command("Back", Command.BACK, 1);  // создать команду возврата 
// добавить команду в форму
f.addCommand(b);
Ticker t = new Ticker("нажми ОК");  // создать объект бегущей строки
f.setTicker(t);// добавить бегущую строку в форму

// добавить в форму первую картинку
try {

i = Image.createImage("/1.png");
f.append(i);// вывести форму на экран
d.setCurrent(f);
}
catch (IOException ioe) {
// обработать исключительную ситуацию.
// если файл не может быть открыт
System.out.println(ioe.getMessage());
}

public void commandAction(Command c, Displayable s) // метод обработки команд реализует действия, предписанные командами


if (c == n)  // команда перехода к следующей картинке

for (x=0; x!=20; ++x)
{
d.setCurrent(null);
f.delete(0); // удалить из формы текущую картинку
i =  mas[x];       
f.append(i);  // добавить картинку в форму
d.setCurrent(f);

}


if (c == b) 
for (x=19; x!=-1; --x)
{

d.setCurrent(null);
f.delete(0); // удалить из формы текущую картинку
i =  mas[x];  
f.append(i);  // добавить картинку в форму
d.setCurrent(f);}
}}




Это сообщение отредактировал(а) W0LF - 29.5.2008, 17:41
PM MAIL   Вверх
Dummy
Дата 28.5.2008, 20:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 263
Регистрация: 21.5.2007

Репутация: 7
Всего: 19



valerchi, зло этого кода даже не в медленности операций отрисовки элементов формы по сравнению с канвасом, а в том, что при выполнении такой связки:

Код

d.setCurrent(null);
f.delete(0); // удалить из формы текущую картинку
i =  mas[x];  
f.append(i);  // добавить картинку в форму
d.setCurrent(f);}


на каждой итерации происходит перекомпоновка формы, т. к. setCurrent(null) не скрывает форму. Вызов f.delete(0) приводит к тому, что на форме не остается компонентов, и нужно ее перекомпоновать, чтобы отрисовывался только фон. f.append(i) добавляет новый ImageItem, после чего нужно опять перекомпоновать форму.

Тебе предложили для отрисовки использовать примерно следующий подход. Создать потомка от Canvas, который бы в paint() отрисовывал очередной кадр анимации. Например, так:

Код

public AnimationCanvas extends Canvas {
    // ... берем откуда-то массив картинок

    protected void paint(Graphics g) {
         g.drawImage(mas[frameIndex], 0, 0, Graphics.LEFT | Graphics.TOP);
         frameIndex = (frameIndex + 1) % IMAGE_COUNT;
    }
}


А потом, где нужно, сделать следующее:

Код

// Основная работа
AnimatedCanvas aCanvas = new AnimatedCanvas(/* можно в качестве параметра массив кадров передавать*/);

display.setCurrent(aCanvas);

while (/* какое-то там условие */) {
    aCanvas.repaint();
    aCanvas.serviceRepaints();
    // может быть, здесь какую-нибудь задержку поставить
}

// глазом поморгали, теперь можно нарисовать рабочую форму
display.setCurrent(yourForm);


На каждой итерации while будет рисоваться следующий кадр.




Это сообщение отредактировал(а) Dummy - 28.5.2008, 20:49
PM MAIL   Вверх
valerchi
Дата 30.5.2008, 02:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 163
Регистрация: 27.5.2008
Где: Геническ

Репутация: нет
Всего: нет



Извини, ничего не понял. Я до canvasa ёщё не дошёл - не учил.....
Пытаюсь сейчас разобраться, но, думаю, что где-то через неделю разберусь, а хотелось бы сейчас.....
Я так понял, что нужно в папке /res создать два файла. Первый назвать AnimationCanvas.java :
вот его код:
Код

import javax.microedition.lcdui.*;
import javax.microedition.midlet.MIDlet;
import java.io.IOException;

public class AnimationCanvas extends Canvas {
    // ... берем откуда-то массив картинок

private final static int IMAGE_COUNT = 20;

private Image mas[];

void initializeImages() throws IOException {
     int x;

    if (mas != null) {
          return;
     }

 try {    mas = new Image[IMAGE_COUNT];

     for (x = 0; x < IMAGE_COUNT; x++) {
          mas[x] = Image.createImage("/" + Integer.toString(x+1) + ".png");
     }

 
         initializeImages();}
     catch (IOException ioe) {
         // какая-то обработка
    }}



==============================================
А второй создать с именнем Glaz.java :
Вот его код:







Код

import javax.microedition.lcdui.*;
import javax.microedition.midlet.MIDlet;
import java.io.IOException;
public class Glaz extends MIDlet implements CommandListener{
private Form f;
private Command n;
private Command b;
private Image i;
private int x;         // номер текущей картинки
private int y=1;
private int z=0;
private Display d;
public void destroyApp(boolean d){notifyDestroyed();}
public void pauseApp(){}
public void startApp (){
// Основная работа
AnimatedCanvas aCanvas = new AnimationCanvas(/* можно в качестве параметра массив кадров передавать*/);

display.setCurrent(aCanvas);

while ( ) { ;
    aCanvas.repaint();
    aCanvas.serviceRepaints();
    // может быть, здесь какую-нибудь задержку поставить
}

// глазом поморгали, теперь можно нарисовать рабочую форму
display.setCurrent(f);


d = Display.getDisplay(this);   // получить ссылку на менеджер дисплея
f = new Form("grafa");          // создать новую форму
f.setCommandListener(this);     // установить приемник команд для формы
n=new Command("ОК", Command.OK, 0);// создать команду перехода
f.addCommand(n);
b = new Command("Back", Command.BACK, 1);  // создать команду возврата 
// добавить команду в форму
f.addCommand(b);
Ticker t = new Ticker("нажми ОК");  // создать объект бегущей строки
f.setTicker(t);// добавить бегущую строку в форму

// добавить в форму первую картинку
try {

i = Image.createImage("/1.png");
f.append(i);// вывести форму на экран
d.setCurrent(f);
}
catch (IOException ioe) {
// обработать исключительную ситуацию.
// если файл не может быть открыт
System.out.println(ioe.getMessage());
}

public void commandAction(Command c, Displayable s) // метод обработки команд реализует действия, предписанные командами


if (c == n)  // команда перехода к следующей картинке

for (x=0; x!=6; ++x)
{
d.setCurrent(null);
f.delete(0); // удалить из формы текущую картинку
i =  mas[x];       
f.append(i);  // добавить картинку в форму
d.setCurrent(f);

}


if (c == b) 
for (x=5; x!=-1; --x)
{

d.setCurrent(null);
f.delete(0); // удалить из формы текущую картинку
i =  mas[x];  
f.append(i);  // добавить картинку в форму
d.setCurrent(f);}
}}

========================================

Если можно, объясни, как для "чайника", а нет, буду постепенно разбираться.







Это сообщение отредактировал(а) W0LF - 30.5.2008, 12:24
PM MAIL   Вверх
Dummy
Дата 30.5.2008, 09:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 263
Регистрация: 21.5.2007

Репутация: 7
Всего: 19



Form - это Displayable, который рисует свои элементы сам. Canvas - это Displayable, код рисования на котором определяется мидлетописателем. Поэтому общая идея заключалась в том, чтобы выделить рисование анимации в подкласс класса Canvas, который мы с моей легкой руки назвали AnimationCanvas. Этот класс принимает в конструкторе массив кадров, которые он будет один за другим отрисовывать, при каждой новой перерисовке - следующий кадр.

Предлагаемая последовательность действий:
  •  делаем Canvas текущим на дисплее;
  •  вызываем обновление для AnimationCanvas столько раз, сколько нам нужно, тем самым рисуя анимацию;
  •  после того, как анимацию отрисовали, мы можем сменить текущий Displayable на что-то другое, например, на Form со списком менюшек программы, с кнопками и т. д.;

Цитата

Я так понял, что нужно в папке /res создать два файла. Первый назвать AnimationCanvas.java :


Нет. В папку /res по традиции кладутся ресурсы, а не исходники. Не стоит нарушать традицию, тем более что некоторые средства разработки (WTK? не помню уже) , возможно, будут принимать папку /res как предопределенную папку для ресурсов. Ну, например, положи их в /src/app. Тогда в начале каждого файла у тебя будет такая строчка:

[code=java]
package app
[code]

И jad-файл тоже нужно будет обновить.

Почитай повнимательнее про Canvas, обращая внимание на применение Graphics, repaint() и serviceRepaints().
PM MAIL   Вверх
W0LF
Дата 30.5.2008, 12:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


alexander lonsky
***


Профиль
Группа: Участник
Сообщений: 1164
Регистрация: 9.2.2006
Где: Ukraine.Dnepropet rovsk

Репутация: 19
Всего: 20




M
W0LF
valerchi, помечай код тегом "code=java" или же нажимай на кнопку "Код", он сам пометит




--------------------
iOS developer
PM MAIL WWW Skype GTalk   Вверх
valerchi
Дата 30.5.2008, 14:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 163
Регистрация: 27.5.2008
Где: Геническ

Репутация: нет
Всего: нет



Вот, что я попробовал сделать, только не знаю, как очистить "g.drawImage", чтобы очистить картинку, для загрузки новой картинки:


Это первый файл Glaz.java :

import javax.microedition.lcdui.*;
import javax.microedition.midlet.MIDlet;

public class Glaz extends MIDlet
{    private Image i;
    public void startApp() 
    {
       // создать объект графика
      Graph graph = new Graph();
      // получить ссылку на менеджер дисплея
      Display display = Display.getDisplay(this);
      // вывести график на экран
      display.setCurrent(graph);
      // получить строку атрибута имени мидлета
    }
 
    public void pauseApp() 
    {
      
    }
 
    public void destroyApp(boolean unconditional) 
    {
       // уведомить систему о завершении
       notifyDestroyed();
    }
 



Это второй файл Graph.java :


import javax.microedition.lcdui.*;
import javax.microedition.midlet.MIDlet;
import java.io.*;
 
public class Graph extends Canvas


private Image i;
private int x;

  // функция прорисовки экрана
  public void paint(Graphics g) 
  {
for (x=0; x!=19; ++x)
{

    try
    {
      i = Image.createImage("/" + Integer.toString(x+1) + ".png");
    }
    catch (IOException ioe)
    {
      ioe.printStackTrace();
    } 

}

    g.drawImage(i, 90, 100, g.HCENTER | g.VCENTER);
   g.drawImage(255, 255, 255);
  }

PM MAIL   Вверх
valerchi
Дата 30.5.2008, 15:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 163
Регистрация: 27.5.2008
Где: Геническ

Репутация: нет
Всего: нет



Ничего не понимаю,  по идее должно быть так: очищаем экран и добавляем туда картинку  и всё это помещаем в цикл повторений.   Делаю так :
Код

import javax.microedition.lcdui.*;
import javax.microedition.midlet.MIDlet;
import java.io.*;
public class Graph extends Canvas

private Image i;
private int x;
  // функция прорисовки экрана
  public void paint(Graphics g) 
  {
//цикл повторений
for (x=0; x!=19; ++x)
{
// очищаем экран
g.setColor(255, 255, 255);
    g.fillRect(0, 0, getWidth(), getHeight());
// добавляем картинку
    try
    {
      i = Image.createImage("/" + Integer.toString(x+1) + ".png");
    }
    catch (IOException ioe)
    {
      ioe.printStackTrace();
    } 
//выводим на экран
g.drawImage(i, 90, 100, g.HCENTER | g.VCENTER);

  }





..... а ничего не получается.  Высвечивает только последняя картинка.
PM MAIL   Вверх
Dummy
Дата 30.5.2008, 17:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 263
Регистрация: 21.5.2007

Репутация: 7
Всего: 19



Правильно, что высвечивается только последняя. Потому что при каждой перерисовке ты рисуешь 20 картинок на одном и том же месте.  А нужно - при каждой перерисовке одну, а затем обновлять индекс. Я уже написал вариант, как это сделать. Смотри внимательнее.
PM MAIL   Вверх
valerchi
Дата 1.6.2008, 11:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 163
Регистрация: 27.5.2008
Где: Геническ

Репутация: нет
Всего: нет



Получилось вот, что :

Код

import javax.microedition.lcdui.*;
import javax.microedition.midlet.MIDlet;
import java.io.IOException;
public class Glaz extends MIDlet 
public Display d;
private int x=0;
private Image i;
public void destroyApp(boolean destroy){notifyDestroyed();}
public void pauseApp() {}
public void startApp() {
for (x=0; x!=19; ++x)
{
     
    // создать объект графика
    Ggraph graph = new Ggraph();
    // получить ссылку на менеджер дисплея
    d = Display.getDisplay(this);
    // вывести график на экран
    d.setCurrent(graph);
}

}

private class Ggraph extends Canvas {
public void paint(Graphics g) {

    try
    {
      i = Image.createImage("/" + Integer.toString(x+1) + ".png");
    }
    catch (IOException ioe)
    {
      ioe.printStackTrace();
    } 
g.drawImage(i, 90, 100, g.HCENTER | g.VCENTER);

}}}

Массив я не брал, хотел сделать всё проще. Но на эмуляторе картинки налаживаются друг на друга. Как сделать, чтобы очистить экран, а потом показать картинку?
PM MAIL   Вверх
Dummy
Дата 1.6.2008, 13:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 263
Регистрация: 21.5.2007

Репутация: 7
Всего: 19



Брр. Что-то мы ходим вокруг одного и того же... Примерно с такого же по эффективности решения мы и начинали smile Только сейчас оно еще и не работает)))

Затирать на канвасе можно только заливкой экрана фоновым цветом или рисованием фоновой картинки. Все делается ручками.
PM MAIL   Вверх
valerchi
Дата 1.6.2008, 15:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 163
Регистрация: 27.5.2008
Где: Геническ

Репутация: нет
Всего: нет



Ничего не понимаю, уже очистил экран, - залил его белым, а всё равно картинки налаживаются друг на друга

Код

import javax.microedition.lcdui.*;
import javax.microedition.midlet.MIDlet;
import java.io.IOException;
public class Glaz extends MIDlet {//implements CommandListener
public Display d;
private int x=0;
private int z=0;
private int y;
private Form f;
private Image i;
public void destroyApp(boolean destroy){notifyDestroyed();}
public void pauseApp() {}
public void startApp() {


    
for (x=1; x!=19; ++x)
{// получить ссылку на менеджер дисплея
    d = Display.getDisplay(this);
// создать объект графика
    Ggraph graph = new Ggraph();
    
y=1;
while(y>0){
y++;
if (y==1000000)y=-1 ;}
    // вывести график на экран
    d.setCurrent(graph);

}

}

private class Ggraph extends Canvas {
public void paint(Graphics g) {
// Очистить экран (закрасить белым).

g.setColor(0xffffff);

g.fillRect(255, 255, 255, 255);

    try
    {

      i = Image.createImage("/" + Integer.toString(x) + ".png");
    }
    catch (IOException ioe)
    {
      ioe.printStackTrace();
    } 

 g.drawImage(i, 90, 100, g.HCENTER | g.VCENTER);

}}}



Добавлено через 4 минуты и 53 секунды
Всё, на счёт "закраски" разобрался, сейчас попробую в телефоне.
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса

  • Прежде чем задать вопрос прочтите это!
  • Литература по Java находится здесь.
  • Литературу по Java обсуждаем здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит" (возле кнопок кодов) если у Вас нет русских шрифтов.
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда

  • FAQ раздела лежит здесь!
 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java ME (J2ME) | Следующая тема »


 




[ Время генерации скрипта: 0.1436 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.