Events Blackberry中的触摸事件处理
我尝试在Blackberry 9550 emulator上实现简单的触摸事件处理,但不起作用。实际上,touchEvent从未被调用,因为控制台中从未出现任何文本。此外,我还得到了一个恼人的“完整菜单”,它出现在触摸屏上。 代码如下: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
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一起工作