浏览 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——控制手机震动 补充一下,设置闪烁和震动是很有用的,如我们在开发多媒体播放器的时候,有点手机在屏保出现的时候可能就会暂停播放,对于这样的手机你可将背景灯闪烁打开解决这样的问题。
声明:JavaEye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
|
|
| 返回顶楼 | |
|
最后更新时间:2008-06-25
平时用的最多的就是:Display.getDisplay(midlet)和setCurrent();
|
|
| 返回顶楼 | |
|
最后更新时间:2008-07-01
能否用代码演示一下什么情况下应使用callSerially,如何用呢?
|
|
| 返回顶楼 | |
|
最后更新时间: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 (); } } |
|
| 返回顶楼 | |
|
最后更新时间: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()通知应用程序,上一帧的框架已完成绘画,可以继续绘制下一帧动画。 而其例子也可以理解,但在实际的应用中,用在什么实际的情况下呢? |
|
| 返回顶楼 | |





