- 浏览: 890362 次
- 性别:
- 来自: 杭州
-
文章分类
最新评论
-
hzw2312:
C = sin(MLatA)*sin(MLatB)*cos(M ...
根据地球上任意两点的经纬度计算两点间的距离 -
zhang_sun:
rewind方法的limit又是多少呢?等于capacity? ...
ByteBuffer的flip,clear及rewind区别 -
kalogen:
一种每次都获取到不同的随机数的办法int ranseed=12 ...
J2ME中Random类的使用 -
kalogen:
估计部署在某个端口下吧,仔细检查一下发布的配置文件
Tomcat负载均衡和集群环境的搭建 -
zhuchao_ko:
文件大点就嗝屁了~~~
Axis 1.4 上传二进制文件(base64Binary)
J2ME与Android系统的常用类、方法对比 |
||
|
J2ME系统 |
Android系统 |
入口程序 |
MIDlet类 |
Activity类 |
图片类 |
Image类 Image.createImage(path); |
BitMap类 BitmapFactory.decodeResource(getResources(),R.drawable.map0); |
画笔 |
Graphics类 |
Canvas类 |
绘画 |
Displayable类 |
View类 |
按键 |
keyPressed() keyRepeated() keyReleased() |
onKeyDown() onKeyUp() onTracKballEvent() |
触笔 |
pointerPressed(), pointerReleased(), pointerDragged() |
onTouchEvent() |
打印信息 |
System.out.printlt() |
Log类 |
生命周期-开始 |
startApp(),活动状态,启动时调用,初始化。 |
onCreate(),返回时也会调用此方法。 onCreate()后调用onStart(), onStart()后调用onResume(), |
生命周期-暂停 |
PauseApp(),暂停状态,如来电时,调用该接口。 |
onPause() |
生命周期-销毁 |
destroyApp(),销毁状态,退出时调用。 |
onStop(),程序不可见时调用onDestroy(),程序销毁时调用 |
刷新 |
高级UI组件由内部刷新实现。 低级UI,canvas中通过调用线程结合repaint()来刷新,让线程不断循环 |
高级UIHandler类通过消息的机制刷新 onDraw()刷新接口 低级UI开发者用线程控制更新,在lockCanvas()和unlockCanvasAndPost()方法之间绘制 |
数据存储 |
Record Management System (RMS) |
SQLite数据库 SharedPreferences类 |
可绘区域 |
int clipX = g.getClipX(); int clipY = g.getClipY(); int clipW = g.getClipWidth(); int clipH = g.getClipHeight(); g.clipRect(x, y, width, height); g.setClip(clipX, clipY, clipW, clipH); |
canvas.save(); canvas.clipRect(x,y,x+width, y+height); cavnas.resave(); |
游戏中清屏 |
paint.setStyle(Style.FILL); canvas.drawRect(new Rect(0, 0, getWidth(), getHeight()), paint); |
canvas.drawColor(Color.BLACK); |
游戏开发包 |
javax.microedition.lcdui.game包 GameCanvas类 Layer类 LayerManager类 Sprite类 TiledLayer类 |
无专门针对游戏的开发包,可以直接拿来主义,将J2ME的开发包稍作修改 |
音效 |
Player s =Manager.createPlayer(InputStream); s.prepare(); //创建 s.start();//播放 s.stop();//暂停 s.stop();//关闭 s.release();//释放 |
MediaPlayer类处理背景音乐 SoundPool类处理一些简单的音效 |
全屏 |
Canvas中SetFullScreenMode() |
getWindow().setFlags( WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); requestWindowFeature(Window.FEATURE_NO_TITLE); |
获得屏幕尺寸 |
Canvas类的getHeight()和getWidth() |
Display d = getWindowManager().getDefaultDisplay(); screenWidth = d.getWidth(); screenHeight = d.getHeight(); |
双缓冲 |
Image bufImage=Image.createImage(bufWidth, bufHeight); Graphics bufGraphics=bufImage.getGraphics(); |
Bitmap carBuffer = Bitmap.createBitmap(bufWidth, bufHeight, Bitmap.Config.ARGB_4444); Canvas carGp = new Canvas(carBuffer); |
|
|
|
|
一、 程序入口
J2me程序入口类为MIDlet,所有的j2me程序都要继承该类来初始化j2me程序。Android程序入口是Activity类。下面先看看它们的生命周期。
J2me MIDlet生命周期
1、 startApp (活动状态)程序启动的时候会调用该方法来初始化用户需要的资源。
2、 PauseApp (暂停状态)当手机来电接电话的时候,会调用该接口。用户可以调用该接口停止也写线程的操作。
3、 destroyApp (销毁状态)程序退出的时候调用。用户可以调用该接口处理处于活动状态的线程。
该几个周期状态有AMS调用转换,也可以程序代码调用转换。resumeRequest调用会的结果是AMS会调用startApp方法,notifyPaused调用的结果是可能AMS调用PsuseApp,notifyDestroyed调用会使AMS销毁该midlet。
Android Activity生命周期
1、 onCreate 程序开始初始化的时候调用该接口,用户导航返回到Activity的时候也会调用该接口。类似于J2me里面多个Canvase(Displayable)切换。所以Activity也类似于Displayable。
2、 onStart onCreate调用完后,程序调用该接口。
3、 onResume onStart调用后调用该接口。此时Activity进入运行状态。
4、 onPause 新的Activity启动的时候调用该接口。
5、 onStop 该Activity 不可见的时候调用。
6、 onDestroy 程序销毁的时候调用。
二、显示组件
J2me 中所有可显示的组件都是直接或间接的继承了Displayable,直接的是Canvas和Screen。不同的继承导致了低级UI和高级UI的区别。 J2me中现成的UI组件都是直接或者间接继承了Screen。只要调用Display.getDisplay(MIDLet instan).setCurrrent(Displayable disp),就可以把组件显示到手机界面上。切换界面的时候也可以使用该接口。
Android 可见的组件直接或者间接继承了android.view.View。通过Activity.setContentView(View view)就可以显示在android手机界面上,切换界面的时候也可以使用该接口。如果是直接继承了View而不是Android自带的UI组件,那么还要自己去实现它的刷新,类似J2me的低级UI组件。
三、UI
J2me高级UI组件由组件内部刷新实现,低级UI可以通过 Canvas的repain()来刷新。低级UI架构可以用MVC方式来实现,建议使用二级缓存。Android提供接口onLayout来提供该 View调整其里面组件元素的位置布局,用户只需要重写该接口就ok。刷新接口onDraw,该接口用来刷新界面里面的绘制元素。该接口类似j2me Canvas的paint接口。不过两个平台传得参数有些意思。J2me传的时Graphics,而android传得是Canvas。Android绘制的时候会传入一个参数Paint。该对象表示绘制的风格,比如颜色,字体大小,字体格式等。如果是移植的话,建议android也使用二级缓存,这样也容易管理。
如果去读API,我们可以发现J2ME中Canvas的repaint()与Android中View的 invalidate()/postInvalidate()方法实现了相同的功能,但是invalidate()/postInvalidate()两者却有着区别:invalidate()只能在UI这个线程里通过调用onDraw(Canvas canvas)来update屏幕显示,而postInvalidate()是要在non-UI线程里做同样的事情的。这就要求我们做判断,哪个调用是本线程的,哪个不是,这在做多线程callback的时候尤为重要。而在J2ME中,不管怎样直接调用repaint()就好了。
另外,Android的View类的显示很大程度上是从XML中读取的,包括了它的layout与很多属性,至于怎么读的以后再谈。而Canvas只需要 Custom Draw就可以了,而且Canvas不能设置大小(那个fullScreenMode免谈),但是View可以。
View 的构造函数,我们不需要再Activity中调用,但是Displayable的是必须的。在Activity中,我们要通过findViewById来从XML中取得View,然后强制转换成View的子类型即可,而J2ME的Canvas是一定要构造出来的。
也许在UI的应用上,Android比J2ME强大的地方,就在于它的View有很多定义好的子类能让我们调用,很方便,也很漂亮。因为Android开源,将来普及之后一定会有很多第三方的控件能为我们所用,这才是大大拓展了Android之处。这会把我们从那些graphics.drawXXX函数中解放出来,也能让我们的应用程序变得更酷更炫。
四、用户事件处理
在J2ME下,Canvas可以响应按键事件与触摸屏事件,它封装了六个 protected的方法,响应六种不同的事件:keyPressed(int keyCode)用于响应按键压下、keyReleased(int keyCode)用于响应按键释放、keyRepeated(int keyCode)用于响应按键长时间压下不释放;pointerDragged(int x,int y)用于响应触摸屏拖拽、pointerPressed(int x,int y)用于响应触摸屏点击、pointerReleased(int x,int y)用于响应触摸屏释放。其中参数方面,keyCode告诉我们哪个按键触发的事件,x、y分别告诉我们触摸屏被点击的坐标(绝对位置)。
在 Android下,View同样可以响应以上两种事件,分别有:boolean onKeyDown(int keyCode,KeyEvent event)用于响应按键点击、boolean onKeyMultiple(int keyCode, int repeatCount,KeyEvent event)用于响应按键重复点击、boolean onKeyUp(int keyCode,KeyEvent event)用于响应按键释放以及onTouchEvent(MotionEvent event)用于响应触摸屏事件。官方API指出onKeyMultiple方法总是返回false的,即它没有handle,因此必须重写才能实现。
在键盘事件方面,J2ME与Android的区别在于Android中定义了KeyEvent这个类,用于描述按键事件。这个KeyEvent可不简单,它能够将一个按键事件描述的淋漓尽致。它的getAction()方法,可以得到按键的行为(down、up or multiple);它的getDownTime()可以得到最近一次keyDown事件发生的时间;它的getEventTime()可以得到本次事件发生的时间;它的getRepeatCount() 可以得到同一按键被连续点击的次数(这个很大程度上是为onKeyMultiple方法设计的)。有一点是非常需要注意的,Android底层在触发 keyDown事件时,有一点与J2ME很不一样:比如我们按下一个键但不释放,J2ME只触发一次keyDown事件由keyPressed()执行,然后就交给keyRepeated()处理,然而Android是每隔一段时间(几十毫秒)就触发一次,onKeyDown方法会连续响应事件,造成意想不到的事情。想解决这个问题倒也不难,你可以通过getAction判断这次事件是否是keyDown,如果是的话,用getEventTime()减去 getDownTime(),如果这个数值太小,可以选择不响应。这个方法简单,但是如果用户输入太快,真正的输入也可能被忽略掉,所以还有另外一种方法:维护一个堆栈,在重写onKeyDown()与onKeyUp()方法的时候,如果getAction()是keyDown,就入栈,如果是 keyUp,就出栈,如果得到一个事件,当它是keyDown的时候,如果当前栈顶是keyDown,就选择性不响应这个事件,这样的话,长点击就相当于一次点击。其实有一些view的子类,比如Button加入了onLongClick()的处理方法这样即使你用选中这个view,长时间按下选择键,也可以相应的处理。
在触摸屏方面,Android只有onTouchEvent()来处理,但是由于它的参数中有 MotionEvent,所以J2ME下分开的三种事件可以通过MotionEvent的getAction()方法加以区分。比较有意思的是 MotionEvent中有一个getPressure()方法,能够得到点击的压力,看来Android手机的元件精密程度很高,乃至软件可以得到压力的大小并通过它来做一些逻辑。
还有一点,Android的KeyEvent与MotionEvent是可以自己构造的,KeyEvent可以通过dispatch()方法将自己传递给KeyEvent的Callback,即事件响应处理方法,这样就能让我们做一个软键盘出来,也可以做许多别的事情。
五、数据库
它们的区别在于android的sqlite很容易建立表到表之前的关联,而J2ME必须实现自己的一套框架,而且ANDROID的sqlite提供一些接口(如:SQLiteOpenHelper),数据库开发会很容易, J2ME可以看成在一个文件读写一些序列化的东西,而android只要会一些sql语句。
发表评论
-
eclipse中j2me项目引入jar包后,运行时报ClassNotFoundError的解决方法
2014-07-14 17:12 924在j2me项目中引入一个jar包,然后使用jar包里面的类做 ... -
wtk的默认模拟器修改
2014-04-29 00:07 666点击wtk目录下/bin/DefaultDevicew.e ... -
Could not find jar tool executable问题解决
2014-03-21 00:28 1272eclipse 中,在用PROGUARD生成混淆包Obfus ... -
WTK 模拟器的内存修改
2013-10-18 13:15 785在使用WTK模拟器运行较大的程序时偶尔会报内存不足的异常,解 ... -
j2me中sprite的旋转参考点的设定
2013-09-23 15:07 561默认在图片的左上角,可以用defineReferencePix ... -
J2ME用大华模拟器开发的一个小头痛的问题!
2013-08-21 15:06 831throw new UnsupportedOperation ... -
Installation error: INSTALL_PARSE_FAILED_MANIFEST_MALFORMED
2013-08-02 15:27 697Installation error: INSTALL_PA ... -
解决ADB server didn't ACK问题
2013-08-01 16:06 1022之前运行eclipse执行android应用都没问题,今天突然 ... -
java/lang/OutOfMemoryError:Maximum byte code length (32kB) exceeded .
2013-02-05 17:18 1168Uncaught exception java/lang/ ... -
Android应用签名
2013-01-08 15:05 1402为了要签名? 开发Android的人这么多,完全 ... -
Android中图片与屏幕密度 .
2012-10-10 14:19 874在drawable中的图片在不同密度的设备上显示时,在屏幕上的 ... -
在电脑上安装Android模拟器-部分更新详解
2012-10-09 17:03 1427本文根据如下的模拟器 ... -
android 反射机制中 getMethod()和getDeclaredField()区别
2012-09-15 11:33 10430今天在程序中用到java反 ... -
android2.2 的cookie
2012-08-29 19:22 932public static void getCookies(H ... -
把第三方的jar打包到android的apk文件中
2012-08-23 16:34 2432在android项目中新建一个文件夹libs,必须用这个,不能 ... -
Android调用天气预报的WebService简单例子
2012-08-23 11:47 1025下面例子改自网上例子:http://express.ruank ... -
android 正则表达式
2012-08-21 15:58 1333只能输入数字:"^[0-9]*$"。只能输 ... -
用反射功能找不到匹配的类的时候调试方法
2012-08-19 14:17 3600可以通过输出所有的methods 或者declaredMeth ... -
android 生命周期研究资料
2012-08-06 16:46 1131引言 应用程序组件有一个生命周期——一开始Android ... -
Android-----WebView使用
2012-08-01 20:06 1072大部分内容为网上整理其它高人的帖子,现只作整理,用于查看: ...
相关推荐
10. **J2ME的未来**:探讨J2ME技术的发展趋势,以及与Android、iOS等现代移动平台的竞争和协作关系。 总之,“J2ME开发帮助手册”是一份全面的参考资料,无论你是初学者还是经验丰富的开发者,都能从中找到有价值的...
了解Android SDK、Android Studio的使用,以及Android的四大组件(Activity、Service、BroadcastReceiver、ContentProvider)有助于对比和拓展你的移动开发技能。 7. **数据库**:J2ME可以使用SQLite这样的轻量级...
此外,由于J2ME(Java 2 Micro Edition)在早期移动游戏开发中的广泛应用,书里可能也会提及J2ME的基本概念,对比分析它与Android游戏开发的异同。 3. **Android SDK与Eclipse集成开发环境**:开发OPhone游戏需要...
稳压罐sw16_三维3D设计图纸_包括零件图_机械3D图可修改打包下载_三维3D设计图纸_包括零件图_机械3D图可修改打包下载.zip
内容概要:本文详细介绍了利用递推最小二乘法(RLS)进行永磁同步电机参数辨识的方法及其MATLAB仿真过程。首先解释了RLS算法的优势,如不需要概率模型、计算量适中以及适用于嵌入式系统的实时参数更新。接着展示了将电机电压方程转换为标准形式Y=φθ的具体步骤,并提供了核心的RLS迭代代码。文中还讨论了仿真过程中的一些关键技术细节,如遗忘因子的选择、协方差矩阵的初始化和更新方式、电流信号的处理方法等。最终给出了仿真结果,显示电阻和电感的辨识误差分别达到了0.08%和0.12%,并指出了实际应用中需要注意的数据同步和数值稳定性问题。 适合人群:从事电机控制研究的技术人员、研究生及以上学历的学生。 使用场景及目标:①帮助研究人员理解和掌握RLS算法在电机参数辨识中的应用;②提供详细的仿真代码和配置建议,便于快速搭建实验环境;③指导如何优化算法性能,提高参数辨识精度。 其他说明:本文不仅涵盖了理论推导,还包括了大量的实践经验分享和技术细节探讨,有助于读者全面理解RLS算法的实际应用。同时,文中提到的仿真方案可以方便地移植到DSP平台,进一步扩展了其实用价值。
零起点Python大数据与量化交易
管道清污机器人sw16可编辑_三维3D设计图纸_包括零件图_机械3D图可修改打包下载_三维3D设计图纸_包括零件图_机械3D图可修改打包下载.zip
电子仿真教程,从基础到精通,每个压缩包15篇教程,每篇教程5000字以上。
电子仿真教程,从基础到精通,每个压缩包15篇教程,每篇教程5000字以上。
1、文件说明: Centos8操作系统thai-scalable-garuda-fonts-0.6.5-1.el8.rpm以及相关依赖,全打包为一个tar.gz压缩包 2、安装指令: #Step1、解压 tar -zxvf thai-scalable-garuda-fonts-0.6.5-1.el8.tar.gz #Step2、进入解压后的目录,执行安装 sudo rpm -ivh *.rpm
内容概要:本文详细介绍了利用ABAQUS进行滑坡和沉降对埋地管道影响的有限元分析方法。主要内容涵盖了几何建模、材料属性定义、接触设置、边界条件与加载等方面的技术细节。通过具体的Python脚本示例展示了如何构建模型,并深入探讨了滑坡和沉降条件下管道的应力、应变分布及其潜在破坏机制。此外,还分享了一些实战经验和优化技巧,如材料模型选择、接触条件设置、边界条件处理等,强调了这些因素对结果准确性的重要影响。 适合人群:从事地下管道工程设计、施工及维护的专业技术人员,尤其是那些希望深入了解滑坡和沉降对管道影响的研究人员和技术专家。 使用场景及目标:适用于评估和预测滑坡和沉降对埋地管道造成的力学响应,帮助工程师们更好地理解和应对复杂的地质灾害环境,从而提高管道系统的安全性与稳定性。 其他说明:文中提供的Python代码片段仅为示意,具体实施时需结合ABAQUS的实际接口和项目需求进行适当调整。同时,对于大规模模型的计算,建议使用高性能计算资源以确保效率和精度。
Java一天面试突击,迅速掌握Java常见面试题
莲子去壳机设计模型SW10_三维3D设计图纸_包括零件图_机械3D图可修改打包下载_三维3D设计图纸_包括零件图_机械3D图可修改打包下载.zip
MFRC-522+RC522+RFID射频+IC卡感应模块
内容概要:《学术研究提示设计 50 招》是一份详尽的指南,旨在帮助研究人员提高学术写作和研究效率。该文档涵盖了从论文撰写、润色、翻译、查重降重、参考文献管理、投稿审稿到文献阅读等多个方面的具体操作指令。每一章节均针对特定任务提供了详细的步骤和注意事项,例如如何撰写标题、摘要、致谢,如何进行英文润色、中英翻译,以及如何优化逻辑结构等。文档还介绍了如何利用AI工具进行文献分析、术语表提取和研究方向探索等内容,为研究者提供了全面的支持。 适合人群:适用于学术研究人员,特别是那些需要撰写、润色和提交学术论文的研究者,包括研究生、博士生及高校教师等。 使用场景及目标:① 提供一系列具体的指令,帮助研究者高效完成论文的各个部分,如撰写标题、摘要、致谢等;② 提供润色和翻译的详细指导,确保论文语言的准确性和专业性;③ 提供查重降重的方法,确保论文的原创性;④ 提供参考文献管理和投稿审稿的指导,帮助研究者顺利发表论文;⑤ 利用AI工具进行文献分析、术语表提取和研究方向探索,提高研究效率。 阅读建议:此资源不仅提供了具体的指令和方法,更重要的是引导研究者如何思考和解决问题。因此,在学习过程中,不仅要关注具体的步骤,还要理解背后的原理和逻辑,结合实际案例进行实践和反思。
项目optionc-20250409
2023年c语言程序设计基本概念考点归纳.doc
电子仿真教程,从基础到精通,每个压缩包15篇教程,每篇教程5000字以上。
内容概要:本文详细介绍了使用Matlab进行模拟和数字滤波器设计的方法,涵盖了巴特沃斯、切比雪夫等多种经典滤波器类型。首先讲解了模拟滤波器的设计,如巴特沃斯滤波器的通带平坦性和切比雪夫滤波器的通带波纹特性,并提供了具体的代码示例。接着讨论了数字滤波器的设计,包括IIR滤波器的递归特性和FIR滤波器的线性相位特性,同样附有详细的代码实现。文中还特别强调了不同类型滤波器之间的转换方法以及设计过程中常见的注意事项,如频率归一化、阶数选择等。最后推荐了一些实用的Matlab工具,如fvtool和FDATool,帮助用户更直观地理解和调试滤波器设计。 适合人群:具有一定信号处理基础和技术背景的研究人员、工程师及学生。 使用场景及目标:适用于需要进行滤波器设计的实际工程应用,如通信系统、音频处理等领域。目标是让读者掌握滤波器设计的基本原理和具体实现方法,能够独立完成滤波器的设计和调试。 其他说明:文章不仅提供了理论知识,还通过大量实例代码帮助读者更好地理解和应用所学内容。建议读者在实践中多尝试不同的参数配置,以加深对滤波器特性的理解。
饲料干燥装置sw16_三维3D设计图纸_包括零件图_机械3D图可修改打包下载_三维3D设计图纸_包括零件图_机械3D图可修改打包下载.zip