上一次说到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类进行比较。

谢谢!

更多相关文章

  1. Android定位功能实现
  2. Android线程与ANR
  3. Android 设备root 原理及方法
  4. Android多进程app中Application回调onCreate()方法被执行多次分
  5. 【转】Ubuntu下Adb调试Android找不到设备的解决方法
  6. Android 辅助功能(无障碍)自定义开发类似微信抢红包插件
  7. [读书笔记]布局的屏幕适配常用方法
  8. 在Ubuntu为Android硬件抽象层(HAL)模块编写JNI方法提供Java访问硬
  9. android实现分享给好友功能

随机推荐

  1. PHP基于进程控制函数实现多线程
  2. 如何画角色透视?人物透视动态绘画步骤!
  3. JSP errorPage设置方法
  4. JSP bean获取各种参数
  5. PHP笛卡尔积实现原理及代码实例
  6. discuz论坛更换域名,详细文件修改步骤
  7. JSP输出HTML时产生的大量空格和换行的去
  8. 【北亚数据库数据恢复】使用delete命令未
  9. PHP连接MySQL数据库三种实现方法
  10. Python 分形算法代码详解