0

毫无疑问,Android 有一些可靠的方法来确定用户的意思:点击或滚动/移动。是否有任何简单的规则足以构建相同的行为?

这是我的问题。

我有一个控件,它应该被单击并运行它自己的单击处理程序,或者滚动(点击并移动)并使整个视图滚动(我有一个可以双向滚动的自定义视图,如果这很重要,这就是想法)。因此,我设置了一个简单的触摸侦听器,它会记住 MotionEvent.ACTION_DOWN 上的 onTouch 中的点,并在该点未更改时调用 MotionEvent.ACTION_UP 上的单击处理程序。

这在模拟器中运行良好,因为鼠标点击很精确,所以我没有注意到任何危险,而且我在三星 Galaxy S Plus 上也没有遇到任何问题——也许我在点击屏幕时真的很准确。

然而,我的第一个 beta 测试人员抱怨按钮不起作用——不是 100%,而是大多数时候,所以他们需要多次点击按钮,直到它处理点击。他们中的一些人还告诉我,如果用指尖触摸屏幕,按钮的效果会更好。

经过一番思考,我假设他们在单击时可能会移动手指,因此 DOWN 和 UP 上的点不同,并且处理程序没有确定单击。为了验证这一点,我添加了一个允许小漂移的简单改进——这很有帮助!测试人员证实,这个技巧让事情变得更好。这是处理程序的最终代码:

// This interface is for a real click handler that may differ depending on control.
interface Clicker {
    boolean click(View v);
}

class ButtonTouchListener implements OnTouchListener {
    private boolean _trackingButtonClick = false;
    private Clicker _clicker;
    // These two integers are the improvement.
    private int downX = 0;
    private int downY = 0;

    public ButtonTouchListener(Clicker clicker) {
        _clicker = clicker;
    }

    public boolean onTouch(View v, MotionEvent event) {
        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                downX = (int) event.getRawX();
                downY = (int) event.getRawY();
                trackingButtonClick = true;
                // Calling the onTouchEvent of the main view that handles the global scrolling.
                return onTouchEvent(event);
            case MotionEvent.ACTION_MOVE:
            case MotionEvent.ACTION_OUTSIDE:
                int newX = (int) event.getRawX();
                int newY = (int) event.getRawY();
                int xOffset = downX - newX;
                int yOffset = downY - newY;
                // These two lines are the improvement also.
                // 10 is a max move distance that I've simply guessed.
                if (Math.abs(xOffset) >= 10 || Math.abs(yOffset) >= 10)
                    _trackingButtonClick = false;
                // Calling the onTouchEvent of the main view that handles the global scrolling.
                return onTouchEvent(event);
            case MotionEvent.ACTION_UP:
                if (_trackingButtonClick) {
                    _trackingButtonClick = false;
                    // Calling the click handler of the control.
                    return _clicker.click((View)v.getTag());
                }
                _trackingButtonClick = false;
                return true;
            default :
                return onTouchEvent(event);
            }
        }
    }
}

所以看起来我猜对了,Android 内部可能有类似的东西。但真的吗?有人知道吗?我不熟悉该平台的任何来源,希望不要在那里挖掘,所以如果有人分享经验,我将不胜感激。

4

1 回答 1

0

你在找一个GestureDetector吗?

于 2012-12-23T08:38:30.370 回答