ListView onTouchListener 省略了 fling

ListView onTouchListener is omitting fling

我已经将这个 onTouchListener 写到 hide/show 列表视图滚动上的 actionBar,类似于 Instagram 应用程序中的当前功能。一切正常,除了 listView 不会一闪而过。我知道我已经以某种方式阻止了该操作,但我仍然是新手,无法弄清楚。任何人都可以帮助我了解这里发生了什么吗?

list.setOnTouchListener(new OnTouchListener() {

    @Override
    public boolean onTouch(View v, MotionEvent event) {

        int newTextPosition = (int) (text.getY() * -1);
        int move;               

        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:

                startY = event.getY();
                maxPath = text.getHeight();

                break;

            case MotionEvent.ACTION_UP:

                v.performClick();

                break;
            case MotionEvent.ACTION_MOVE:

                newY = event.getY();                        
                move = (int) (newY - startY);

                // Going UP
                if(newY < startY){

                    if((text.getY() * -1) == text.getHeight()){
                        startY = event.getY();
                        return false;
                    }

                    int maxPath = (int) (text.getHeight() + text.getY());                               

                    if((move * -1) > maxPath){
                        move = maxPath * -1;
                    }

                    text.setY(text.getY() + move);
                    list.setY(list.getY() + move);

                    LinearLayout.LayoutParams params = (LinearLayout.LayoutParams) list.getLayoutParams();
                    params.height = list.getHeight() + (move * -1);
                    list.setLayoutParams(params);

                    break;

                }

                // Going DOWN
                if(newY > startY){

                    if((text.getY() * -1) == 0){
                        startY = event.getY();
                        return false;
                    }

                    if(text.getY() >= 0){
                        move = 0;
                    }

                    if(move > newTextPosition)
                        move = newTextPosition;

                    text.setY(text.getY() + move);
                    list.setY(list.getY() + move);

                    LinearLayout.LayoutParams params = (LinearLayout.LayoutParams) list.getLayoutParams();
                    params.height = list.getHeight() + (move * -1);
                    list.setLayoutParams(params);

                    break;


                }                                       

        }

        return true;
    }
});

编辑:出于某种原因,最后返回 false 完成了这项工作。欢迎任何解释

队长来解释一下!

当您从重写 onTouchEvent() on Views or from the OnTouchListeners onTouch() 方法中 return 为真时,您告诉 android 此触摸事件已 'consumed'。这样,触摸事件就不会传回底层视图并会停在那里。当您需要覆盖触摸事件发生的事情时,这很好,但是如果您需要默认操作发生,您必须 return false,这样您告诉 android 该事件不是 'consumed' 并且它必须通知所有其他侦听器已发生触摸事件。

因此,通过 return 为真,您已经覆盖了默认行为,即滑动,因此它不会在任何触摸事件上调用,因为您 'consumed' 所有触摸事件。