我在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;
}
});
编辑:从最终返回假的某些原因完成了这项工作。欢迎任何解释
答案 0 :(得分:1)
队长在这里解释一下!
当您从视图上的覆盖onTouchEvent()或OnTouchListeners onTouch()方法返回true时,您告诉android此触摸事件已被“消耗”。这样,触摸事件将不会传递回基础视图,并将停在那里。当你需要覆盖触摸事件发生的事情时这很好,但如果你需要默认操作发生,你必须返回false,这样你告诉android事件没有被“消耗”,它必须通知每个其他的监听器触碰事件已经发生。
因此,通过返回true,您已覆盖默认行为,即滑动,因此未在任何触摸事件上调用,因为您“消耗了”所有触摸事件。