背景:我有一个自定义 WebViewClient 以信息亭模式显示交互式网页,没有外部链接等。因此,长触摸操作没有任何意义,因为它们什么都不做。所以我想做的是当执行长触摸时,通常是用户在导航按钮上按住稍微过长(500 毫秒并不多),我想执行短触摸操作。由于网页完全包含在 javascript 中,因此在主 webview 窗口之外没有使用任何 android 视图这一事实使情况变得复杂。所以我需要一种方法来执行与长触摸相同的参数(位置等)的短触摸。
我尝试过的事情:尝试1:Android Press LongClickListener get X, Y Coordinates, OnTouchListener
导致:
PressEvent press;
class PressEvent {
MotionEvent ev;
public PressEvent(MotionEvent event) {
ev = event;
}
}
launchMethod (abbreviated for brevity) {
view = (WebView) findViewById(R.id.mainWebview);
view.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event)
{
final int action = event.getAction();
switch (action & MotionEvent.ACTION_MASK) {
case MotionEvent.ACTION_DOWN:
press = new PressEvent(event);
break;
}
return false;
}
});
view.setOnLongClickListener(new OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
log.debug("HERE");
MotionEvent newEvent = MotionEvent.obtain(press.ev.getDownTime(), press.ev.getDownTime() + 499, MotionEvent.ACTION_DOWN, press.ev.getX(), press.ev.getY(), press.ev.getMetaState());
view.dispatchTouchEvent(newEvent);
newEvent.recycle();
return true;
}
});
这似乎根本不起作用,尽管我确实看到了我的“HERE”调试语句。尝试2,一些组合:如何在Android中模拟触摸事件?
导致:
int longPress = ViewConfiguration.getLongPressTimeout();
view.setOnTouchListener(new OnTouchListener()
{
@Override
public boolean onTouch(View v, MotionEvent event)
{
long timeHeld = event.getEventTime() - event.getDownTime();
log.debug(timeHeld);
log.debug(event.getAction());
if (timeHeld > longPress && event.getAction() == MotionEvent.ACTION_UP) {
log.debug(event.getDownTime() + " " + event.getEventTime());
MotionEvent newEvent = MotionEvent.obtain(event.getDownTime(), event.getDownTime() + 499, event.getAction(), event.getX(), event.getY(), event.getMetaState());
view.dispatchTouchEvent(newEvent);
newEvent.recycle();
return true;
}
return false;
}
});
这实际上似乎有效,但并非在所有情况下都有效。如果我在保持过程中完全不移动手指,它似乎会起作用。但是,如果我这样做,它不起作用。我怀疑它与 ACTION_MASKED 标志Android Press LongClickListener get X, Y Coordinates, OnTouchListener 有关,但尝试了一些事情,似乎无法影响结果。
那么,是否可以使这些方法中的任何一种起作用,或者是否有另一种方法可以用短触点击代替长触点击?