Кто-нибудь может объяснить мне этот код? - PullRequest
0 голосов
/ 14 июля 2010
import javax.microedition.lcdui.*;
import javax.microedition.midlet.*;

public class SlideImage extends MIDlet{
  private Display display;

  public void startApp(){
    display = Display.getDisplay(this);
    display.setCurrent(new IconsCanvas()); 
  }

  public void pauseApp(){}

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

class IconsCanvas extends Canvas implements Runnable{
  SlideMenu menu = null;

  public IconsCanvas(){
    Image[] image = new Image[10];     
    try{
      image[0] = Image.createImage("/bollywood-height.png");
      image[1] = Image.createImage("/212229_1193669628.png");
      image[2] = Image.createImage("/95936_50.png");
      image[3] = Image.createImage("/shreya.png");
      image[4] = Image.createImage("/Aishw.png");
      image[5] = Image.createImage("/karishma.png");
      image[6] = Image.createImage("/tmb_jiahkhannishabd.png");
      image[7] = Image.createImage("/amisha.png");
      image[8] = Image.createImage("/shilpashetty.png");
      image[9] = Image.createImage("/priti.png");

      menu = new SlideMenu(new String[]{"1", "2", "3", "4", 
      "5", "6", "7", "8", "9", "10"},  
        image,  getWidth(),  getHeight());
      new Thread(this).start();
    }catch(Exception e){
      e.printStackTrace();
    }
  }

  protected void paint(Graphics g){
    menu.paint(g);
  }

  public void keyPressed(int key){
    int gameKey = getGameAction(key);
    if(gameKey == Canvas.RIGHT){
      menu.slideItem(1);
    }else if(gameKey == Canvas.LEFT){
      menu.slideItem(- 1);
    }
  }

  public void run(){
    try{
      while(true){
        repaint();
        synchronized(this){
          wait(100L);
        }
      }
    }catch(Exception e){
      e.printStackTrace();
    }
  }
}

У большинства вещей в этом коде есть причина для использования ... но все остальное, как

SlideMenu,
menu.paint(g),
menu.slideItem(1);
menu.slideItem(-1);

Выше я не могу понять, почему они были использованы...

Ответы [ 2 ]

4 голосов
/ 14 июля 2010

Он (ваш оригинальный фрагмент, метод run) выглядит как нить, единственной задачей которой является просто перекрасить компонент каждую десятую секунды.

Что касается компонента, к которому он относится, выне предоставил достаточно информации.Это зависит от объекта, для которого выполняется run().

С точки зрения бита synchronized это, скорее всего, способ предотвратить выполнение другими потоками компонента, пока этот поток находится в пределахsleep.

Если this является объектом xyz, то любой другой поток, пытающийся выполнить блок, подобный:

synchronized (xyz) {
    // Work your magic here.
}

, не сможет работать, пока wait прогрессирует.


Кстати, если вы используете четыре пробела в начале каждой строки кода (вместо <pre>), вы также получите хорошую раскраску синтаксиса.Если вы просто отметите весь бит кода в редакторе и используете CTRL K , он сделает это за вас автоматически.


И в терминахВ вашем обновлении SlideMenu (изображение на этой странице ) представляет собой меню, в котором один элемент отображается на экране, а стрелки влево / вправо позволяют прокручивать:

     +---------+
     |         |
 /   |         |   \
<    |  image  |    >
 \   |         |   /
     |         |
     +---------+

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

alt text

Без сомнения изображения в IconsCanvas съели пункты меню, чтобыдисплей.Имея это в виду, другие вещи имеют смысл.

  • SlideMenu, я уже описал.
  • menu.paint(g) вызывается для отображения нового меню в ответ наIconsCanvas получение запроса на рисование.
  • menu.SlideItem() перемещает меню влево или вправо в зависимости от аргумента.
  • Теперь значение 100 мс имеет больший смысл, если изображение фактически плавно прокручивается влевоили прямо.
0 голосов
/ 17 июля 2010

В приведенном выше фрагменте кода в блоке synchronized автор намерен просто подождать / уснуть, чтобы сотрудничать и позволить другим потокам работать, а wait () всегда должно быть synchronized.Но нет необходимости ставить в очередь столько перерисовок, сколько не происходит настоящей анимации, просто отображая статические слайды (изображения) при переходе к следующему / предыдущему;Canvas не будет признан недействительным до тех пор, пока не будет показан новый слайд (или не поступит вызов, и т. д.), то есть все будет в порядке, чтобы перекрашивать только при показе нового слайда.Обратите внимание, что если желательна «плавная прокрутка», такой эффект должен быть реализован самой SlideMenu, которая также должна позаботиться о расписании repaints () (против IconCanvas)

Другие комментарии:

  • Вкл. SlideMenu - необходимо увидеть его реализацию
  • Вкл. menu.paint(g) - он делегирует самому слайд-меню для рисования / обновления текущий слайд
  • Вкл. menu.slideItem(1); / menu.slideItem(-1); - не смотря на SlideMenu, кажется, что это механизм навигации следующий / предыдущий
  • Вы должны рассмотреть возможность создания IconCanvas и SlideMenu Singletons.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...