当我们选择了Canvas这个类,就意味着我们准备采用低级API,之所以称之为低级API,并不是因为它很低能,恰恰相反,我们可用它来处理一些很底层的系统事件,具体如何支持,我们要看硬件上的支持程度来判定。
下面列出判断硬件支持程度的方法列表:

所有的低级API都是从javax.microedition.lcdui.Canvas开始,我们必须继承Canvas,才可以建立一个显示在屏幕上的画面,需要注意的是每一个Canvas里面必须有一个抽象方法paint(),并且需要传入一个Graphics的引用,可以说Canvas的精华就在这个paint()方法里面,我们用这个方法来负责这个屏幕画面的描绘。
任何时候我们都可以用repaint()来产生重绘事件,repaint()一共有两个同名方法,其中一个需要四个参数,分别是起始坐标(x,y),还有宽度和高度,另外一个不需要任何参数,它是代表整个屏幕全部重新绘制,由此看来,前者的效率较后者要高,实际开发中也大多数是用前者而不是后者,我们调用了repaint()之后,会立刻返回,调用paint()则是由另外一个专门处理UI的线程来完成,如果我们希望等到paint()完成后再返回,我们可以在repaint()方法后加一个serviceRepaints()方法,它的作用是强制队列中的重绘事件尽快完成,如果队列中无重绘事件,它就什么也不会做,因此调用repaint()方法的时候,我们通常会在后面加一个serviceRepaints()方法。
我们在手机上绘制图象的坐标系和我们通常所见的坐标系是不一样的
<shape href="图片" type="#_x0000_t75" coordsize="21600,21600" id="_x0000_s1027" o:button="t" o:preferrelative="f" style="LEFT: 2362px; WIDTH: 7357px; POSITION: absolute; TOP: 6588px; HEIGHT: 3261px"><fill o:detectmouseclick="t"></fill><lock text="t" v:ext="edit"></lock></shape><stroke endarrow="block"></stroke><stroke endarrow="block"></stroke><textbox style="MARGIN-TOP: 4.656pt; LEFT: auto; MARGIN-LEFT: 8.281pt; WIDTH: 29.875pt; TOP: auto; HEIGHT: 23.312pt">
</textbox><textbox style="MARGIN-TOP: 4.875pt; LEFT: auto; MARGIN-LEFT: 8.281pt; WIDTH: 11.906pt; TOP: auto; HEIGHT: 31.031pt"></textbox><textbox style="MARGIN-TOP: 4.843pt; LEFT: auto; MARGIN-LEFT: 8.281pt; WIDTH: 65.906pt; TOP: auto; HEIGHT: 31.062pt"></textbox><stroke endarrow="block"></stroke><stroke endarrow="block"></stroke><textbox style="MARGIN-TOP: 5pt; LEFT: auto; MARGIN-LEFT: 8.312pt; WIDTH: 56.875pt; TOP: auto; HEIGHT: 15.468pt"></textbox><textbox style="MARGIN-TOP: 4.562pt; LEFT: auto; MARGIN-LEFT: 8.312pt; WIDTH: 2.875pt; TOP: auto; HEIGHT: 54.468pt"></textbox><textbox style="MARGIN-TOP: 4.375pt; LEFT: auto; MARGIN-LEFT: 8.312pt; WIDTH: 74.875pt; TOP: auto; HEIGHT: 46.656pt"></textbox>
这是我们在绘制图象时要注意的。
下面我们来讲一讲Graphics这个对象,我们可以把它当作一个白纸,只要调用这个方法,我们就可以运用自己的想象力在这张白纸上画出自己想要的图案。
下面我用一段简单的代码来说明一下这个Graphics对象的应用:
import javax.microedition.lcdui.*;
import javax.microedition.midlet.*;
public class test extends Canvas
{
public void paint(Graphics g)
{
g.setColor(255,255,0);
g.fillRect(0,0,getWidth(),getHeight());
int c=g.getColor();
int dc=g.getDisplayColor(g.getColor());
System.out.println("当前画面的颜色为:"+Integer.toHexString(c));
System.out.println("当前画面的R值为:"+g.getRedComponent());
System.out.println("当前画面的G值为:"+g.getGreenComponent());
System.out.println("当前画面的B值为:"+g.getBlueComponent());
System.out.println("当前画面的显示颜色为:"+Integer.toHexString(dc));
System.out.println("当前画面的灰度为:"+g.getGrayScale());
}
}
需要大家注意的是R,G,B的值只能在0——255之间,不可以超出这个范围,另外我们可以直接用0x00RRGGBB格式进行颜色的调配。
上面的代码简要说了一下Graphics几个重要的参数如何获得,下面我们就来谈一谈如何用Graphics做具体的图形,如果我们需要绘制一条直线,我们可以调用drawLine()方法,需要定义其开始坐标和结束坐标,共四个参数,同时,Graphics提供两种形式的线条,一个是虚线,即Graphics.DOTTED,一个是实线,即Graphics.SOLID,同样我们给出一段代码供大家参考:
import javax.microedition.lcdui.*;
import javax.microedition.midlet.*;
public class GraphicsTestCanvas2 extends Canvas
{
public void paint(Graphics g)
{
g.setColor(255,255,255);
g.fillRect(0,0,getWidth(),getHeight());
g.setColor(255,0,0);
g.drawLine(1,1,100,10);
g.setStrokeStyle(Graphics.DOTTED);
}
}
用类似的方法,我们可以实现用Graphics的drawRect()和drawRoundRect()方法来绘制矩形和圆角矩形,具体的方法应用,大家可以见WTK包的说明文档。
下面我们来说一说Canvas的屏幕事件处理。
Canvas本身有两种状态,一种是普通默认情况下的,一种是全屏状态,可以用setFullScreenMode()方法来对其设定,两者之间的区别在于当我们使用全屏幕状态的时候,Title,Ticker,以及我们的Command都无法在屏幕上显示,而且当我们调用setFullScreenMode()的时候,不管是什么模式,都会调用seizeChanged()这个方法,并传入屏幕的高度和宽度作为其参数,对于某些突发事件,比如说来电等等,屏幕会被系统画面所覆盖的时候,就会调用hideNotify()这个方法,当恢复原状时,就会调用我们原本的画面,那么系统就会同时调用showNotify()这个方法。
在Canvas里面我们每按下一个按键都会触发keyPressed()函数,并传入相应位置的整数值,我们在MIDP规范中可以很容易的发现,KEY_NUM0——KEY——NUM9十个常数分别代表键盘上的0-9,还有两个功能键,KEY_STAR,KEY_POUND,如果我们传入的值小于0,代表我们传入了不合法的keycode,某些机器上还支持连续按键响应,但这并不是JTWI规定要支持的,所以我们在进行实际开发之前一定要用我们前面讲到的hasRepeatEvents()方法来进行判定。
在索爱P<chmetcnv hasspace="False" numbertype="1" negative="False" sourcevalue="910" unitname="C" w:st="on" tcsc="0">910C</chmetcnv>这样的高端手机上,还支持屏幕的触控事件,同样这也不是JTWI做了硬性规定,所以我们实际开发中也要进行测试,我们在屏幕上点击,可以引发pointerPressed()函数,并传入当时位置的坐标,放开后,会引发pointerReleased()函数,同样也会传入坐标,具体的使用方法和keyPressed()以及keyReleased()大同小异,大家可以参考一下WTK的说明文档获得比较详细的方法使用规则
分享到:
相关推荐
韩顺平 Java 从入门到精通视频教程学习笔记整理(齐全) 本文档是韩顺平 Java 从入门到精通视频教程的学习笔记整理,共 94 讲,涵盖 Java 基础知识、Java SE、Java EE、Java ME 等方向的内容。 Java 基础知识 1. ...
JavaSE学习笔记整理涵盖了Java编程语言的基础知识,包括Java的基础概念、数据类型、数组、类和对象的使用、面向对象的高级特性、系统常用类、异常处理以及集合框架。在具体学习这些知识点前,理解Java的基本命令、...
本知识点总结来自于"Java从入门到精通视频教程(全94讲)学习笔记整理",涵盖了Java基础教程入门与精通视频教程笔记的要点,内容包括Java程序的运行机制、开发环境配置、基础语法、程序结构以及面向对象编程等多个方面...
### Java 学习笔记知识点梳理 #### Java 平台概述 - **J2SE(Java 2 Platform Standard Edition)**: 标准版平台,适用于桌面应用程序的开发。 - **J2EE(Java 2 Platform Enterprise Edition)**: 企业版平台,...
### 韩顺平Java视频教程(全94讲)学习笔记整理 #### Java平台概述 - **J2SE(Java Platform Standard Edition)**: 标准版Java开发平台,适用于桌面应用程序开发。 - **J2EE(Java Platform Enterprise Edition)**...
### 韩顺平Java从入门到精通视频教程学习笔记整理 #### Java开发平台与运行机制 - **J2SE(Java 2 Platform Standard Edition)**:Java的标准版平台,适用于开发桌面应用程序,包含了Java的核心类库和技术。 - **...
【Java 平台与版本】 ...总的来说,这个文档是韩顺平 Java 入门到精通视频教程的学习笔记,涵盖了从 Java 平台介绍、开发环境配置、语言基础到 Web 开发框架等多个方面,是全面学习 Java 技术的宝贵资源。
Java开发平台分为三个主要部分: 1. J2SE(Java Development Kit Standard Edition):这是Java的基础,用于桌面应用的开发,包含了Java的核心类库,如IO、网络编程、多线程等。 2. J2EE(Java Platform, ...
根据用途的不同,Java 可以分为三个主要版本:Java SE(标准版)、Java EE(企业版)以及 Java ME(微型版)。这些版本分别对应着不同的应用领域。 #### J2SE (Java 2 Platform Standard Edition) - **定义与用途*...
它被分为三个主要的开发方向: 1. **Java SE (J2SE)**:Java Standard Edition,主要用于桌面应用程序开发,是Java的基础。 2. **Java EE (J2EE)**:Java Enterprise Edition,专注于Web应用开发,提供了服务器端的...
由于本人目前允许上传的资源太小,所以无法上传整个的技术学习笔记(JAVA 五年的工作经验和学习笔记),待以后有机会会分享给大家。 技术体系包括: J2SE/J2ME/J2EE/JAVA代码优化/Flex(BlazeDS、PureMVC等技术)...
总之,Java从入门到精通涉及众多知识点,包括基础语法、面向对象编程、图形界面开发、数据库连接、文件处理、网络编程和多线程等,通过深入学习和实践,开发者可以掌握这一强大而灵活的编程语言。
Java学习笔记整理(齐全) 本资源是 Java 学习笔记的详细整理,涵盖了 Java 的基本概念、开发平台、编程步骤、面向对象编程、图形界面开发、数据库编程、文件IO流编程、网络编程、多线程编程等方面的知识点。 一、...
本资源摘要信息是根据马士兵的java视频整理的JAVA笔记,涵盖了JAVA基础知识、数据结构、语法基础、面向对象编程、异常处理、数组、集合类、线程、网络编程、图形化用户接口、元数据、正规表达式、JDK、Java Web编程...
- **JavaME (J2ME)**:主要应用于移动设备。 - **数据库系统**: - **SQL Server**:微软推出的数据库管理系统。 - **MySQL**:开放源代码的关系型数据库管理系统。 - **Oracle**:大型关系型数据库管理系统。 ...