Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/blackberry/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Events Blackberry中的触摸事件处理_Events_Blackberry_Event Handling_Touch - Fatal编程技术网

Events Blackberry中的触摸事件处理

Events Blackberry中的触摸事件处理,events,blackberry,event-handling,touch,Events,Blackberry,Event Handling,Touch,我尝试在Blackberry 9550 emulator上实现简单的触摸事件处理,但不起作用。实际上,touchEvent从未被调用,因为控制台中从未出现任何文本。此外,我还得到了一个恼人的“完整菜单”,它出现在触摸屏上。 代码如下: package mypackage; import net.rim.device.api.system.Bitmap; import net.rim.device.api.system.EventInjector.TouchEvent; import net.ri

我尝试在Blackberry 9550 emulator上实现简单的触摸事件处理,但不起作用。实际上,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框架将最大可用/可能尺寸传递给
布局(int-width,int-height)
,因此字段应该使用传递值中的某些部分。在这种特定情况下,宽度将是显示器的宽度(360 px),高度是
VerticalFieldManager
的最大可能高度(添加屏幕字段的那一个,隐式显示在屏幕内部)(1073741823 px)。因此,最后,这可能会导致一个非常大的
位图
对象,该对象需要与字段一起绘制,并且您可能会得到一个未捕获的错误“位图太大”(我在Storm 9530上做过)

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

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

实际上,touchEvent从未被调用过

嗯,事实上它确实会被叫来。要看到你只需触摸(而不是点击)。鼠标左键模拟点击(一系列
TouchEvent.DOWN
TouchEvent.CLICK
TouchEvent.UNCLICK
TouchEvent.UP
),右键模拟触摸(一系列
TouchEvent.DOWN
TouchEvent.UP

3)

此外,我还得到了一个恼人的“完整菜单”,它出现在触摸屏上

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

protected boolean touchEvent(TouchEvent message) {
    return true;
}
但是,对于弹出窗口来说,这是一个糟糕的解决方案。最好了解弹出窗口的真正原因。如果未使用
TouchEvent.UNCLICK
事件,则BB UI框架调用该字段的
getContextMenu(int实例)
makeContextMenu(ContextMenu,int实例)
方法。因此,为了禁用弹出窗口(实际上是由
getContextMenu(int实例)
创建的
ContextMenu
),您应该覆盖
getContextMenu(int实例)
,如下所示:

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消息)
方法的本机/默认行为。您可以只查看/记录它,但不要更改(始终称其为超级版本)。这是因为触摸事件处理比最初看起来更复杂。在这里很容易得到一个棘手的bug。我相信大多数程序员不应该改变
touchEvent(touchEvent message)
的本机行为,除非他们真的想创建一些自定义UI组件来处理触摸手势。通常,他们只想在单击时做出反应(表现为
按钮字段
),但为此,您可以简单地覆盖
导航单击(int status,int time)
导航取消单击(int status,int time)
。当用户单击触摸屏上的字段时,BB UI框架将调用这些方法。

我想在Arhimed的答案中添加额外的信息,因为这似乎是谷歌触摸事件的登录页

我的经验不是要反驳他,而是要为未来的读者添加可能的解决方案。我使用的是BBOS5.0。我的经验是使用风暴模拟器和火炬装置。我的应用程序最初是为OS4.5编写的,所以它可能在某种兼容模式下运行

1) 正如他在第4点中所解释的,如果
touchEvent(touchEvent)
返回false,则触摸事件将传递给导航单击事件。如果
navigationClick(int,int)
返回false,则提示系统显示
ContextMenu

2) 在我的系统上,我找不到方法
getContextMenu(int)
。所以我无法测试他的第三点。我想这是在BB6或更高版本中添加的

3) 我确实找到了
getContextMenu()
——也就是说,它不需要任何参数。我试图重写该方法以返回null

奇怪的是,这个方法只有在显示初始上下文菜单弹出窗口后才会被调用!显示初始上下文菜单弹出窗口(?),上面有一个“完整菜单”按钮。当按下该按钮时,将调用此方法,并可用于填充出现的
主菜单
。。。奇怪

然而,这意味着重写该方法并不能解决我的问题

4) 我无法通过在
touchEvent(touchEvent)
中返回true来获得解决方案。我同意这将是一个糟糕的形式(黑客),但我已经学会了在BB平台上黑客很多。但是,滚动列表字段需要传递触摸事件,以便滚动正常工作

5) 最后,我发现了与OP的问题类似的
TouchEvent.UNCLICK
。我花了18个月的时间才找到方法
navigationUnClick(int,int)
。与我上面的第1点类似,未经处理的
UNCLICK
会变成
navigationUnClick(int,int)
调用,这也会导致显示上下文菜单

因此,通过向
navigationClick(int,int)
navigationUnClick(int,int)
添加类似的逻辑,我能够让我的列表和触摸进行良好的交互



这只是补充信息,可能会添加到已接受的anser中。

我在哪里可以找到TouchEvent.CLICK的确切内容,以及何时适合捕获它们?我发现BB文档非常没有帮助。@Mike D:一个起点是API(一如既往)。检查“什么时候捕捉它们是合适的”——这取决于你做了什么。在大多数情况下,你不需要为这种低级别的处理而烦恼(见我上面的帖子)。我和B一起工作