Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java ME (J2ME) > Экранная кнопка гарантом


Автор: Antropoid 31.10.2006, 10:33
Расположение экранных кнопок зависит от реализации девайса. Вопрос: можно ли сделать кнопку, которая будет гарантированно эранной (а не в выпадающем меню) на всех девайсах?

Автор: Dancer 31.10.2006, 10:54
"Элементарно, Ватсон! smile" Сам рисуешь, и не делаешь addCommandListener() а слушаешь лишь всё с Canvas и когда нажимается softKey анализируешь, что нажато и работаешь по определённому тобой алгоритму.

Автор: Antropoid 29.8.2007, 11:47
а без Canvas как быть? Если TextBox, например...

Автор: W0LF 29.8.2007, 12:18
никак.
Вот в blackberry там с этим все намного проще, а в j2me тока рисовать свою канву и свои кнопки

Автор: Samuil 30.8.2007, 00:08
W0LF, Что такое blackberry?

Автор: W0LF 30.8.2007, 11:15
Samuil,  smile 
Создай новую тему, я тебе там отвечу smile

Автор: DarkNeo 31.8.2007, 09:21
А у меня проблемка.
Цель - та же самая, как и у автора темы.
Использую Canvas, сделал прорисовку экранных клавиш.

Но!
Полоска внизу канваса, предназначенная для команд, остается на месте... и пропадает только при вызове setFullScreenMode(true)..
Можно ли как-либо ее убрать и в нормальном режиме? 
Очень хочется, чтобы на Нокиах, например, верхняя служебная полоска с информацией о сигнале телефона и заряде батареи не пропадала.. а в полноэкранном режиме её нет..

Автор: math64 31.8.2007, 19:51
А как определить коды softKeys ?
Моя Nokia их не ловит - ни keyPressed, ни keyReleased()

И в отличие от DefaultColorPhone команды не нумерует и их приходится выбирать джойстиком.

Можно поступить по-другому:
Добавить команду "Меню" и ту что хотите назначить на Soft2 с помощью addCommandListener().
При нажатии на "Меню" отрисовывать меню вручную. При использовании Form открывается своя Canvas на весь экран (или List), после выбора пункта меню - возврат к Form.

Автор: DarkNeo 31.8.2007, 19:53
math64, можно нажатие софтов через getGameAction() отлавливать. Работает везде.

Автор: math64 31.8.2007, 20:41
Как это? Проверяю коды клавиш как:
Код

package keytest;

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

public class KeyTest extends MIDlet {
  private String keyName = "";
  private int keyCode;
  private int gameAction;
  private boolean pressed;


  private Canvas canvas = new KeyTestCanvas();
  class KeyTestCanvas extends Canvas {
    protected void paint(Graphics g) {
      g.setColor(0xFFFFFF);
      g.fillRect(0,0,getWidth(), getHeight());
      g.setColor(0);
      g.drawString((pressed ? "P " : "R ") + keyName,
              0, 0, g.LEFT | g.TOP);
      g.drawString("key=" + String.valueOf(keyCode) +
              " game=" + String.valueOf(gameAction),
              0, g.getFont().getHeight(), g.LEFT | g.TOP);
    }

    protected void keyPressed(int keyCode) {
      pressed = true;
      keyName = getKeyName(keyCode);
      KeyTest.this.keyCode = keyCode;
      gameAction = getGameAction(keyCode);
      repaint();
    }

    public void keyReleased (int keyCode) {
      pressed = false;
      keyName = getKeyName(keyCode);
      KeyTest.this.keyCode = keyCode;
      gameAction = getGameAction(keyCode);
      repaint();
    }
  };

  public void startApp() {
    Display.getDisplay(this).setCurrent(canvas);
  }
  
  public void pauseApp() {
  }
  
  public void destroyApp(boolean unconditional) {
  }
}

На нажатие/отпускание softkeys никак не реагирует

Автор: DarkNeo 1.9.2007, 01:58
math64, 
Код

private void keyReaction(int keyCode)
{
    if (getKeyName(keyCode).equals("SOFT1"))
        {
            //some action
        }
        else if (getKeyName(keyCode).equals("SOFT2"))
        {
            //some action
        }
        
        try
        {
            switch (getGameAction(keyCode))
            {
            case Canvas.DOWN:
                //some action
                break;
            case Canvas.UP:
                //some action
                break;
            case Canvas.FIRE:
                //some action
                break;
            }
        }
        catch (Exception e) // getGameAction throws exception on Motorola
        {                   // when opening flipper
            return;
        }
}

protected void keyPressed(int keyCode)
{
    keyReaction(keyCode);
}

Автор: math64 2.9.2007, 01:31
DarkNeo, ты невнимательно меня читаешь - в keyPressed() при нажатии на softKeys я вообще не попадаю. А если бы и попадал то на реальном девайсе keyName был бы по русски (например Clear называется "Клавиша очистки", при выборе английского языка - "Clear key").

Предложенный мной вариант тоже не работает - если добавить две команды типа Command.OK они обе попадут в меню на Soft1, а Soft2 останется неиспользована. Конечно, если подобрать подходящие типы команд, то они распределятся по Soft1 и Soft2, но нет гарантии что для девайса другой фирмы всё будет OK.

Добавлено через 8 минут и 54 секунды
Думаю если добавлять две команды типа Command.OK и Command.Cancel они распределятся по Soft1 и Soft2 на всех девайсах (но неизвестно в каком порядке)

Автор: DarkNeo 2.9.2007, 21:35
math64, зачем тебе обрабатывать нажатия софт-клавиш, если ты используешь команды?
Убери их, выстави commandListener в null, и назначай действия на нажатия софтов..

Цитата(math64 @  2.9.2007,  01:31 Найти цитируемый пост)
то на реальном девайсе keyName был бы по русски (например Clear называется "Клавиша очистки", при выборе английского языка - "Clear key").

getKeyName() разве может что-то подобное возвратить? Что-то я очень сомневаюсь...
во всяком случае, предложенный мной вариант используют несколько десятков тысяч пользователей в моей программе... и всё ОК...что я делаю не так?

Автор: DarkNeo 2.9.2007, 23:26
Цитата(DarkNeo @ 2.9.2007,  21:35)
math64, зачем тебе обрабатывать нажатия софт-клавиш, если ты используешь команды?
Убери их, выстави commandListener в null, и назначай действия на нажатия софтов..

Цитата(math64 @  2.9.2007,  01:31 Найти цитируемый пост)
то на реальном девайсе keyName был бы по русски (например Clear называется "Клавиша очистки", при выборе английского языка - "Clear key").

getKeyName() разве может что-то подобное возвратить? Что-то я очень сомневаюсь...
во всяком случае, предложенный мной вариант используют несколько десятков тысяч пользователей в моей программе... и всё ОК...что я делаю не так?

хотя нет... верным будет такой код:
Код

else if (getKeyName(keyCode).equals("SOFT1") | getKeyName(keyCode).indexOf("Left") != -1) 

и
Код

else if (getKeyName(keyCode).equals("SOFT2") | getKeyName(keyCode).indexOf("Right") != -1)


вот это работало на всех телефонах, которые я видел.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)