`

画布开发

    博客分类:
  • J2ME
阅读更多
CanvasCanvas绘图
画布属于低级界面
  Canvas的结构以及paint函数;showNotify,hideNotify函数
  设置画布全屏:setFullScreenMode(booleanmode)
  得到高度,宽度:getHeight,getWidth

在画布上绘制
  设置绘图颜色:Graphics.setColor:格式0xRRGGBB或者传入数字
  设置划线样式:Graphics.setStrokeStyle
  SOLID:实线;DOTTED:虚线
  画直线:Graphics.drawLine
  画矩形/实心矩形:Graphics.drawRect/fillRect
  画圆角矩形/圆角实心矩形:Graphics.drawRoundRect/fillRoundRect
  画弧线/填充弧线:Graphics.drawArc/fillArc
  填充三角形:Graphics.fillTriangle
  强制重画:Graphics.repaint

在画布上绘制:字符串和图片
  修改字体:Graphics.setFont()
  画字符串:Graphics.drawString()
  确定定位点: LEFT,HCENTER,RIGHT | BOTTOM,TOP,BASELINE
  通过font来得知字符串所占的宽度
  例如:将字画在屏幕正中心
画图片:
  Graphics.drawImage
  Graphics.drawRegion

按键和指针事件
按键事件
相应函数
  protected voidkeyPressed(int keyCode) :按下某个键
  protected voidkeyReleased(int keyCode) :释放某个键
  protected voidkeyRepeated(int keyCode):一直按某个键
  键的代码由常量决定
  特殊键被认为是游戏键,需要转为游戏键才能进行判断
  getGameAction(keyCode)
  getKeyCode(action)
  映射关系: 上下左右和手机上的上下左右键一致,GAME_A,B,C,D分别对应1,3,7,9键
package prj;

import javax.microedition.lcdui.Canvas;
import javax.microedition.lcdui.Display;
import javax.microedition.lcdui.Graphics;
import javax.microedition.lcdui.Image;
import javax.microedition.lcdui.game.Sprite;
import javax.microedition.midlet.MIDlet;
import javax.microedition.midlet.MIDletStateChangeException;

public class MIDlet2 extends MIDlet {
	private MyCanvas mc = new MyCanvas();
	private Display dis;
	protected void startApp() throws MIDletStateChangeException {
		dis = Display.getDisplay(this);
		mc.setTitle("按键画布");
		dis.setCurrent(mc);
	}

	protected void destroyApp(boolean arg0) throws MIDletStateChangeException {
		// TODO Auto-generated method stub

	}

	protected void pauseApp() {
		// TODO Auto-generated method stub

	}

	class MyCanvas extends Canvas{
		private Image img;
		private int x;
		private int y;
		private int TRANS = Sprite.TRANS_NONE;
		public MyCanvas(){
			try{
				img = Image.createImage("/img.png");
				x = 0;
				y = 0;
			}catch(Exception ex){}
		}
		public void paint(Graphics g){
			//画布清空
			g.setColor(0,0,255);
			g.fillRect(0,0,this.getWidth(),this.getHeight());
			g.drawRegion(img,0,0,img.getWidth(),img.getHeight(),TRANS,x,y,Graphics.LEFT|Graphics.TOP);
		}
		protected  void keyRepeated(int keyCode) {
			int action = this.getGameAction(keyCode);
			switch(action){
			case Canvas.UP:			y -= 5; 	break;
			case Canvas.DOWN:		y += 5; 	break;
			case Canvas.LEFT:		x -= 5; 	break;
			case Canvas.RIGHT:		x += 5; 	break;			
			}
			repaint();//调用paint函数重画
		}
		protected  void keyPressed(int keyCode) {
			int action = this.getGameAction(keyCode);
			if (action==Canvas.FIRE){
				switch(TRANS){
				case Sprite.TRANS_NONE:	TRANS = Sprite.TRANS_ROT90;	break;
				case Sprite.TRANS_ROT90:	TRANS = Sprite.TRANS_ROT180;	break;
				case Sprite.TRANS_ROT180:	TRANS = Sprite.TRANS_ROT270;	break;
				case Sprite.TRANS_ROT270:	TRANS = Sprite.TRANS_NONE;	break;
				}
			}
			repaint();//调用paint函数重画

		}
	}
	

}

指针事件
利用hasPointerEvents和hasPointerMotionEvents判断是否支持指针
  相应函数
  protected voidpointerDragged(intx,inty)
  protected voidpointerPressed(intx,inty)
  protected voidpointerReleased(intx,inty)
案例
动画模拟
  界面上有个小红球,要求能够慢慢掉下来然后弹起来
  额外要求:增加暂停和继续的功能
package prj;

import javax.microedition.lcdui.Canvas;
import javax.microedition.lcdui.Command;
import javax.microedition.lcdui.CommandListener;
import javax.microedition.lcdui.Display;
import javax.microedition.lcdui.Displayable;
import javax.microedition.lcdui.Graphics;
import javax.microedition.midlet.MIDlet;
import javax.microedition.midlet.MIDletStateChangeException;

public class MIDlet1 extends MIDlet {
	private BallCanvas bc = new BallCanvas();
	private Display dis;
	protected void startApp() throws MIDletStateChangeException {
		dis = Display.getDisplay(this);
		dis.setCurrent(bc);
	}
	protected void destroyApp(boolean arg0) throws MIDletStateChangeException {
		// TODO Auto-generated method stub

	}
	protected void pauseApp() {
		// TODO Auto-generated method stub

	}

	class BallCanvas extends Canvas implements Runnable,CommandListener{
		private int left = 50;
		private int top = 50;
		private int d = 100;
		private int DIR = 1;	//1:向下,2:向上
		
		private Command cmdPause = new Command("暂停",Command.SCREEN,1);
		private Command cmdResume = new Command("继续",Command.SCREEN,1);
		
		private Thread th;
		private boolean RUN = true;
		
		public BallCanvas(){
			this.addCommand(cmdPause);
			this.setCommandListener(this);
			th = new Thread(this);
			th.start();
		}
		public void commandAction(Command c,Displayable d){
			if(c==cmdPause){//按下暂停按钮
				this.removeCommand(cmdPause);
				this.addCommand(cmdResume);
				RUN = false;
				th = null;
			}
			else if(c==cmdResume){//按下继续按钮
				this.removeCommand(cmdResume);
				this.addCommand(cmdPause);
				RUN = true;
				th = new Thread(this);
				th.start();
			}
		}
		public void paint(Graphics g){
			g.setColor(0,255,0);//绿色
			g.fillRect(0,0,this.getWidth(),this.getHeight());
			g.setColor(255,0,0);
			g.fillArc(left,top,d,d,0,360);
		}
		public void run(){
			while(RUN){
				if(DIR==1){
					top+=3;
					d--;
					if(top>=this.getHeight()-d){
						DIR = 2;
					}
				}
				if(DIR==2){
					top-=3;
					d++;
					if(top<=50){
						DIR = 1;
					}
				}
				
				repaint();//重画
				try{
					Thread.currentThread().sleep(10);
				}catch(Exception ex){}				
			}
		}
	}

}

界面上每秒钟在随机位置出现随机颜色的数字0-9,要求用户快速反应,按下按键,如果按对,加1分,错误减2分,不按减1分,初始5分,减到0分,提示用户输了。
package prj;

import java.util.Random;

import javax.microedition.lcdui.Canvas;
import javax.microedition.lcdui.Display;
import javax.microedition.lcdui.Font;
import javax.microedition.lcdui.Graphics;
import javax.microedition.midlet.MIDlet;
import javax.microedition.midlet.MIDletStateChangeException;

public class MIDlet2 extends MIDlet {
	private NumberCanvas nc = new NumberCanvas();
	private Display dis;
	protected void startApp() throws MIDletStateChangeException {
		dis = Display.getDisplay(this);
		dis.setCurrent(nc);
	}
	protected void destroyApp(boolean arg0) throws MIDletStateChangeException {
		// TODO Auto-generated method stub

	}
	protected void pauseApp() {
		// TODO Auto-generated method stub

	}

	class NumberCanvas extends Canvas implements Runnable{		
		private char rndChar;
		private Random rnd = new Random();
		public NumberCanvas(){
			new Thread(this).start();
		}

		public void paint(Graphics g){
			Font font = Font.getFont(Font.FACE_SYSTEM,Font.STYLE_BOLD,Font.SIZE_LARGE);
			g.setFont(font);
			g.setColor(rnd.nextInt(256),rnd.nextInt(256),rnd.nextInt(256));
			int x = rnd.nextInt(this.getWidth());
			int y = rnd.nextInt(this.getHeight());
			g.drawChar(rndChar, x, y, Graphics.TOP|Graphics.LEFT);
			System.out.println(rndChar);
		}
		public void run(){
			while(true){
				int number = '0' + rnd.nextInt(10);
				//0-9之间的数字,转成字符不是0-9
				rndChar = (char)number;
				repaint();
				try{
					Thread.sleep(100);
				}catch(Exception ex){}
			}
			}
		public void keyPressed(int keyCode){
			//将keyCode和rndChar表示的数字比较,评分
		}
		}
	}
分享到:
评论

相关推荐

    13. 画布开发2按键和指针事件2.rar

    画布开发2按键和指针事件2.rar"这个压缩包文件很可能是针对J2ME开发者的一个教学资源,详细介绍了如何在Canvas上处理按键和指针事件,以便创建更丰富的交互式应用。 1. **画布(Canvas)类** - 画布是J2ME中的`...

    12. 画布开发1Canvas绘图2.rar

    画布开发1Canvas绘图2”深入探讨了如何利用Canvas进行图形绘制,使开发者能够充分利用J2ME的潜力。 首先,Canvas是J2ME MIDP(Mobile Information Device Profile)框架中的一个类,它允许程序员直接控制设备屏幕...

    12. 画布开发1Canvas绘图1.rar

    画布开发1Canvas绘图1”深入介绍了如何利用Canvas进行J2ME应用的图形绘制。 Canvas 是一个继承自 javax.microedition.lcdui.Displayable 的类,提供了在移动设备上绘制自定义图形的能力。开发者可以覆盖其 `paint...

    HTML5 Canvas 画布开发 傻瓜书 (英文版)

    这本书——"HTML5 Canvas 画布开发 傻瓜书 (英文版)",显然是针对初学者的一本教程,旨在帮助读者轻松理解和掌握Canvas的基本用法和高级特性。 Canvas是一个基于矢量图形的API,它使用JavaScript来绘制图形,包括...

    手机游戏开发重要技术资料分享12.画布开发1Canvas绘图.zip

    手机游戏开发重要技术资料分享12.画布开发1Canvas绘图.zip

    手机游戏开发重要技术资料分享13.画布开发2按键和指针事件.zip

    手机游戏开发重要技术资料分享13.画布开发2按键和指针事件.zip

    13. 画布开发2按键和指针事件1.rar

    在J2ME(Java 2 Micro Edition)平台上,画布(Canvas)是开发图形用户界面(GUI)的重要组件。画布允许开发者自定义图形绘制和处理用户输入,为移动设备提供丰富的交互体验。本教程主要关注画布上的按键和指针事件...

    自制小画布工具(HTML5+JS)

    在这个小画布工具中,Canvas被用来接收用户的鼠标输入,将这些输入转化为绘画动作。 JavaScript作为客户端脚本语言,负责处理用户交互、更新Canvas上的绘图以及实现各种功能。例如,当用户选择不同颜色或改变画笔...

    J2ME移动开发实战教学系列视频教程

    教程名称:J2ME移动开发实战教学系列视频教程课程目录:【】1....画布开发1Canvas绘图(J2ME移动开发实战教学系列视频)【】13.画布开发 资源太大,传百度网盘了,链接在附件中,有需要的同学自取。

    J2ME移动开发实战教学视频(9.多线程.rar)

    12. 画布开发1Canvas绘图 13. 画布开发2按键和指针事件 14. 案例2 15. RMS编程1基础知识 16. RMS编程2高级知识 17. 案例3 18. 网络编程1Socket编程 19. 案例4聊天室开发 20. 网络编程2UDP编程 21. 网络编程3HTTP编程...

    3. 高级界面开发2Command事件和List

    12. 画布开发1Canvas绘图 13. 画布开发2按键和指针事件 14. 案例2 15. RMS编程1基础知识 16. RMS编程2高级知识 17. 案例3 18. 网络编程1Socket编程 19. 案例4聊天室开发 20. 网络编程2UDP编程 21. 网络编程3HTTP编程...

    3.高级界面开发2Command事件和List1\03-2.swf

    12. 画布开发1Canvas绘图 13. 画布开发2按键和指针事件 14. 案例2 15. RMS编程1基础知识 16. RMS编程2高级知识 17. 案例3 18. 网络编程1Socket编程 19. 案例4聊天室开发 20. 网络编程2UDP编程 21. 网络编程3HTTP编程...

    3.高级界面开发2Command事件和List1\03-3.swf

    12. 画布开发1Canvas绘图 13. 画布开发2按键和指针事件 14. 案例2 15. RMS编程1基础知识 16. RMS编程2高级知识 17. 案例3 18. 网络编程1Socket编程 19. 案例4聊天室开发 20. 网络编程2UDP编程 21. 网络编程3HTTP编程...

    郭克华 J2ME视频配套课件 及源码 ppt

    13画布开发2:按键和指针事件 14案例2 游戏开发 22GameAPI1:游戏画布,图层和游戏精灵 23GameAPI2:Sprite碰撞检测和动画 24:GameAPI3:TiledLayer和图层管理 网络应用开发 18网络编程1:Socket编程 19案例4:聊天室开发 ...

    1. 体系介绍和环境配置

    12. 画布开发1Canvas绘图 13. 画布开发2按键和指针事件 14. 案例2 15. RMS编程1基础知识 16. RMS编程2高级知识 17. 案例3 18. 网络编程1Socket编程 19. 案例4聊天室开发 20. 网络编程2UDP编程 21. 网络编程3HTTP编程...

    Android 自定义画布canvas 实现绘制和清空画布功能

    在Android开发中,自定义画布Canvas是实现图形绘制的核心工具。Canvas提供了丰富的API,允许开发者在屏幕上绘制各种形状、图像以及文字等。本教程将深入探讨如何利用Canvas实现绘制和清空画布的功能。 首先,我们...

    创业精益画布word模板

    #### 一、精益画布简介 **精益画布**是一种用于初创企业或新产品项目的战略管理工具,它可以帮助创业者快速而全面地理解其业务模型的关键组成部分。这种工具通常采用一张简单的画布形式,包含了九个核心模块,通过...

    PaintApp画布应用程序

    【描述】:PaintApp是一个基于NetBeans 8.0平台开发的简单画布应用程序。它展示了如何利用模块化开发技术来构建一个功能丰富的图形用户界面,允许用户在画布上进行绘画操作。NetBeans 8.0作为一个强大的集成开发环境...

Global site tag (gtag.js) - Google Analytics