检测布局外的触摸事件

时间:2012-09-06 14:16:05

标签: android android-event

我正在使用我在某处找到的开源编号码(感谢Jeffrey F. Cole),但我发现了一个错误。

数字选择器有一个处理程序,可以在您触摸按钮时更快地增加数字

long`private Handler repeatUpdateHandler = new Handler();

`

    class RepetetiveUpdater implements Runnable {
    public void run() {
        if (autoIncrement) {
            increment();
            repeatUpdateHandler.postDelayed(new RepetetiveUpdater(),
                    REPEAT_DELAY);
        } else if (autoDecrement) {
            decrement();
            repeatUpdateHandler.postDelayed(new RepetetiveUpdater(),
                    REPEAT_DELAY);
        }
    }
}

 .....

public class NumberPicker extends LinearLayout {

 .....

    // Auto increment for a long click
    increment.setOnLongClickListener(new View.OnLongClickListener() {
        public boolean onLongClick(View arg0) {
            autoIncrement = true;
            repeatUpdateHandler.post(new RepetetiveUpdater());
            return false;
        }
    });

    // When the button is released, if we're auto incrementing, stop
    increment.setOnTouchListener(new View.OnTouchListener() {
        public boolean onTouch(View v, MotionEvent event) {
            if (event.getAction() == MotionEvent.ACTION_UP && autoIncrement) {
                autoIncrement = false;
            }
            return false;
        }
    });

问题是当您长按按钮时计数器开始增加,但是当您用手指按住并在屏幕上拖动手指时,即使抬起手指,计数器也会不断累加。

那么如何检测到手指离开我的数字选择器布局并停止计数器?

Thx :)

1 个答案:

答案 0 :(得分:1)

我不太确定这是一个错误,我甚至不确定它是来自这个数字选择器在API本身的数字选择器之上所做的更改。我认为处理递增和递减选择器的按钮被设置为继续运行直到收到ACTION_UP MotionEvent,但这可能过度简化了它。

编辑:

我已经在Android 2.3.3上测试了这个,这正是结果。

修改

根据您在评论中的澄清,这听起来像一个非常糟糕的错误。看起来你需要做的是让Handler在ACTION_UP中删除对该runnable的回调。你可以把我链接到项目,所以我可以尝试提交补丁吗?

修改

您提供的NumberPicker未正确使用处理程序,IMO。不是保持对同一个Handler的引用,以便以后可以删除回调,而是每次发布时都会创建一个新的回调。我做了一些更改并修复了问题:https://gist.github.com/3657989