转换GWT点击事件触摸事件 [英] Converting GWT Click Events to Touch Events
问题描述
我正在开发一个大项目,我写了很多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屋!