论坛首页 Java版 J2ME

Display

浏览 560 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (1) :: 隐藏帖 (0)
作者 正文
最后更新时间:2008-06-24 关键字: j2me display

最近在写一个测试工具,好好再次看了一下j2me 的api,感觉不再是"j2me内容很少,很简单",其中里面一个很简单的列子就是Display类,实话再次之前只要用过Display.getDisplay(midlet)和setCurrent();今天算是再次目睹了Display的真面容,其实Display的功能是十分的强大。

Display总结起来有两个作用:

1,获取屏幕的属性。色彩,支持的颜色数量信息。

 

isColor-----判断屏幕是否是彩色的

numColors------(如果是彩色的)获取手机,(如果不是彩色的)获取灰度程度

 

2,控制屏幕的显示。这是我们比较常用的。

setCurrent-----设置当前显示界面对象

getCurrent-----获取显示界面对象

callSerially-----是指定的线程对象首先暂停,等到屏幕的显示完毕后在继续执行

MIDP2.0以后增强了一些功能

  numAlphaLevels----获得设备对于透明度的支持

getBestImageHeight——获得设备支持的图片最佳高度

 getBestImageWidth——获得设备支持的图片最佳宽度

getBorderStyle——获得控件的边界格式

 getColor——获得高级用户界面中的默认颜色

还有背景、前景以及高亮时的背景和前景等等

 flashBacklight——控制手机背景灯的闪烁

 vibrate——控制手机震动

补充一下,设置闪烁和震动是很有用的,如我们在开发多媒体播放器的时候,有点手机在屏保出现的时候可能就会暂停播放,对于这样的手机你可将背景灯闪烁打开解决这样的问题。

 

   
最后更新时间:2008-06-25
平时用的最多的就是:Display.getDisplay(midlet)和setCurrent();
   
0 请登录后投票
最后更新时间:2008-07-01
能否用代码演示一下什么情况下应使用callSerially,如何用呢?
   
0 请登录后投票
最后更新时间:2008-07-01
这里主要是弄懂callSerially()跟serviceRepaints()区别。
我们在paint()的时候,要是使用serviceRepaints(),可能会造成死锁,callSerially()就是为了解决这个问题而来的。我们想在屏幕实时绘制一个动态的界面,首先得计算绘制对象的内容,然后调用repaint(),但是你怎么只是上一次paint()已经结束了呢?也许你会想到serviceRepaints(),使用serviceRepaints()的问题是paint()也许会调用另一个线程,此时调用serviceRepaints()的线程对paint()需要的一些资源家里锁,这样就会造成死锁,有了callSerially()这样的问题就容易解决了。不知道我解释的清楚否?
举一个简单的列子:
class StopWatchCanvas extends Canvas implements Runnable {
  int degree = 360;
  long startTime;
  int seconds;
  Display display;
  StopWatchCanvas (Display display, int seconds) {
    this.display = display;
    this.seconds = seconds;
    startTime = System.currentTimeMillis ();
}
public void paint (Graphics g) {
  g.setGrayScale (255);
  g.fillRect (0, 0, getWidth (), getHeight ());

  if (degree > 0) {
    g.setColor (255, 0, 0);
    g.fillArc (0,0, getWidth (), getHeight (), 90, degree);
    display.callSerially (this);
  }
  g.setGrayScale (0);
  g.drawArc (0, 0, getWidth ()-1, getHeight ()-1, 0, 360);
}
public void run () {
    int permille = (int) ((System.currentTimeMillis ()
              - startTime) / seconds);
    degree = 360 - (permille * 360) / 1000;
    repaint ();
  }
}
   
0 请登录后投票
最后更新时间:2008-07-04
还是不太清楚。
sun的描述大约可以翻译成:
callserially(Runnable r)将导致Runnable对象r的run()方法被放入序列化事件流中,它将在repaint周期完成后被尽快调用(如事件处理章节中的注意事项中的定义:所有通知给应用的寄送事件称为序列)。r.run()事件将按序列化顺序被调用。每调用一次callserially()将导致r.run()被调用一次,而且调用的顺序也按调用callserially()的顺序进行。

如果当前的Displayable对象在调用callserially()时,有一个被挂起的repaint()方法,那么该画布的paint()方法会在Runnable对象r的run()方法调用完成前被调用并返回,缓冲区会被交换(如果双缓冲被激活),如果当调用callserially()时,当前的Displayable对象有一个或多个CustomerItems的repaint()被挂起,也是如此。run()方法将被及时调用,但不能保证在repaint周期结束后立即被调用,甚至不能保证在下一个事件的寄送前被调用。

可以从任何线程调用callserially()。run()方法将会由于调用callserially()而被独立地被调。应该特别注意的是,callserially()绝不会座等待r.run()返回。

与其它回叫的方法一样,r.run()方法必须迅速返回。如果有必要执行长时间的处理,它可能仅进行一些初始化的工作,正式的处理则应由另一个线程进行,以便run()迅速返回。

该callserially()机制可能被应用于动画绘制中同步repaint周期。一个典型的应用是将建立一个显示框架,然后调用repaint()。就算下一帧已准备好,应用也要等到框架显示完成后,再调用的run()通知应用程序,上一帧的框架已完成绘画,可以继续绘制下一帧动画。

而其例子也可以理解,但在实际的应用中,用在什么实际的情况下呢?
   
0 请登录后投票
论坛首页 Java版 J2ME

跳转论坛:
JavaEye推荐