`
wayfarer
  • 浏览: 298394 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

自定义repeat()方法

阅读更多

j2me的Canvas中有一个repeat()回调方法。大部分手机支持这个方法,但也有一些手机不支持。在支持的手机中,也存在或多或少的问题,比如 S40 手机中,repeat()间隔时间过长,导致程序反应太慢。在一个地图浏览的程序中,如果我想连续移动地图, repeat() 几乎是每隔 1 秒执行一次,地图跳跃感太强了。

所以我就想利用keyPressed()和keyReleased()自定义一个repeat()方法,代码如下,这个应用可以自己控制repeat的时间间隔长短,非常好用。

public class RepeatCanvas extends Canvas {
	private boolean isRightPressed, isLeftPressed, isDownPressed, isUpPressed;
	private Object lock = new Object();
	private Thread keyOpt;
	protected void paint(Graphics g) {
	}
	protected void keyPressed(int keyCode) {
		int action = getGameAction(keyCode);
        switch (action) {
        case Canvas.RIGHT:
        	isRightPressed = true;
        	break;
        case Canvas.LEFT:
        	isLeftPressed = true;
        	break;
        case Canvas.DOWN:
        	isDownPressed = true;
        	break;
        case Canvas.UP:
        	isUpPressed = true;
        	break;
        }
        opt();
	}
	protected void keyReleased(int keyCode) {
		int action = getGameAction(keyCode);
        switch (action) {
        case Canvas.RIGHT:
        	isRightPressed = false;
        	break;
        case Canvas.LEFT:
        	isLeftPressed = false;
        	break;
        case Canvas.DOWN:
        	isDownPressed = false;
        	break;
        case Canvas.UP:
        	isUpPressed = false;
        	break;
        }
	}
	private void opt() {
		if (keyOpt != null) {
	    	synchronized (lock) {
	    		lock.notify();
	        }
	    } else {
	    	keyOpt = new Thread(new KeyOpt());
	    	keyOpt.start();
	    }
	}
	private class KeyOpt implements Runnable {
		public void run() {
			while (true) {
				if (isRightPressed) {
		            while (true) {
		                try {
		                    Thread.sleep(100);
		                } catch (InterruptedException ex) {
		                    break;
		                }
		                System.out.println("move(-1, 'x') -- 地图右移");
		                if (!isRightPressed) {
		                    break;
		                }
		            }
		        } else if (isLeftPressed) {
		            while (true) {
		                try {
		                    Thread.sleep(100);
		                } catch (InterruptedException ex) {
		                    break;
		                }
		                System.out.println("move(1, 'x') -- 地图左移");
		                if (!isLeftPressed) {
		                    break;
		                }
		            }
		        } else if (isDownPressed) {
		            while (true) {
		                try {
		                    Thread.sleep(100);
		                } catch (InterruptedException ex) {
		                    break;
		                }
		                System.out.println("move(-1, 'y') -- 地图下移");
		                if (!isDownPressed) {
		                    break;
		                }
		            }
		        } else if (isUpPressed) {
		            while (true) {
		                try {
		                    Thread.sleep(100);
		                } catch (InterruptedException ex) {
		                    break;
		                }
		                System.out.println("move(1, 'y') -- 地图上移");
		                if (!isUpPressed) {
		                    break;
		                }
		            }
		        }
				synchronized (lock) {
					try {
						lock.wait();
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
				}
			}
		}
	}
}

 

这个是最简单的一个实现,可以在这个基础上扩展出很多应用,比如两个键同时longPressed。根据需要,自己定制。

ps:以上实现的思路来自于众多j2me前辈,感谢他们的无私奉献。

分享到:
评论
1 楼 peerlessme 2009-10-04  
不能小看J2ME,学习了。

相关推荐

    AngularJS使用自定义指令替代ng-repeat的方法

    为了避免这种情况,我们可以使用自定义指令来替代`ng-repeat`。自定义指令允许我们更精细地控制DOM操作和渲染过程,从而提高性能。以下是使用自定义指令实现类似`ng-repeat`功能的步骤: 1. **创建容器**:首先,...

    AngularJs中 ng-repeat指令中实现含有自定义指令的动态html的方法

    今天用angular写table的时候,遇到了一个问题。在ng-repeat中,含有动态的html,而这些html中含有自定义指令,怎么...下面小编给大家分享AngularJs中 ng-repeat指令中实现含有自定义指令的动态html的方法,一起看看吧

    alert和confirm和ng-repeat

    `$uibModal`服务可以创建一个独立于当前视图的新窗口,这个窗口可以包含自定义的HTML内容,比如我们的`alert`或`confirm`对话框。 下面是如何使用`ng-repeat`实现双层嵌套的例子: 1. 首先,确保在项目中安装了...

    自定义信息框模块.rar

    这样的模块化设计遵循DRY(Don't Repeat Yourself)原则,提高了代码复用性和可维护性。 10. **测试与调试** 创建自定义信息框后,需进行详尽的测试,确保在各种场景下都能正确显示和操作。这可能涉及到单元测试、...

    js代码-动手实现一个repeat方法

    通过以上代码,我们就实现了自定义的`repeat`方法,它可以处理大多数常见情况。然而,需要注意的是,这种方法仍然无法完全复制原生`repeat`的行为,例如处理Unicode字符的能力。在实际开发中,如果对性能和兼容性有...

    Angular.js中用ng-repeat-start实现自定义显示

    然而,当需要对数据进行更复杂的布局或自定义显示时,简单的`ng-repeat`可能无法满足需求。这时,我们可以利用`ng-repeat-start`和`ng-repeat-end`这对指令来实现更加灵活的迭代控制。 `ng-repeat-start`和`ng-...

    Ajax TabContainer 自定义CSS样式 .txt

    ### Ajax TabContainer 自定义CSS样式知识点解析 在Web开发领域,特别是使用ASP.NET AJAX进行页面构建时,TabContainer 是一个非常实用的控件,用于创建动态的、交互式的标签页界面。通过自定义CSS样式,我们可以使...

    在自定义指令中使用动画.rar

    AngularJS还支持其他动画事件,如`ng-repeat-start`、`ng-hide-add`、`ng-show-remove`等,可以根据需要选择合适的事件来实现不同的动画效果。此外,可以使用JavaScript动画或者CSS3动画,通过设置`ngAnimate`的配置...

    自定义BaseActivity

    这种做法有助于提升代码的复用性和可维护性,符合“Don't Repeat Yourself”(DRY)的原则。`BaseActivity`通常包含一些基本的初始化操作、UI布局加载、事件处理以及通用的业务逻辑。 创建`BaseActivity`的主要步骤...

    自定义控件

    此外,自定义控件的设计应遵循DRY(Don't Repeat Yourself)原则,确保代码可复用和易于维护。 通过以上步骤,你将能够创建出具有独特功能和外观的自定义控件。这个项目中的"自定义控件"可能包含了这些实现过程,...

    AngularJs ng-repeat必须注意的性能问题

    1. 减少过滤器数量:尽量合并多个过滤器为一个自定义过滤器,减少计算次数。 2. 缓存过滤结果:对于不经常变化的过滤,可以将结果存储在缓存中,避免重复计算。 四、数据预处理 在数据到达视图之前对其进行预处理...

    Repeat:Repeat包含许多帮助程序功能,可解决Java 8中的常见任务

    在Java 8之前,很多功能需要通过自定义方法或者第三方库来实现,而Repeat则为这些常见需求提供了直接的支持。 Repeat库的设计围绕Java 8引入的新特性,特别是Stream API和Lambda表达式。这些新特性使得处理集合、...

    html+css背景自定义

    background-repeat: no-repeat; /* 防止图像平铺 */ background-position: center; /* 将图像居中 */ background-size: cover; /* 使图像完全覆盖背景区域,保持宽高比 */ } ``` 如果需要对特定元素设置背景,...

    AngularJS使用Filter自定义过滤器控制ng-repeat去除重复功能示例

    标题中提到的“AngularJS使用Filter自定义过滤器控制ng-repeat去除重复功能示例”说明了如何通过自定义一个filter来达到去除重复的目的。这需要我们在AngularJS模块中定义一个新的filter,并在ng-repeat指令中应用这...

    Android自定义控件实现望远镜效果

    本文将详细介绍Android自定义控件实现望远镜效果的方法,并提供了详细的示例代码。望远镜效果的实现主要依赖于Shader和BitmapShader这两个类。 Shader是Android中的一个类,用于给图形元素着色。它可以将颜色、渐变...

    自定义jenkins主题

    但是,这个方法在 IE6 中是不支持的。 此外,我们还可以使用以下代码来添加边框到任务队列和任务状态: /* add a border for buildQueue, executors */ table#buildQueue.pane, table#executors.pane { border: 1...

    自定义UITabBarController

    10. **代码组织**:为了保持代码的可维护性,可以将自定义逻辑封装在独立的类别或子类中,遵循DRY(Don't Repeat Yourself)原则。 总之,自定义`UITabBarController`不仅需要熟悉`UIKit`的基本操作,还需要掌握UI...

Global site tag (gtag.js) - Google Analytics