转换GWT点击事件触摸事件 [英] Converting GWT Click Events to Touch Events

查看:107
本文介绍了转换GWT点击事件触摸事件的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

作为其中的一部分,我注意到触摸设备需要 300ms 延迟来处理点击事件。在这个项目中,再次编写触摸事件是一项非常繁琐的任务。我在这方面做了大量的研究,并发现谷歌语音应用中使用的谷歌快速按钮API。我试过了,它的工作很好,但需要大量的编码和JSNI。



我的问题是,你有什么可以用来轻松克服这种延迟? / p>

解决方案

下面是一个纯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;
导入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;

/ ** 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;
$ b $ public FastButton(Widget child){
// TODO - messages
assert(child instanceof HasAllTouchHandlers):;
assert(child instanceof HasClickHandlers):;
initWidget(child);
sinkEvents(Event.TOUCHEVENTS | Event.ONCLICK);

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

@Override
public void onBrowserEvent(Event event){
timeStart = getUnixTimeStamp();
switch(DOM.eventGetType(event)){
case Event.ONTOUSTSTART:
{
onTouchStart(event);
休息;
}
case Event.ONTOUCHEND:
{
onTouchEnd(event);
休息;
}
case Event.ONTOUMMOVE:
{
onTouchMove(event);
休息;
}
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);



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


$ b $ 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;



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

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

private int getUnixTimeStamp(){
Date date = new Date();
int iTimeStamp =(int)(date.getTime()* .001);
返回iTimeStamp;
}
}


I am working on a Big Project and i have a lot of GWT code written. Now i am working on making the project fully compatible with Tablets like iPad and Android Tablets.

As a part of this, i have noticed that touch devices takes 300ms delay to handle click events. In this project, writing touch events again is a very tedious task. I have done a lot of researches in this and found the Google Fast Buttons API used in Google Voice Application. I tried that and its working good but requires a lot of coding and JSNI.

My question is, Is there anything else available in your knowledge to easily overcome this delay?

解决方案

Here is a pure java implementation of the fast button.It doesn't include a single line of 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点击事件触摸事件的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆