gpt4 book ai didi

events - 黑莓中的触摸事件处理

转载 作者:行者123 更新时间:2023-12-01 09:06:59 25 4
gpt4 key购买 nike

我尝试在 Blackberry 9550 模拟器上实现简单的触摸事件处理,但它不起作用。实际上,touchEvent 永远不会被调用,因为控制台中不会出现任何文本。此外,我在触摸屏幕时出现烦人的“完整菜单”。代码如下:

package mypackage;
import net.rim.device.api.system.Bitmap;
import net.rim.device.api.system.EventInjector.TouchEvent;
import net.rim.device.api.ui.Field;
import net.rim.device.api.ui.Graphics;
import net.rim.device.api.ui.VirtualKeyboard;
import net.rim.device.api.ui.container.MainScreen;

public class MyScreen extends MainScreen
{
public MyScreen()
{
super(NO_SYSTEM_MENU_ITEMS);
getScreen().getVirtualKeyboard().setVisibility(VirtualKeyboard.HIDE_FORCE);
add(new HandleTouch());

}

class HandleTouch extends Field {

protected void layout(int width, int height) {
setExtent(width, height);
}

public void paint(Graphics graphics) {
graphics.drawBitmap(0, 0, this.getWidth(), this.getHeight(), Bitmap.getBitmapResource("bg.png"), 0, 0);
}

public boolean isFocusable() { return true;}

protected boolean touchEvent(TouchEvent message) {
switch( message.getEvent() ) {
case TouchEvent.CLICK:
System.out.println("----------------------------->CLICK");
return true;
case TouchEvent.DOWN:
System.out.println("----------------------------->DOWN");
return true;
case TouchEvent.MOVE:
System.out.println("----------------------------->MOVE");
return true;
}
System.out.println("PRINT ME SOMETHING IN ANY CASE");
return false;
}

public HandleTouch() {

}
}

}

最佳答案

1)。首先,用这段代码

protected void layout(int width, int height) {
setExtent(width, height);
}

您实际上是在设置一个非常大的字段。这是因为 BB UI 框架将最大可用/可能的维度传递给 layout(int width, int height),因此该字段应使用传递值中的某些部分。在这种特定情况下,宽度将是显示器的宽度(360 像素),高度是 VerticalFieldManager 的最大可能高度(您要添加屏幕字段的那个,它隐含在屏幕的内部结构)(1073741823 px)。所以,最后这可能会导致一个非常大的 Bitmap 对象,该对象需要该字段才能被绘制,并且您可能会得到一个 Uncaught Error “位图太大”(我在 Storm 9530 上做过) .

所以,layout() 应该使用一些相对较小的值,例如:

protected void layout(int width, int height) {
setExtent(Math.min(width, 360), Math.min(height, 480));
}

2).

Actually, touchEvent never gets called

嗯,实际上它确实被调用了。要看到你应该简单地触摸(而不是点击)。鼠标左键模拟点击(一系列 TouchEvent.DOWN > TouchEvent.CLICK > TouchEvent.UNCLICK > TouchEvent.UP ),右键模拟触摸(一系列TouchEvent.DOWN > TouchEvent.UP)。

3).

Also, I get an annoying "Full Menu" which appears on touching the screen.

这是因为您的字段不消耗 TouchEvent.UNCLICK 事件。例如,使用此代码,您的字段将不会显示弹出窗口:

protected boolean touchEvent(TouchEvent message) {
return true;
}

但是,这对于弹出窗口来说是一个糟糕的解决方案。最好了解真正导致弹出窗口的原因。如果 TouchEvent.UNCLICK 事件未被消耗,则 BB UI 框架调用 getContextMenu(int instance)makeContextMenu(ContextMenu contextMenu, int instance) 方法场。因此,为了禁用弹出窗口(实际上是 getContextMenu(int instance) 创建的 ContextMenu 您应该覆盖 getContextMenu(int instance) 像这样:

public ContextMenu getContextMenu(int instance) {
// just in case check if a context menu is requested
// in order not to disable other types of menu
boolean isContextMenu = (Menu.INSTANCE_CONTEXT == instance);
return isContextMenu ? null : super.getContextMenu(instance);
}

4)。最后,我建议不要更改 touchEvent(TouchEvent message) 方法的 native /默认行为。您可以只观看/记录它,但不要更改(始终称其为 super 版本)。这是因为触摸事件处理比最初看起来要复杂得多。在这里很容易得到一个棘手的错误。我相信大多数程序员不应该改变 touchEvent(TouchEvent message) 的原生行为,除非他们真的想创建一些自定义 UI 组件来处理触摸手势。通常他们只想对点击使用react(表现为 ButtonField),但是为此您可以简单地覆盖 navigationClick(int status, int time) navigationUnclick(int status, int time).当用户在触摸屏上单击您的字段时,BB UI 框架将调用这些方法。

关于events - 黑莓中的触摸事件处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6083469/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com