上一次说到Android的Activity与J2ME的MIDlet的比较,那么这一次将要做对比的两个类,分别是J2ME的Displayable类与Android的View类。
说到Displayable类,也许大家没怎么直接用过,但是Canvas和Form这两个类对于J2ME手机编程的同学来说一定非常熟悉,它们分别是呈现低级用户UI和高级用户UI所必不可少的。以Canvas为例,J2ME对其封装了大量可被继承和Override的方法(其中paint(Graphics g)方法必须重写),这些方法的功能涵盖了触摸屏操作响应、按键响应以及屏幕绘制等多个方面。通过这些方法,我们可以监听用户的输入,并且向用户反馈不同的输出,即刷新屏显。上述功能是canvas作为UI必须要做的事情。
Android中的View类,功能还要强大很多,通过Override它的onDraw(Canvas canvas)方法可以实现屏幕的绘制,触摸屏响应与按键响应也通过设置默认的listener得以实现。
原理上说起来,这两个又是非常相像的,不过区别也很大,我列举几个我发现的区别。
1、repaint()方法与invalidate()/postInvalidate()方法
如果去读API,我们可以发现J2ME中Canvas的repaint()与Android中View的invalidate()/postInvalidate()方法实现了相同的功能(连说明文字几乎都一样…),但是invalidate()/postInvalidate()两者却有着区别:invalidate()只能在UI这个线程里通过调用onDraw(Canvas canvas)来update屏幕显示,而postInvalidate()是要在non-UI线程里做同样的事情的。这就要求我们做判断,哪个调用是本线程的,哪个不是,这在做多线程callback的时候尤为重要。而在J2ME中,不管怎样直接调用repaint()就好了
2、另外,Android的View类的显示很大程度上是从XML中读取的,包括了它的layout与很多属性,至于怎么读的以后再谈。而Canvas只需要Custom Draw就可以了,而且Canvas不能设置大小(那个fullScreenMode免谈),但是View可以。
3、View的构造函数,我们不需要再Activity中调用,但是Displayable的是必须的。在Activity中,我们要通过findViewById来从XML中取得View,然后强制转换成View的子类型即可,而J2ME的Canvas是一定要构造出来的。
4、也许在UI的应用上,Android比J2ME强大的地方,就在于它的View有很多定义好的子类能让我们调用,就像VS.net中WinForm编程中那些控件一样,会很方便,也很漂亮。因为Android开源,将来普及之后一定会有很多第三方的控件能为我们所用,这才是大大拓展了Android之处。这会把我们从那些graphics.drawXXX函数中解放出来,也能让我们的应用程序变得更酷更炫。
关于对View(Android)和Displayable(J2ME)——主要是Canvas的比较我就谈这么多,我想会有很多地方没有考虑到,以后再补充吧。还是老样子,怎么用去读API和示例程序,我就不多说了。
下一次应该是对Android的Bitmap类以及J2ME的Image类进行比较。
谢谢!
说到Displayable类,也许大家没怎么直接用过,但是Canvas和Form这两个类对于J2ME手机编程的同学来说一定非常熟悉,它们分别是呈现低级用户UI和高级用户UI所必不可少的。以Canvas为例,J2ME对其封装了大量可被继承和Override的方法(其中paint(Graphics g)方法必须重写),这些方法的功能涵盖了触摸屏操作响应、按键响应以及屏幕绘制等多个方面。通过这些方法,我们可以监听用户的输入,并且向用户反馈不同的输出,即刷新屏显。上述功能是canvas作为UI必须要做的事情。
Android中的View类,功能还要强大很多,通过Override它的onDraw(Canvas canvas)方法可以实现屏幕的绘制,触摸屏响应与按键响应也通过设置默认的listener得以实现。
原理上说起来,这两个又是非常相像的,不过区别也很大,我列举几个我发现的区别。
1、repaint()方法与invalidate()/postInvalidate()方法
如果去读API,我们可以发现J2ME中Canvas的repaint()与Android中View的invalidate()/postInvalidate()方法实现了相同的功能(连说明文字几乎都一样…),但是invalidate()/postInvalidate()两者却有着区别:invalidate()只能在UI这个线程里通过调用onDraw(Canvas canvas)来update屏幕显示,而postInvalidate()是要在non-UI线程里做同样的事情的。这就要求我们做判断,哪个调用是本线程的,哪个不是,这在做多线程callback的时候尤为重要。而在J2ME中,不管怎样直接调用repaint()就好了
2、另外,Android的View类的显示很大程度上是从XML中读取的,包括了它的layout与很多属性,至于怎么读的以后再谈。而Canvas只需要Custom Draw就可以了,而且Canvas不能设置大小(那个fullScreenMode免谈),但是View可以。
3、View的构造函数,我们不需要再Activity中调用,但是Displayable的是必须的。在Activity中,我们要通过findViewById来从XML中取得View,然后强制转换成View的子类型即可,而J2ME的Canvas是一定要构造出来的。
4、也许在UI的应用上,Android比J2ME强大的地方,就在于它的View有很多定义好的子类能让我们调用,就像VS.net中WinForm编程中那些控件一样,会很方便,也很漂亮。因为Android开源,将来普及之后一定会有很多第三方的控件能为我们所用,这才是大大拓展了Android之处。这会把我们从那些graphics.drawXXX函数中解放出来,也能让我们的应用程序变得更酷更炫。
关于对View(Android)和Displayable(J2ME)——主要是Canvas的比较我就谈这么多,我想会有很多地方没有考虑到,以后再补充吧。还是老样子,怎么用去读API和示例程序,我就不多说了。
下一次应该是对Android的Bitmap类以及J2ME的Image类进行比较。
谢谢!
---------------------------------------------------------------
缥缈落花街 月圆月缺 望峦山平川 雁返君未还 怆然晚春残 忆天上人间
缥缈落花街 月圆月缺 望峦山平川 雁返君未还 怆然晚春残 忆天上人间