2010-07-14 3 views
-1
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(); 
    } 
    } 
} 

Большинство вещей в этом коде я получил причину usage..but остальных вещей, какМожет ли кто-нибудь объяснить мне этот код?

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

выше вещи, я считаю, трудно понять, почему они были использованы ...

ответ

4

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

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

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

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

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

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


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


И, с точки зрения вашего обновления, SlideMenu (фото this page) оказывается меню, в котором один элемент отображается на экране и стрелки влево/вправо позволяет прокручивать:

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

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

alt text

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

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

Спасибо за ответ pax, но мое сомнение в том, что y wait (100L) помещается в синхронизированном (это), что произойдет, если это не так? –

+0

Это означает, что любой другой поток, который использует 'sych (that)' where' that' является компонентом, будет ждать, пока этот поток не остановится. Это похоже на форму борьбы. Я уточню свой ответ. – paxdiablo

+0

+1 для подсказки ctrl + k. –

0

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

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

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