ListView onTouchListener省略了fling

时间:2015-01-26 15:38:21

标签: android listview

我在onTouchListener上写了这个,以便在listview滚动上隐藏/显示actionBar,类似于Instagram app中的当前功能。一切正常,除了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;
    }
});

编辑:从最终返回假的某些原因完成了这项工作。欢迎任何解释

1 个答案:

答案 0 :(得分:1)

队长在这里解释一下!

当您从视图上的覆盖onTouchEvent()或OnTouchListeners onTouch()方法返回true时,您告诉android此触摸事件已被“消耗”。这样,触摸事件将不会传递回基础视图,并将停在那里。当你需要覆盖触摸事件发生的事情时这很好,但如果你需要默认操作发生,你必须返回false,这样你告诉android事件没有被“消耗”,它必须通知每个其他的监听器触碰事件已经发生。

因此,通过返回true,您已覆盖默认行为,即滑动,因此未在任何触摸事件上调用,因为您“消耗了”所有触摸事件。