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

标签 gwt touch tablet

我正在开发一个大项目,并且编写了很多 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;
  }
}  

关于gwt - 将 GWT 单击事件转换为触摸事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9596807/

相关文章:

java - 使用特殊参数从 Ant 构建文件运行 GWT?

javascript - Android 4 Chrome 在 CSS 转换后点击触摸事件的测试问题

javascript - iPhone 中表格单元格的触摸事件

javascript - 构建与移动设备/平板电脑兼容的 Web 应用程序的最佳实践是什么

android - 如何正确包含 1 0"and 7"布局

iphone - ios 应用程序中的 setPreferredContentSize 错误

java - GWT - 编译成 html 文件

html - 如何使用 libgdx gwt 游戏防止窗口滚动

java - Firefox 中未捕获 Enter 键点击事件

ios - Superview 忽略 UserInteractionEnabled = NO?