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' 所有触摸事件。
我已经将这个 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' 所有触摸事件。