资源预览内容
第1页 / 共28页
第2页 / 共28页
第3页 / 共28页
第4页 / 共28页
第5页 / 共28页
第6页 / 共28页
第7页 / 共28页
第8页 / 共28页
第9页 / 共28页
第10页 / 共28页
亲,该文档总共28页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
郭克华郭克华J2ME移动开发移动开发 实战教学视频讲义实战教学视频讲义 第第 12 章章 Canvas 绘图绘图 郭克华所有作品由郭克华所有作品由 ChinaSEI 独家发布。独家发布。 网址为:网址为:http:/www.chinasei.com 对应视频可在对应视频可在http:/www.chinasei.com上下载。上下载。 本讲义属于郭克华团队网友整理,比视频略有扩充,如果有文字等小错, 请多包涵。本讲义属于郭克华团队网友整理,比视频略有扩充,如果有文字等小错, 请多包涵。 在不盈利的情况下,欢迎免费传播。在不盈利的情况下,欢迎免费传播。 版权所有版权所有.郭克华郭克华 本讲义经过修正、扩充,连同视频,由清华大学出版社出版。本讲义经过修正、扩充,连同视频,由清华大学出版社出版。 详细可查询详细可查询 http:/www.china-pub.com/49067, http:/product.dangdang.com/product.aspx?product_id=20742080 第第 12 章章 Canvas 绘图绘图 【本章导读语】 在本书的前面几章中,我们介绍了高级界面的开发。高级界面就是界面上的效果都是 由控件组成的; 与此对应的是低级界面, 就是界面效果都是通过编程, 在画布上画出来的。 打开文档,找到 javax.microedition.lcdui 包,这个包里面包含了我们制作界面的最基本的 API。打开其树型图,可以看到如图的结构: Displayable 的子类可以充满整个界面, 但是 Displayable 是一个抽象类, 我们可以用它 的子类。Displayable 的直接子类有两个:Canvas 和 Screen。其中,Screen 的子类就是我们 以前讲的高级界面,而 Canvas 就提供了低级界面开发的支持。 如前所述,低级界面上的所有效果都是画出来的,因此,本章将重点介绍低级界面, 以及在低级界面上的画图。本章重点讲解的是以下 API: 1:画布类: 2:画笔类: 【12-1】开发全屏幕画布 实例需求 javax.microedition.lcdui.Canvas 也是 Displayable 的子类,也能充满整个界面。本节中 将在 MIDlet 上显示一个画布,并且全屏幕显示,实现如图 12-1 所示的界面: J2ME 移动开发实战教程 图 12-1 程序效果(右边为全屏效果) 左边界面是没有全屏幕显示时的效果。我们要开发的是右边的界面。在该界面中我们 可以发现,画布上面的标题消失了,这说明画布以全屏幕形式显示。在界面右下角有一个 命令按钮: “命令” ,当然,全屏幕并不能让命令按钮消失。 开发过程 第一步:了解基本知识。 Canvas 是画布,是 Displayable 的子类,可以充满整个界面。因此,Canvas 添加到界 面上的方法和 Form 完全相同。打开文档,找到 javax.microedition.lcdui.Canvas,首先介绍 其构造函数,构造函数有 1 个: 这个函数是保护性的,无法直接使用,因此,一般方法是对 Canvas 进行扩展。在画 布上画一些内容,最后显示在 MIDlet 上。 在 Canvas 类中,有如下重要成员函数: 1: 该函数是抽象函数,如果扩展了 Canvas 类,就必须对 paint 函数进行重写。该函数里 面可以包含画图的代码。 注意,该方法是在界面出现时自动调用的! 2: 该函数负责调用 paint 函数。 3: ? 2 ?第 12 章 Canvas 绘图 该函数可以设置画布是否以全屏幕显示。如果为 true,则全屏幕显示。 综上所述,画布开发的基本结构如下: 结构如下: public class MIDlet1 extends MIDlet /画布类 class MyCanvas extends Canvas public void paint(Graphics g) /在画布上画图 private MyCanvas mc = new MyCanvas(); private Display dis; protected void startApp() throws MIDletStateChangeException dis = Display.getDisplay(this); dis.setCurrent(mc); /其他代码 第二步:代码编写。 建立一个项目:Prj12_1,在里面建立一个 MIDlet1,打开,将代码改为: MIDlet1.java package prj12_1; import javax.microedition.lcdui.Canvas; import javax.microedition.lcdui.Command; import javax.microedition.lcdui.Display; import javax.microedition.lcdui.Graphics; import javax.microedition.midlet.MIDlet; import javax.microedition.midlet.MIDletStateChangeException; public class MIDlet1 extends MIDlet private MyCanvas mc = new MyCanvas(); private Display dis; protected void startApp() throws MIDletStateChangeException dis = Display.getDisplay(this); mc.setTitle(“MyCanvas“); /画布全屏幕 ? 3 ? J2ME 移动开发实战教程 mc.setFullScreenMode(true); dis.setCurrent(mc); mc.addCommand(new Command(“命令“,Command.SCREEN,1); protected void destroyApp(boolean arg0) throws MIDletStateChangeException protected void pauseApp() class MyCanvas extends Canvas /画图函数,必须重写,画布出现后自动调用 public void paint(Graphics g) System.out.println(“paint“); 运行这个 MIDlet,便得到图 12-1 的效果。在代码中,我们给画布设置了一个标题, 但是标题没有出现,这说明全屏幕显示起到了作用。另外,控制台上打印: 说明 paint 函数自动调用了。如果在里面写了画图代码,则可以对画布进行渲染。 第三步:知识扩展。打开 Canvas 文档,在里面可以找到如下两个重要函数: 1: 该函数是保护型,可以被重写。这个函数在画布放在界面最前端显示时自动调用。 2: 该函数是保护型,可以被重写。这个函数在画布隐藏时自动调用。 以下代码测试 showNotify 和 hideNotify 的使用方法。将 MIDlet1 修改为: MIDlet1.java package prj12_1; import javax.microedition.lcdui.Canvas; import javax.microedition.lcdui.Command; import javax.microedition.lcdui.Display; import javax.microedition.lcdui.Form; import javax.microedition.lcdui.Graphics; import javax.microedition.midlet.MIDlet; import javax.microedition.midlet.MIDletStateChangeException; ? 4 ?第 12 章 Canvas 绘图 public class MIDlet1 extends MIDlet private MyCanvas mc = new MyCanvas(); private Display dis; protected void startApp() throws MIDletStateChangeException dis = Display.getDisplay(this); mc.setTitle(“MyCanvas“); mc.setFullScreenMode(true); dis.setCurrent(mc); mc.addCommand(new Command(“命令“,Command.SCREEN,1); /用一个Form盖住画布 dis.setCurrent(new Form(“新的界面“); protected void destroyApp(boolean arg0) throws MIDletStateChangeException protected void pauseApp() class MyCanvas extends Canvas /画图函数,必须重写,画布出现后自动调用 public void paint(Graphics g) System.out.println(“paint“); /重写,画布放在界面最前端显示时自动调用 public void showNotify() System.out.println(“showNotify“); /重写,画布隐藏时自动调用 public void hideNotify() System.out.println(“hideNotify“); 运行这个 MIDlet,除得到图 12-1 的效果外,控制台上打印: 这说明当画布显示时,showNotify 函数自动调用了。当然如果将另一个界面显示出来 遮住画布,hideNotify 函数将会自动调用。 也 可 以 通 过 以 下 几 个 函 数 来 获 取 画 布 的 额 外 功 能 , 这 些 函 数 都 是 从 javax.microedition.lcdui.Displayable 继承过来的: 1:得到画布的宽度: ? 5 ? J2ME 移动开发实战教程 2:得到画布的高度: 3:设置画布的标题: 4:为画布设置滚动条: 【12-2】用 Canvas 开发简单画图系统 实例需求 打开 javax.microedition.lcdui.Canvas 文档,会发现里面有一个很重要的函数: 上一章讲过,该函数需要被重写,在画布出现时会自动调用,也可以被 repaint 方法触 发。该函数传入一个 Graphics 对象,能够画各种图形。本例就开发一个含有各种图形的画 布,如图 12-2 所示: 图 12-2 界面效果 界面上出现一个画布,在这个画布上一共有 4 个图形,分别是一条线、一个矩形、一 个圆角矩形和一个左半圆。 开发过程 第一步:了解Graphics类。 paint 函数的格式为: 其参数是一个 Graphics 对象。打开 Graphics 类文档,会发现 Graphics 类定义如下: ? 6 ?第 12 章 Canvas 绘图 它直接继承 java.lang.Object 类,我们一般不用构造函数来实例化其对象,值得一提的 是,你可以通过 paint 函数的参数,直接得到画布上的画笔对象,不需要实例化。如下代 码: class MyCanvas extend
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号