0

背景:我有一个自定义 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中模拟触摸事件?

如何在 Android 中“重启”触摸事件?

以编程方式在android中执行Touch事件

导致:

    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 有关,但尝试了一些事情,似乎无法影响结果。

那么,是否可以使这些方法中的任何一种起作用,或者是否有另一种方法可以用短触点击代替长触点击?

4

2 回答 2

0

将长点击变成常规点击会让用户感到困惑,通常他们希望通过长点击取消它。

因此,您应该使用 Java 或 CSS 禁用它。

爪哇

先开启长按setLongClickable(true);再开启setOnLongClickListener,然后就可以返回点击了:

webview.setLongClickable(true);
webview.setOnLongClickListener(new OnLongClickListener() {
    @Override
    public boolean onLongClick(View v) {
        return true;
        }
});

或者

CSS

要禁用文本选择,请添加此 CSS:

body {
    -webkit-touch-callout: none;
    -webkit-user-select: none;
    -khtml-user-select: none;
    -moz-user-select: none;
    -ms-user-select: none;
    user-select: none;
}

在此处查看 Mozilla 文档。

于 2014-01-08T22:24:17.110 回答
0

最后,我们使用了 zepto javascript 库http://zeptojs.com/来解决这个问题,它负责解释用户发生的各种长/移动/短点击事件。这样我们就可以为每种类型放置 js 事件处理程序并显式调用适当的方法。

于 2014-01-14T21:36:54.413 回答