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

Поиск:

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


Опытный
**


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

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



нужно было релизовать разворот картинки (используеться MIDP 2.0)
полазил по нету, нашол подобный премер:
Код

Image im    =   Image.createImage(source,
                    0,
                    0,
                    source.getWidth(),
                    source.getHeight(),
                    int transform);


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


--------------------
PM MAIL ICQ   Вверх
javastic
Дата 1.8.2005, 14:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1214
Регистрация: 18.3.2005
Где: St.Petersburg

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



То что тебе надо сидит в классе Sprite.

Соответственно:

Цитата
Sprite.TRANS_NONE - causes the specified image region to be copied unchanged
Sprite.TRANS_ROT90 - causes the specified image region to be rotated clockwise by 90 degrees.
Sprite.TRANS_ROT180 - causes the specified image region to be rotated clockwise by 180 degrees.
Sprite.TRANS_ROT270 - causes the specified image region to be rotated clockwise by 270 degrees.
Sprite.TRANS_MIRROR - causes the specified image region to be reflected about its vertical center.
Sprite.TRANS_MIRROR_ROT90 - causes the specified image region to be reflected about its vertical center and then rotated clockwise by 90 degrees.
Sprite.TRANS_MIRROR_ROT180 - causes the specified image region to be reflected about its vertical center and then rotated clockwise by 180 degrees.
Sprite.TRANS_MIRROR_ROT270 - causes the specified image region to be reflected about its vertical center and then rotated clockwise by 270 degrees.


The size of the returned image will be the size of the specified region with the transform applied. For example, if the region is 100 x 50 pixels and the transform is TRANS_ROT90, the returned image will be 50 x 100 pixels.


Удачи!



--------------------
01101010 01100001 01110110 01100001 01110011 01110100 01101001 01100011
scjp, mcp 
PM MAIL WWW ICQ   Вверх
Jlekc
Дата 1.8.2005, 14:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



яс, псиба.

ЗЫ: а в продолжения темы, как изменить размер картинки?


--------------------
PM MAIL ICQ   Вверх
Nemesis
Дата 3.8.2005, 12:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Jlekc, если под изменение картинки подразумевается масштабирование(увеличение или умеьшение), то скажу сразу, что в midp такое не предусмотрено. Но ты можешь "вручную" масшатабировать картинку, т.е. считываешь массив цветов пикселей из картинки - метод
public void getRGB(int[] rgbData,
int offset,
int scanlength,
int x,
int y,
int width,
int height)
затем манипулируешь массивом rgbData. Если хочешь увеличить картинку -> заводишь еще один массив с новым кол-вом пикселей и по определенному правилу записываешь в него данные(если кому-то нужно будет, могу дать алгоритм), аналогично с уменьшением.
Но! прошу заметить, что кол-во элементов(суммарное кол-во элементов во всех массивах в пределах одного мидлета) не должо превышать ~130000. Т.е. сразу несколько картинок(средних размеров) различных масштабов держать не получится.И не получится увеличить картинку размером 176 х 220 в 2 раза, т.к. потребуется массив из 176*2*220*2 = 154880 элементов smile
--------------------
PM MAIL   Вверх
Jlekc
Дата 3.8.2005, 15:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



о тком изврате слышал, но неужели нету встроеного метода?


--------------------
PM MAIL ICQ   Вверх
javastic
Дата 4.8.2005, 14:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1214
Регистрация: 18.3.2005
Где: St.Petersburg

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



Нету. Можно порыскать в Инете на предмет готовых решений и использовать в своём проекте.


--------------------
01101010 01100001 01110110 01100001 01110011 01110100 01101001 01100011
scjp, mcp 
PM MAIL WWW ICQ   Вверх
111
Дата 5.2.2006, 02:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Привет. Есть статья где подробно описан поворот картинки в J2me на любой угол. Есть рабочий пример.
PM MAIL   Вверх
Jlekc
Дата 5.2.2006, 13:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



хых, позновато)
впринципе подобную схему и сам зделал, заль что тогда не наткнулся на готовую


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


Новичок



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

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



Тут в другом форуме один чел сказал, что есть более быстрый алгоритм поворота картинки без всяких синусов и умножений. Все на сложении. Кто-нить что знает?
PM MAIL   Вверх
Jlekc
Дата 24.2.2006, 19:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



есе на пярмой угол крутить, то мона и без синусов обойтись


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


Бывалый
*


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

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



помогите, пожалуйста.
Хочу сделать анимацию, как открывается глаз.
загрузил в папку /res шесть фоток(первая -закрытый глаз, вторая - чуть открытый... последняя - совсем открытый).
Составил цикл загрузки каждого изображения. На эмуляторе вроде получается, а на телефоне - нет. Во-первых, на телефоне изображение загружается слишком долго, а во-вторых, между загрузкой картинок идёт мерцание и проскакивает йзображение фонового рисунка с телефона.
И ещё: я не использовал массив для загрузки и выгрузки изображений. Может дело в этом?
Вот мой код:


Код

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=1;         private int y=1;
private Display d;
public void destroyApp(boolean d){notifyDestroyed();}
public void pauseApp(){}
public void startApp (){
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=1; x!=7; ++x)
{
d.setCurrent(null);
f.delete(0);  // удалить из формы текущую картинку
try
{
i = Image.createImage("/" + Integer.toString(x) + ".png"); 
f.append(i);  // добавить картинку в форму
d.setCurrent(f);
}
catch (IOException ioe) 
{   
System.out.println(ioe.getMessage());
}
}
if (c == b) { 
x=6;
while(x>0){
try{
x-- ;  
d.setCurrent(null);
f.delete(0);  // удалить из формы текущую картинку
i = Image.createImage("/" + Integer.toString(x) + ".png"); 
f.append(i);// добавить картинку в форму
d.setCurrent(f);
if (x==1)x=-1 ;
}
catch (IOException ioe) {   // обработать исключительную ситуацию, если файл не может быть открыт
System.out.println(ioe.getMessage());}}
}}}




Это сообщение отредактировал(а) W0LF - 28.5.2008, 11:33
PM MAIL   Вверх
eugine_s
Дата 28.5.2008, 08:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



valerchi, загрузи все картинки сразу в память.

Анимация тормозит из-за того что время создания картинки очень большое.
PM MAIL   Вверх
valerchi
Дата 28.5.2008, 16:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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




Извините за такие простые вопросы, я начинающий...
Это как загрузить в память ? То есть загрузить в массив?
PM MAIL   Вверх
W0LF
Дата 28.5.2008, 17:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


alexander lonsky
***


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

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



как вариант smile


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


Опытный
**


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

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



Да, создать массив Image, один раз загрузить туда все и хранить. Получится что-то такое:

Цитата

private final static int IMAGE_COUNT = 6;

private Image imageCache[];

void initializeImages() throws IOException {
     int i;

     if (imageCache != null) {
          return;
     }

     imageCache = new Image[IMAGE_COUNT];

     for (i = 0; i < IMAGE_COUNT; i++) {
          imageCache[i] = Image.createImage("/" + x + ".png");
     }
}


И единожды вызвать его, например, в startApp() (в конструкторе не очень хочется возиться с I/O, уж больно интимный это участок кода ):

Цитата

public void startApp() {
    ... 

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


В твоем же коде каждый раз при отрисовке картинки очередной кадр каждый раз грузится из jar-файла, т. е . происходит ковыряние в zip'е на файловой системе телефона - процесс весьма небыстрый.

Правда, если хранить картинки в памяти, стоит оценить, сколько же памяти они будут отъедать. Если много, то стоит подумать, как организовать память оптимальнее. Например, если телефон поддерживает CLDC 1.1, хранить не сильные ссылки на Image, а WeakReference.
PM MAIL   Вверх
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   Вверх
eugine_s
Дата 1.6.2008, 17:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



valerchi,  ты уж извини за прямоту, но этот код - ужасный.

Лучше отложи куда-нибудь подальше этот код и начни с "чистого листа".

Возьми какой-нибудь пример хороший.

Ошибки:
1. Никаких тяжелых действий в startApp(). Можно с этим много "горя" получить в будущем.
2.
Зачем 19-ть (или 18-ть) раз выполнять вот такое:
// получить ссылку на менеджер дисплея
    d = Display.getDisplay(this);
// создать объект графика
    Ggraph graph = new Ggraph();

3.  Зачем:
    // вывести график на экран
    d.setCurrent(graph);

достаточно один раз сделать такое, а потом graph.repaint(); (возможно graph.serviceRepaint() перед repaint() вызвать)

4. g.fillRect(255, 255, 255, 255); - это какой ты прямоугольник зарисовываешь?

5. (Основное) Где картинки загруженные в массив? Они ведь в у тебя опять перед отрисовкой загружаются.




PM MAIL   Вверх
eugine_s
Дата 1.6.2008, 17:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Почитай вот тут много полезный статей про j2me

По твоему вопросу там есть     *  Пишем игру для телефона. (Части 1 - 6)


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


Бывалый
*


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

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



Спасибо, вроде всё нормально.
Смотри, что у меня получилось. И самое главное - работает на эмуляторе и на телефоне.
Теперь, хотелось бы добавить команду "Back", чтобы программу можнобыло "запустить в обратную сторону".  Как это можно сделать?


Код

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 int y;
private Image mas[];  
public void destroyApp(boolean destroy){notifyDestroyed();}
public void pauseApp() {}
public void startApp() {
mas = new Image[15];
try {    
     for (x = 0; x < 15; x++) {
          mas[x] = Image.createImage("/" + Integer.toString(x+1) + ".png");
     }}
     catch (IOException ioe) {
    }
// получить ссылку на менеджер дисплея
    d = Display.getDisplay(this);
// создать объект графика
    Ggraph graph = new Ggraph();
x=0;
// вывести график на экран
    d.setCurrent(graph);
for (x=-1; x<14; ++x)
{
y=1;
while(y>0){
y++;
if (y==400000)y=-1 ;}
graph.repaint(); 
}
}
private class Ggraph extends Canvas {
public void paint(Graphics g) {
// Очистить экран (закрасить белым).
g.setColor(0xffffff);
g.fillRect(0, 0, 255, 255);
 g.drawImage(mas[x], 90, 100, g.HCENTER | g.VCENTER);
}}}

PM MAIL   Вверх
Dummy
Дата 6.6.2008, 01:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Код

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


стоит заменить на

Код

g.fillRect(0, 0, getWidth(), getHeight());


Цитата(valerchi @  6.6.2008,  01:22 Найти цитируемый пост)
Теперь, хотелось бы добавить команду "Back", чтобы программу можнобыло "запустить в обратную сторону"

Это что - картинки, что ли, в обратном направлении пролистывать?

PM MAIL   Вверх
eugine_s
Дата 6.6.2008, 12:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(valerchi @  6.6.2008,  01:22 Найти цитируемый пост)
Спасибо, вроде всё нормально.

Все равно в startApp куча всего осталось - плохая манера.

Вот, переделал немного + добавил в два направления анимация

Код


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

public class Glaz extends MIDlet {

    public Display d;
    private Ggraph graph;
    public static Glaz _midlet;

    public void destroyApp(boolean destroy) {
        notifyDestroyed();
    }

    public void pauseApp() {
    }

    public void startApp() {
        graph = new Ggraph();
        graph.start();
        d = Display.getDisplay(this);
        d.setCurrent(graph);
        _midlet = this;
    }

    private class Ggraph extends Canvas implements Runnable, CommandListener {

        private int currentImage = 0; //текущий кадр анимации
        private Image mas[];
        private final int IMAGE_COUNT = 15; //всего кадров анимации
        private boolean running; 
        private Command changeCommand, exitCommand;
        private boolean animationNormal; // флаг - направления анимации.
        private long timer;
        private final int timeShowImage = 200; //время отображения каждого кадра в милисекундах.

        public Ggraph() {
            changeCommand = new Command("Change", Command.OK, 0);
            exitCommand = new Command("Exit", Command.EXIT, 1);
            addCommand(changeCommand);
            addCommand(exitCommand);
            setCommandListener(this);


            mas = new Image[IMAGE_COUNT];
            try {
                for (int i = 0; i < IMAGE_COUNT; i++) {
                    mas[i] = Image.createImage("/" + Integer.toString(i + 1) + ".png");
                }
            } catch (IOException ioe) {
                System.out.println("Error loadint image: " + ioe);
            }
            animationNormal = true;
        }

        public void start() {
            running = true;
            if (animationNormal) {
                currentImage = 0;
            } else {
                currentImage = IMAGE_COUNT - 1;
            }
            Thread t = new Thread(this);
            t.start();
        }

        public void stop() {
            running = false;
        }

        public void run() {
            timer = System.currentTimeMillis();
            while (running) {
                if (System.currentTimeMillis() - timer > timeShowImage) {
                    if (animationNormal) {
                        currentImage++;
                        if (currentImage >= IMAGE_COUNT) {
                            currentImage = 0;
                        }
                    } else {
                        currentImage--;
                        if (currentImage < 0) {
                            currentImage = IMAGE_COUNT - 1;
                        }
                    }
                    timer = System.currentTimeMillis();
                    repaint();
                    System.out.println("currentImage = " + currentImage);
                }
            }
        }

        public void paint(Graphics g) {
            g.setColor(0xffffff);
            g.fillRect(0, 0, getWidth(), getHeight());
            if (mas[currentImage] != null) {
                g.drawImage(mas[currentImage], 90, 100, g.HCENTER | g.VCENTER);
            }
        }

        public void commandAction(Command c, Displayable d) {
            if (c == changeCommand) {
                animationNormal = !animationNormal;
            } else if (c == exitCommand) {
                stop();
                _midlet.destroyApp(true);
            }
        }
    }
}




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


Опытный
**


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

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



По большому счету, подход с вычитыванием картинок в конструкторе вряд ли лучше.

Тяжеловесность startApp() крайне нежелательна, согласен, т. к. при долгом startApp() у AMS элементарно может возникнуть желание прибить повисший (по ее мнению) в функции-триггере мидлет. Но. В случае, если мы в startApp() схлопочем RuntimeException, по крайней мере будет вызван destroyApp() для нашего мидлета, так что мы сможем обработать эту ситуацию. Скорее всего, смерть мидлета предотвратить мы не сможем (MIDP гласит, что в таком случае мидлет должен быть терминирован). Но, как минимум, закроем ту часть ресурсов, которую мы успешно захватили до получения Exception в startApp(), и  покажем предсмертное сообщение пользователю .

В случае же, когда мы получаем проблемы в конструкторе, обработка исключительной ситуации целиком отдается на откуп AMS. Она, конечно, может покажет более-менее содержательное сообщение, в конечном итоге даже освободит ресурсы, захваченные нами и не освобожденные. Но ситуация получится намного более брутальная и рискованная.

В этом примере такого не получится - просто стартуем без картинок (что само по себе не очень хорошо, но для такого быстрого примера вполне нормально). Но в общем случае - сами понимаете...

Поэтому, видимо, лучшим решением будет запуск в startApp() отдельного потока приложения, внутри которого будут и картинки из джара выниматься, и все отрисовки вызываться.
PM MAIL   Вверх
valerchi
Дата 7.6.2008, 21:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Дело в том, что ты меня не совсем понял. Я хотел сделать так, чтобы нажал кнопку - глаз открылся, и так открытым остался. Потом нажал другую кнопку, - программа пошла в другую сторону, то есть глаз закрылся, а у тебя получается бесконечный цикл, - тое сть глаз всё время моргает.
PM MAIL   Вверх
eugine_s
Дата 8.6.2008, 18:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Дело в том, что:
1. Из того что ты написал было не понятно что ты хотел получить

2. Из того что я написал, очень просто получается, то что тебе нужно, нужно то изменить 3-4 строчки кода.

Вот это 
Код

                  if (animationNormal) {
                        currentImage++;
                        if (currentImage >= IMAGE_COUNT) {
                            currentImage = 0;
                        }
                    } else {
                        currentImage--;
                        if (currentImage < 0) {
                            currentImage = IMAGE_COUNT - 1;
                        }
                    }


Изменить на вот это:

Код

                  if (animationNormal) {
                        currentImage++;
                        if (currentImage >= IMAGE_COUNT) {
                            currentImage = IMAGE_COUNT - 1;
                        }
                    } else {
                        currentImage--;
                        if (currentImage < 0) {
                            currentImage =0;
                        }
                    }


Т.е. изменения заключаются только в том, чтобы не начинать цикл анимации с самого начала (конца).

Конечно, можно улучшить программу: какие-то флаги выставлять, чтобы анимацию не выполняло, чтобы лучше работало.... но уже можешь сам над улучшениями поработать.

Да, кстати, то что написал Dummy по поводу инициализации картинок НЕ в конструкторе - правильное и если бы я писал для себя, то так и сделал бы (+ возможно добавил бы метод, который освобождал все эти ресурсы).
PM MAIL   Вверх
valerchi
Дата 12.6.2008, 12:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Большое спасибо. Всё работает. 
А можно добавить какую-то надпись вверху, типа бегущей строки? Или сюда невозможно добавить?
PM MAIL   Вверх
valerchi
Дата 12.6.2008, 16:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Вообще, посоветуйте какую- нибудь литературу по j2me программированию.
Я пользуюсь самоучителем Буткевича.
PM MAIL   Вверх
Dummy
Дата 12.6.2008, 23:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата

А можно добавить какую-то надпись вверху, типа бегущей строки? Или сюда невозможно добавить? 


См. документацию по Displayable.setTicker(). Ticker - это и есть бегущая строка. Уж не знаю, где она появится - сверху или снизу, - зависит от реализации. В принципе, если надо строго вверху, свою реализацию написать тоже не сложно. По аналогии с анимацией злосчастного глаза)))
PM MAIL   Вверх
valerchi
Дата 13.6.2008, 23:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Сделал так. На эмуляторе строка идёт, а на телефоне - нет.
Телефон у меня SonyEricsson w810i.
Вчём может быть проблемма?


Код

....
private String str = "бегущая строка"; 
private Ticker ticker = new Ticker(str); 


        public Ggraph() {



setTicker(ticker) ; setCommandListener(this); 

......

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


Бывалый
*


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

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



Шустрый, объясни в чём причина?
Бегущая строка на эмуляторе идёт, а на телефоне - нет.
PM MAIL   Вверх
valerchi
Дата 16.6.2008, 17:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Загрузил этот код в SonyEricsson K790i, там бегущая строка видна. И получилась другая проблемма:
картинка уменьшилась и показывается не в середине экрана, а в левом верхнем углу. 
Не знаете, в чём может быть проблемма?
Как её показать на всех телефонах по середине и не меняя размера? 
PM MAIL   Вверх
eugine_s
Дата 16.6.2008, 18:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(valerchi @  16.6.2008,  17:19 Найти цитируемый пост)
Как её показать на всех телефонах по середине и не меняя размера?  


Вместо Form использовать Canvas.

В 99,999% проектов, если есть анимация то будет использовать Canvas для ее отображения 

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


Бывалый
*


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

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



eugine_s,  но ведь у меня Canvas (код вверху "Glaz"). И получается, что на SonyEricsson w810i вроде работает, только не отображается бегущая строка,  а на SonyEricsson K790i бегущая строка идёт? зато картинка уменьшилась и показывается не в середине экрана, а в левом верхнем углу.
PM MAIL   Вверх
valerchi
Дата 16.6.2008, 19:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Экраны телефонов ведь разные. Можно ли ввести какие нибудь стандартные координаты, чтобы картинка отображалась посередине в любом телефоне?
На моём телефоне координаты: g.drawImage(mas[currentImage], 90, 75, g.HCENTER | g.VCENTER);
Но они не подходят на другой телефон с большим, чем у меня экраном. 
PM MAIL   Вверх
eugine_s
Дата 16.6.2008, 20:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(valerchi @  16.6.2008,  19:10 Найти цитируемый пост)
eugine_s,  но ведь у меня Canvas (код вверху "Glaz").


Сорри. Забыл уже smile


Так в чем тогда проблема? 


getWidth(), getHeigth() - размеры экрана возвращают.


Вот код:
g.drawImage(mas[currentImage], getWidth() / 2 - mas[currentImage].getWidth() / 2, getHeight() / 2 - mas[currentImage].getHeight() / 2, 0);
PM MAIL   Вверх
valerchi
Дата 16.6.2008, 20:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



eugine_s, ты помнишь мой Glaz? Меня ещё с самого начала поразила такая ерунда -  включаешь программу и постоянно идёт бесконечный цикл. Это обязательно? То есть я думал так, - нажимаешь кнопку, цикл пошёл, картинки отлистались, цикл закончился и всё, команда "ок" ждёт следующего нажатия. Опять нажал, опять цикл пошёл, отлистал там сколько- нибудь кадров и опять закончился.
PM MAIL   Вверх
Dummy
Дата 16.6.2008, 21:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(valerchi @  16.6.2008,  20:31 Найти цитируемый пост)
eugine_s, ты помнишь мой Glaz?


"Эти Glaz'а напротив, калейдоскоп огней..."  smile  Сорри, модераторы, не бейте за оффтоп)))

По делу - valerchi, так никто ж не мешает тебе повторить цикл всего один раз по каждому нажатию, не стоит учебные примеры воспринимать так буквально smile  Модифицируй их так, чтобы они решали твою задачу.

Кстати, по поводу Ticker на w810i  - попробуй для интересу добавить Ticker не к канвасу, а к форме, например. Для формы ticker рисуется?
PM MAIL   Вверх
valerchi
Дата 16.6.2008, 21:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



eugine_s, ты помнишь мой Glaz? Меня ещё с самого начала поразила такая ерунда -  включаешь программу и постоянно идёт бесконечный цикл. Это обязательно? То есть я думал так, - нажимаешь кнопку, цикл пошёл, картинки отлистались, цикл закончился и всё, команда "ок" ждёт следующего нажатия. Опять нажал, опять цикл пошёл, отлистал там сколько- нибудь кадров и опять закончился.

Добавлено через 18 секунд
eugine_s, ты помнишь мой Glaz? Меня ещё с самого начала поразила такая ерунда -  включаешь программу и постоянно идёт бесконечный цикл. Это обязательно? То есть я думал так, - нажимаешь кнопку, цикл пошёл, картинки отлистались, цикл закончился и всё, команда "ок" ждёт следующего нажатия. Опять нажал, опять цикл пошёл, отлистал там сколько- нибудь кадров и опять закончился.

Добавлено через 6 минут и 27 секунд
Dummy, ты пишешь  "Кстати, по поводу Ticker на w810i  - попробуй для интересу добавить Ticker не к канвасу, а к форме, например. Для формы ticker рисуется? "

Да в форме бегущая строка у меня отображается, но ведь у меня картинки загружаются в Canvas.  Это что в канвас добавить форму?

PM MAIL   Вверх
Dummy
Дата 16.6.2008, 22:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Нет, в канвас добавлять форму не нужно. Вряд ли получится *^_^* Это я спросил, чтобы проверить, что проблема с отрисовкой тикера существует только для канваса.

А можешь попробовать временно закомментировать код отрисовки канваса (тело функции paint)? Будет ли рисоваться тикер?
PM MAIL   Вверх
valerchi
Дата 16.6.2008, 22:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата(Dummy @  16.6.2008,  22:31 Найти цитируемый пост)
А можешь попробовать временно закомментировать код отрисовки канваса (тело функции paint)? Будет ли рисоваться тикер? 

Всё равно бегущей строки нет

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


Бывалый
*


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

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



Извините за назойливость, не могу понять...
Я делаю цикл, и в каждом повторении цикла нужно выйти из него, чтобы сделать "repaint()", а потом опять продолжить выполнение цикла, но что-то не получается, программа полностью отлистает цикл, а потом делает один раз "repaint()".
Код

....
for(int k=0;k!=13;k++){
currentImage++;

repaint();
}
.......

PM MAIL   Вверх
eugine_s
Дата 17.6.2008, 13:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(valerchi @  17.6.2008,  12:33 Найти цитируемый пост)
Я делаю цикл, и в каждом повторении цикла нужно выйти из него, чтобы сделать "repaint()", а потом опять продолжить выполнение цикла, но что-то не получается, программа полностью отлистает цикл, а потом делает один раз "repaint()"


The call to paint() occurs asynchronously of the call to repaint(). That is, repaint() will not block waiting for paint() to finish. The paint() method will either be called after the caller of repaint() returns to the implementation (if the caller is a callback) or on another thread entirely.

В доке все написано.

repaint() - это только запрос на перерисовку, а не вызов paint-a.

Делай паузы в твоем цикле.


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


Бывалый
*


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

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



А как её сделать?

Добавлено через 7 минут и 9 секунд
Цитата(eugine_s @  17.6.2008,  13:22 Найти цитируемый пост)
Делай паузы в твоем цикле.

А как её сделать?
PM MAIL   Вверх
Dummy
Дата 17.6.2008, 13:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Поставиь wait() или  Thread.sleep() на нужное количество миллисекунд после каждого repaint()
PM MAIL   Вверх
valerchi
Дата 2.7.2008, 16:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



У меня получилась небольшая програмка.
Что теперь нужно сделать, чтобы её продать?
1. Залицензировать её?
2. Как поставить пароль?
PM MAIL   Вверх
Dummy
Дата 3.7.2008, 11:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Вот здесь достаточно много копий сломали по этому вопросу.

PM MAIL   Вверх
Dummy
Дата 3.7.2008, 12:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Да, и у меня еще есть предложение. Открывать на каждый новый вопрос свою тему (предварительно поискав, нет ли чего аналогичного на форуме smile ) . Ибо в рамках данной темы мы попутно обсудили уже кучу вещей, которые с данным топиком мало общего имеют.

Это сообщение отредактировал(а) Dummy - 3.7.2008, 12:54
PM MAIL   Вверх
valerchi
Дата 7.7.2008, 12:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



eugine_s,  у меня получилась небольшая програмка, ("Эти Glaz'а напротив, калейдоскоп огней..."), ты мне здорово в ней помог. Хочу авторство разделить с тобой. Что скажешь?
PM MAIL   Вверх
valerchi
Дата 21.5.2009, 21:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Кстати, програмка получилась., может и не лучшего качества, но работает. Смысл в ней такой, что нужно загадать какой-нибудь вопрос, но только, чтобы ответ на него был "да" или  "нет", а потом нажимаешь кнопку... Открывается глаз, а в глазе написан ответ "да" или "нет" или "может быть" или "незнаю". Если кто хочет может скачать бесплатно поэтой ссылке:
http://www.azov-riba.com/glaz.rar
Но предупреждаю, прога работает только на sonyericsson (у меня w810i).
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса

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

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


 




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


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

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