别了j2me-->系统原理之低级api 与低级事件
众所周知不同的手机机型不同的品牌对于的硬件能力是不同的,这里给出如何在Kjava中判断你的机型到底支持些什么能力。然后具体讨论一下底层的三种事件,
即:①:屏幕事件 ,②: 按键事件 , ③:绘图事件
此图对应的方法可以在啊Canvas中找到!
①:屏幕事件
查看Canvas的源码可以看到对于屏幕事件会有这么几个函数: showNotify() , hideNotify() , sizeChanged(int w, int h) , setFullScreenMode(boolean);
与我们的屏幕事件息息相关!
讨论一:这里首先讨论困扰大家的问题:高级界面和低级界面到底能不能共享同一Display的问题 ??
一般的回答是高级界面和低级界面不能共享的,其实这是错误的回答。但是也并不是所有的高级控件都可以和低级控件放在一起使用的!
这里列出可以和低级界面一起使用的控件如下:
标题(Title)、走马灯(Ticker)以及Command
这里可以看到Canvas和Ticker 结合在一起的时候的画面! 主要代码(Title和command同理):
Ticker ticker = new Ticker("I'm ticker .....");
setTicker(ticker); (详见后面实例代码)
其实这个情况也可以理解,为什么setFullScreenMode(boolean);会存在
讨论二 :sizeChanged(int w, int h) 这个什么时候会出现呢 ?
这个函数是屏幕尺寸发生改变的时候会调用的。具体一般有这几种情况 : 第一次初始化的时候 ; setFullScreenMode(boolean); 的时候 ; 横屏与竖屏切换的时候 ; 这里给出实例重要代码(详见后面实例代码)
protected void sizeChanged(int w, int h) { System.out.println("sizeChanged : w = " +w + " h = " + h ); super.sizeChanged(w, h); } }结果 :
MyCanvas2
sizeChanged : w = 240 h = 291
sizeChanged : w = 240 h = 309
讨论三 :showNotify() , hideNotify() 与屏幕同在
当我们第一次显示Canvas的时候系统会调用showNotify() 这个通知应用程序管理器来显示这个Canvas ,当来电,短信等需要覆盖当前Canvas的时候需要调用hideNotify() 这个方法来隐藏 ! (详见后面实例代码)
protected void showNotify() { System.out.println("NotifyCanvas2--->showNodtify"); super.showNotify(); } protected void hideNotify() { System.out.println("NotifyCanvas2--->hideNotify"); super.hideNotify();结果:
NotifyCanvas1-->NotifyCanvas1
NotifyCanvas1-->showNodtify
NotifyCanvas1-->paint
NotifyCanvas2--->MyCanvas1
NotifyCanvas2--->showNodtify
NotifyCanvas1-->hideNotify
NotifyCanvas2--->paint
②:按键事件
通常产生一个按键事件后,需要调用一次repaint()进行屏幕重绘。特别是使用了serviceRepaints()强制重绘时,一定要在按键处理后再进行重绘以避免出现奇怪的现象。
MIDP里头提供两种方法getGameAction()和getKeyCode()让程序在处理键盘时更有移植性。选用任何一种方法都可以达到跨平台的目的。但是有所差异:getGameAction()当用户按下“上”或“2”时,此函数都有可能传回响应到Canvas.UP,属于多对一的方法;getKeyCode()只能传入几种定义好的返回值,返回唯一。可以按照需要进行选用,而从多样性的角度出发也可以直接使用函数传入的keyCode值,但是这样做在移植时就需要花费较大的精力在按键值的处理上。
触控屏幕事件处理在用hasPointerEvents()函数和hasPointerMotionEvents()函数询问系统后,处理起来的方式和按键事件基本一致,这里就不再复述了。
③:绘图事件
这里不讨论paint(Graphics)函数本身。因为这个本身的绘制是系统调用的,如果作为程序员来讲可以自行调用,而调用又又几种方式。接下来一一讲解
1 : repiant () :简单调用重绘整个屏幕
2 :repaint(x, y, width, height) :重绘指定区域
3 :serviceRepaints() :强制重绘 ,(当你的绘图操作比较多的时候,而且又要让绘制结束了才处理逻辑的时候非常有用,他可以确保你的绘图是完全的)
今天讨论的问题比较多,如果全部把代码贴上来看上去会很累,所以代码没有全部贴上,这里给出打包链接!http://download.****.net/source/3570130