将 GWT 单击事件转换为触摸事件

2023-12-30

我正在开发一个大项目,并且编写了很多 GWT 代码。现在我正在努力使该项目与 iPad 和 Android 平板电脑等平板电脑完全兼容。

作为其中的一部分,我注意到触摸设备需要300ms延迟处理点击事件。在这个项目中,再次编写触摸事件是一件非常繁琐的工作。我在这方面做了很多研究,发现 Google 语音应用程序中使用了 Google Fast Buttons API。我尝试过,效果很好,但需要大量编码和 JSNI。

我的问题是,据您所知,还有其他方法可以轻松克服这种延迟吗?


这是一个纯java实现的快捷按钮。它不包含一行JNSI

package com.apollo.tabletization.shared.util;

import java.util.Date;

import com.google.gwt.dom.client.Document;
import com.google.gwt.dom.client.NativeEvent;
import com.google.gwt.dom.client.Touch;
import com.google.gwt.event.dom.client.HasAllTouchHandlers;
import com.google.gwt.event.dom.client.HasClickHandlers;
import com.google.gwt.user.client.DOM;
import com.google.gwt.user.client.Event;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.ui.Composite;
import com.google.gwt.user.client.ui.Widget;

/** Implementation of Google FastButton {@link http://code.google.com/mobile/articles/fast_buttons.html} */
public class FastButton extends Composite {

  private boolean touchHandled = false;
  private boolean clickHandled = false;
  private boolean touchMoved = false;
  private int startY;
  private int startX;
  private int timeStart;

  public FastButton(Widget child) {
    // TODO - messages
    assert (child instanceof HasAllTouchHandlers) : "";
      assert (child instanceof HasClickHandlers) : "";
        initWidget(child);
        sinkEvents(Event.TOUCHEVENTS | Event.ONCLICK);
  }

  @Override
  public Widget getWidget() {
    return super.getWidget();
  }

  @Override
  public void onBrowserEvent(Event event) {
    timeStart = getUnixTimeStamp();
    switch (DOM.eventGetType(event)) {
      case Event.ONTOUCHSTART:
        {
          onTouchStart(event);
          break;
        }
      case Event.ONTOUCHEND:
        {
          onTouchEnd(event);
          break;
        }
      case Event.ONTOUCHMOVE:
        {
          onTouchMove(event);
          break;
        }
      case Event.ONCLICK:
        {
          onClick(event);
          return;
        }
    }

    super.onBrowserEvent(event);
  }

  private void onClick(Event event) {
    event.stopPropagation();

    int timeEnd = getUnixTimeStamp();
    if(touchHandled) {
      //Window.alert("click via touch: "+ this.toString() + "..." +timeStart+"---"+timeEnd);
      touchHandled = false;
      clickHandled = true;
      super.onBrowserEvent(event);
    }
    else {  
      if(clickHandled) {

        event.preventDefault();
      }
      else {
        clickHandled = false;
        //Window.alert("click nativo: "+ this.toString()+ "..." +(timeStart-timeEnd)+"==="+timeStart+"---"+timeEnd);
        super.onBrowserEvent(event);
      }
    }
  }

  private void onTouchEnd(Event event)  {
    if (!touchMoved) {
      touchHandled = true;
      fireClick();
    }
  }

  private void onTouchMove(Event event)  {
    if (!touchMoved) {
      Touch touch = event.getTouches().get(0);
      int deltaX = Math.abs(startX - touch.getClientX()); 
      int deltaY = Math.abs(startY - touch.getClientY());

      if (deltaX > 5 || deltaY > 5) {
        touchMoved = true;
      }
    }
  }

  private void onTouchStart(Event event) {
    Touch touch = event.getTouches().get(0);
    this.startX = touch.getClientX();
    this.startY = touch.getClientY();               
    touchMoved = false;
  }

  private void fireClick() {
    NativeEvent evt = Document.get().createClickEvent(1, 0, 0, 0, 0, false,
        false, false, false);
    getElement().dispatchEvent(evt);
  }

  private int getUnixTimeStamp() {
    Date date = new Date();
    int iTimeStamp = (int) (date.getTime() * .001);
    return iTimeStamp;
  }
}  
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将 GWT 单击事件转换为触摸事件 的相关文章

  • Meteor 中的触摸事件

    我开始使用 Meteor 做的第一件事是开始为手机 平板电脑编写基于触摸的 Web 应用程序 以下是重现问题的方法 第一步 创建一个空白项目 meteor create touch example cd touch example mete
  • iPhone SDK:拖动 UIImageView 时出现问题

    我正在尝试在我的应用程序中拖动 iPhone 屏幕上的 UIImageView 目前我设置的拖动功能很好 拖动图像确实会在屏幕上移动它 问题是你不必拖动图像视图来移动它 你也可以拖动屏幕上的任何地方 它会移动图像 我是这个平台的新手 所以我
  • 媒体查询:如何定位桌面、平板电脑和移动设备?

    我一直在对媒体查询进行一些研究 但我仍然不太明白如何定位特定大小的设备 我希望能够针对台式机 平板电脑和移动设备 我知道会存在一些差异 但如果有一个可用于针对这些设备的通用系统 那就太好了 我发现的一些例子 Mobile only scre
  • GWT - 如何组织项目以拥有多个网页以及它们之间的导航

    我是 GET 的新手 顺便说一句 它给我留下了深刻的印象 并且发现它对于像我这样熟悉 C NET 桌面技术并愿意编写 Web 应用程序的人来说非常有吸引力 我根据 GWT Eclipse 向导生成的示例启动了自己的项目 该项目生成带有面板的
  • GWT 主题/模板 [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在使用 GWT 开发一个应用程序 尽管 GWT 是基于 JAVA 的媒介 但外观和感觉只能通过 CS
  • 如何在桌面应用程序中调出 Windows 8 屏幕键盘

    我有一个全屏 DirectX 桌面应用程序 并且希望在用户点击游戏中的文本框时显示屏幕键盘 有没有办法在全屏模式下执行此操作 执行 osk exe 将弹出更老式的屏幕键盘 执行后会弹出Windows 8触摸键盘 C Program File
  • 检查 touchend 是否在拖动后出现

    我有一些代码可以更改表的类 在手机上 有时表格对于屏幕来说太宽 用户将拖动 滚动来查看内容 但是 当他们触摸并拖动表格时 每次拖动都会触发 touchend 如何测试触摸端是否是触摸拖动的结果 我尝试跟踪dragstart和dragend
  • 将对象传递给 uibinder 中定义的小部件的构造函数

    我试图将我的应用程序的 EventBus 通过其构造函数传递给 UiBinder 中声明的小部件 我使用 UiConstructor 注释来标记接受 EventBus 的构造函数 但我不知道如何从 ui xml 代码中实际引用该对象 也就是
  • 如何将 GWT 与 Visual Studio 一起使用来创建 ASP.NET 网站?

    如何将 GWT 与 Visual Studio 一起使用来创建 ASP NET 网站 如果可能 GWT 可以与任何后端一起使用 只需做一些工作 它开箱即用 使用 servlet 容器 但您不需要保留此容器 容器中的关键项是加载GWT编译代码
  • gwt-dispatch - GWT 的命令模式替代方案

    有没有替代方案gwt 调度 http code google com p gwt dispatch 在GWT项目中使用 GWT 平台 http code google com p gwt platform has a 调度模块 http c
  • 禁用任何类型的浏览器窗口滚动?

    有没有办法禁用滚动 不仅仅是滚动条 还有浏览器窗口的全部功能 根据您对 Keit 的回答 您不想在打开灯箱时滚动处于活动状态 如果是这种情况 您可以使用以下 css 在打开灯箱的同时向正文添加一个类 这个解决方案的好处是它保留了滚动 空间
  • 消除 Android 网络应用程序的 onclick 延迟

    你好 我正在构建一个网络应用程序 为了消除 onclick 延迟 我发现了这个脚本http cubiq org remove onclick delay on webkit for iphone http cubiq org remove
  • 从 JSNI 调用 Java 方法

    我想调用Java方法test 来自 JSNI 变量successHandler 但是 我收到错误 ERROR Line 110 Missing qualifier on instance method com gw myProject cl
  • UiBinder 中的 gwt 按钮

    我需要创建一个按钮 所以它是一个带有图像的按钮 gwt with UiBinder 但我不确定如何进行 这是我的ui xml code
  • GWT 多个 html 页面和导航

    您好 首先我想提一下 我知道基于 ajax 的应用程序和同一页面的重用 这里的要求是 我想要两个单独的页面 一个用于登录 另一个用于主应用程序 现在 这并不是因为我只是想要它 而是因为我在两个页面中有非常不同的布局 我很乐意将其与 html
  • JsInterop“com 未定义”

    尝试使用 JsInterop 与每个 Javascript 的 LibGDX 项目进行通信 我正在关注 将 Java 类型导出到 JavaScript 示例here http www gwtproject org doc latest De
  • Windows 8 触摸切换

    使用数字笔时通常需要禁用触摸输入 以避免来自例如触摸等的 噪音 手放在屏幕上 存在一种编程解决方案来禁用 Windows 7 中的触摸但保留笔输入 该解决方案会更改 TouchGate 注册表值并广播系统消息 看来后一部分在 Windows
  • Windows 7 触摸屏 + Java Swing = 延迟鼠标事件

    我正在用 Java 开发一个 Swing 应用程序 该程序将在专用的 Windows 7 触摸屏机器上运行 据我所知 该程序应该是在正常操作下唯一在其上运行的程序 我注意到 Windows 7 的触摸屏界面有一个可以阻止 mousedown
  • GWT - onClick 未触发

    我在表单上有一个非常奇怪的行为 有许多具有内联验证的文本字段 如果内容无效 则会在字段下方显示错误消息 验证在模糊时触发 页面底部有一个 下一步 按钮 单击后 将执行验证 如果一切正常 则提交表单 现在 如果当我单击按钮时强制空白字段具有焦
  • jQuery 在页面上查找电话号码并包含在 链接中

    这是一个与这个从未得到解答的老问题类似的问题 使用 jquery 将 https stackoverflow com questions 4607753 wrap a tag around phone number using jquery

随机推荐

  • 带 proguard 的 Kotlin AAR 库:如何仅保留类和方法名称?

    我正在使用 Kotlin 构建一个 android 库 aar 文件 我需要以第三方用户将看到类和方法名称的方式混淆代码 他必须能够使用它们 它们是公开的 但我需要隐藏 混淆代码本身 我尝试将此文件用于 myLibrary proguard
  • C++ 中的模块是什么?

    该术语是什么意思module在下面的句子中引用 不允许异常跨模块边界传播 这是规则 62C 编码标准 http www gotw ca publications c cs htm作者 赫伯 萨特和安德烈 亚历山德雷斯库 我现在已经阅读了这本
  • 想要 javax.swing 钩子告诉我层次结构中的哪个组件正在执行操作

    如何通过最少的代码丑化在 Swing 程序中编写一个调试挂钩 告诉我层次结构中的哪个组件实际上正在处理每个 KeyStroke 或鼠标单击 并执行在组件的操作映射中映射到它的操作 我们正在编写一个复杂的 GUI 了解这些信息将非常有用 放入
  • 如何在谷歌地图中放置两个距离500m的标记

    我们如何将两个标记放置在 500 米的距离处 假设第一个标记的 latLng 是伦敦 51 0 第二个标记放置在距离该标记 500 米的地方 我已经尝试过任何事情 但无法找到并回答它 任何想法 纬度为 60 海里 但显然经度超出了这个范围
  • WPF DataGrid 组样式

    I have the following DataGrid in WPF with two groups First group is a bool flag which represents if a person is active i
  • 使用画布的橡皮擦效果

    我有一个扩展视图的自定义视图类 我正在使用重写的 onDraw 方法在画布上涂鸦 我有一个 POJO 列表 其中包括 Path 和 Paint 借助它们我可以重新创建绘制的旧路径 如下所示 Override protected void o
  • 视图更新后保留视图/数据模型的引用

    考虑我们有一个RootView and a DetailView DetailView有它自己的 BindableObject 我们称之为它DetailViewModel我们有这样的场景 RootView可能会被某种全局事件更新 例如错过了
  • 使用 AngularJS angular.extend 独立地向数组的每个对象添加属性

    我有一个现有数组 其中包含第一步创建的对象和多个属性 它是由以下函数创建的 scope recordlist extractRecordJSONFromLocalStorage scope addRecord function scope
  • 如何找到UIImage瓶颈

    我有一个应用程序使用UIImage对象 到目前为止 我一直在使用使用如下方式初始化的图像对象 UIImage image UIImage imageNamed imageName 使用我的应用程序包中的图像 我一直在添加功能 以允许用户使用
  • 链接映射减少过滤器时如何减少迭代?

    我一直在读关于map reduce and filter很多是因为它们在 React 和 FP 中的使用量一般 如果我们写这样的东西 let myArr 1 2 3 4 5 6 7 8 9 let sumOfDoubleOfOddNumbe
  • 如何清除表格?

    例如我有一个这样的表格
  • SQL Server:在数据库、实例之间迁移存储过程

    我刚刚将当前数据库复制到新数据库 发现只复制了表 如何一次性以相同的方式复制所有存储过程 我不想再次运行创建查询来一一创建每 个存储过程 先感谢您 这是 MS SQL 中的 使用管理工作室 右键单击您的数据库名称 选择所有任务 选择生成脚本
  • 如何在同一个表单中制作提交按钮、删除和更新,php

    我正在制作一个表单 当用户使用检查按钮检查一行时 他可以删除或更新它 但只有删除按钮有效 我不知道如何在同一表单中制作两个提交按钮 我希望按下删除按钮时转到delete php 更新按钮转到两个update php 下面是我的表单
  • 与应用程序类相关的滑动杀死应用程序和强制停止之间的区别

    我有一个应用程序实现Application class 考虑以下两种情况 A 打开应用程序 gt 按 Home gt 长按 Home 查看最近的应用程序 gt 滑动杀死应用程序 在这种情况下 Application class onCrea
  • 正则表达式和重音符号/波浪号

    我应该如何将重音符号包含到正则表达式中 我想检测来自的信件a z and 但这个正则表达式不起作用 pattern a z i 您可以尝试使用预定义的类来匹配所有字母 例如 p L 这适用于大多数正则表达式引擎 您可以在此处阅读有关正则表达
  • 如何从 QTextEdit 或 QPlainTextEdit 小部件获取当前可见的文本?

    这似乎是一件很常见的事情 但我找不到如何做 我有一个带有一堆文本的 QTextEdit 或 QPlainTextEdit 小部件 足够了 滚动是必要的 我想要另一个小部件提供有关当前可见文本的一些信息 为此 我需要知道 当可见文本发生变化时
  • 用于销毁资源的 Powershell 动词

    我一直在努力坚持批准的 Powershell 动词列表 http msdn microsoft com en us library ms714428 28v vs 85 29 aspx命名我的 cmdlet 时 我有一个创建资源的函数 因此
  • 如何解决请求与 .Net Core Web Api 中的多个端点匹配的问题

    我注意到关于这个话题有很多类似的问题 调用以下任何方法时我收到此错误 Microsoft AspNetCore Routing Matching AmbigouslyMatchException 请求匹配多个终结点 然而 我无法弄清楚解决该
  • 如何使用 jQuery 在克隆输入上增加名称 attrVal 数组?

    我正在尝试为我的婚礼设置一个 RSVP 表单 您可以将几个字段克隆为一次为多个客人进行 RSVP http adrianandemma com http adrianandemma com 这些克隆字段包括几个用于 参加是 否 的单选按钮
  • 将 GWT 单击事件转换为触摸事件

    我正在开发一个大项目 并且编写了很多 GWT 代码 现在我正在努力使该项目与 iPad 和 Android 平板电脑等平板电脑完全兼容 作为其中的一部分 我注意到触摸设备需要300ms延迟处理点击事件 在这个项目中 再次编写触摸事件是一件非