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);
以上事项,我很难知道为什么使用它们......
答案 0 :(得分:4)
它(您的原始代码段,run
方法)看起来像一个线程,其唯一的任务就是每十分之一秒重新绘制一次该组件。
至于它所指的组件,您没有提供足够的信息。这取决于run()
正在运行的对象。
就synchronized
位而言,当这个线程在sleep
范围内时,这很可能是一种阻止其他线程对组件执行操作的方法。
如果this
是对象xyz
,那么任何其他尝试执行块的线程如:
synchronized (xyz) {
// Work your magic here.
}
<{1}}正在进行中,将无法运行。
顺便说一句,如果你在每个代码行的开头使用四个空格(而不是wait
),你也会得到漂亮的语法着色。如果您只是在编辑器中标记整个代码并使用 CTRL K ,那么它将自动执行此操作。
而且,就您的更新而言,SlideMenu(this page上的图片)似乎是一个菜单,其中一个项目显示在屏幕上,左/右箭头允许您滚动:
<pre>
(原谅我可怜的图形能力,如果下面的链接消失,我会留在那里)。
毫无疑问, +---------+
| |
/ | | \
< | image | >
\ | | /
| |
+---------+
中的图像会显示要显示的菜单项。考虑到这一点,其他事情是有道理的。
IconsCanvas
,我已经描述过了。SlideMenu
显示新菜单以响应menu.paint(g)
获取绘画请求。IconsCanvas
根据参数向左或向右滑动菜单。答案 1 :(得分:0)
在上面的代码片段中,在synchronized
块上,作者的目的只是等待/休眠以便合作并让其他线程运行,而wait()必须始终为synchronized
。但是没有必要排队那么多重绘,因为没有真正的动画,只是在前进到下一个/上一个时显示静态幻灯片(图像);在显示新幻灯片(或来电等)之前,Canvas不会失效,这意味着只有在显示新幻灯片时才能重新绘制。请注意,如果需要“平滑滚动”,则此类效果应由SlideMenu
本身实现,其中还必须处理重绘()调度(与IconCanvas
对比)
其他评论:
SlideMenu
- 需要查看其实施情况menu.paint(g)
上 - 它委托给幻灯片菜单本身来绘制/刷新当前幻灯片menu.slideItem(1);
/ menu.slideItem(-1);
- 不看SlideMenu
,它似乎是下一个/上一个导航的机制IconCanvas
和SlideMenu
单身人士。