4

我的问题是当我尝试在我的 ListView 中拖动一个项目时,我并不总是得到 ACTION_DOWN 事件。我有很多 ACTION_MOVE 事件,只有一个 ACTION_UP 事件。并非总是如此。我得到了 ACTION_DOWN 3 次。这让我很困惑。

我看了类似的问题,但它的答案似乎不适合我。谁能想到为什么会这样?

谢谢

//list_client  --  a listview
list_client.setOnTouchListener(new View.OnTouchListener() {
    float f1 = -1, f2 = -1 ;
    @Override
    public boolean onTouch(View v, MotionEvent event) {
        switch(event.getAction()){
            case MotionEvent.ACTION_DOWN: 
                f1 = event.getRawY();
                    break;
            case MotionEvent.ACTION_MOVE:
                f2 = event.getRawY();
                if(f2 - f1 > 50){
                    if(View.VISIBLE != rl_search_and_add.getVisbility() &&  ){  rl_search_and_add.setVisibility(View.VISIBLE);
                }
                f1 = f2;
                }else if (f2 - f1 < -50){
                    rl_search_and_add.setVisibility(View.GONE);
                    f1 = f2;
                }
                break; 
            case MotionEvent.ACTION_UP:
                f1 = -1; f2 = -1;
                break; 
        }
        return false;
    }
});
4

2 回答 2

1

这种行为可能有几个原因。

  • 用户可能会稍微错过列表MotionEvent.ACTION_DOWN并由其他组件处理,但是无论用户如何继续拖动并点击您的列表视图区域,您都会收到MotionEvent.ACTION_MOVE操作。
  • 另一种可能性是,你有很多事件,它们被转移到历史事件,你只收到最新的事件。您可以使用MotionEvent的所有历史方法来查看它们。
于 2013-11-26T15:27:13.823 回答
0

你应该像这样覆盖 onInterceptTouchEvent:

@Override
public boolean onInterceptTouchEvent(MotionEvent event) {
    switch (event.getAction()) {
        case MotionEvent.ACTION_DOWN:
            yDown = event.getRawY();
            break;
        default:
            break;
    }
    return super.onInterceptTouchEvent(event);
}

然后在你的程序中使用 yDown

于 2016-10-25T07:49:13.867 回答