如何忽略重叠视图并检测 onFling (onSwipe)?
How to ignore overlying views and detect onFling (onSwipe)?
我有很多 Child 的观点。我需要的是对 Swipe 或 Fling 动作做出反应。问题是它只有在我删除所有 Child 时才真正起作用,否则主布局顶部的 Child 视图会阻止我尝试滑动。
我尝试将 onSwipeListener 添加到主布局并将 GestureListener 添加到整个布局 activity 都取得了同样的成功。
我当前的 (non-working) 解决方案如下:
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_schedule);
main_layout = findViewById(R.id.schedule_main_view);
Animation fadeInAnimation = AnimationUtils.loadAnimation(this, R.anim.fade);
main_layout.startAnimation(fadeInAnimation);
GestureDetector.SimpleOnGestureListener simpleOnGestureListener =
new GestureDetector.SimpleOnGestureListener() {
@Override
public boolean onDown(MotionEvent event) {
return true;
}
@Override
public boolean onFling(MotionEvent event1, MotionEvent event2,
float velocityX, float velocityY) {
Log.d(null,"Fling");
int dx = (int) (event2.getX() - event1.getX());
// don't accept the fling if it's too short
// as it may conflict with a button push
if (Math.abs(dx) > 20
&& Math.abs(velocityX) > Math.abs(velocityY)) {
if (velocityX > 0) {
Log.d(DEBUG_TAG, "onFling: " + event1.toString() + event2.toString());
Log.d(DEBUG_TAG, "onFling To Right");
} else {
Log.d(DEBUG_TAG, "onFling: " + event1.toString() + event2.toString());
Log.d(DEBUG_TAG, "onFling To Left");
}
return true;
} else {
return false;
}
}
};
shift = getIntent().getIntExtra(WEEK_SHIFT, CURRENT_WEEK);
mDetector = new GestureDetectorCompat(this,simpleOnGestureListener);
unDimScreen();
setupWeek();
}
重复一遍:如果 activity 处于顶部没有 child 视图的状态,它会按预期工作。
所以问题是:我可以做些什么来使 activity 获取手势而忽略上层视图?
问题是子视图获取触摸事件,但没有将其提供给父视图。
如果您没有在重叠视图上使用可点击事件,您可以关闭该视图可点击 属性 ,如 view.setClickable(false);
... 然后所有点击事件都将进入其父视图。如果它不起作用,您可以像这样在每个重叠视图上定义触摸侦听器:
view.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View view, MotionEvent motionEvent) {
return false;
}
});
更新:
这是这个问题的另一个(正确的)解决方案:https://developer.android.com/training/gestures/viewgroup.html#delegate
尝试将 android:clickable="true"
和 android:descendantFocusability="blocksDescendants"
设置为要在 xml 文件中滑动的视图。这应该会阻止 children 接收点击事件。
我有很多 Child 的观点。我需要的是对 Swipe 或 Fling 动作做出反应。问题是它只有在我删除所有 Child 时才真正起作用,否则主布局顶部的 Child 视图会阻止我尝试滑动。
我尝试将 onSwipeListener 添加到主布局并将 GestureListener 添加到整个布局 activity 都取得了同样的成功。
我当前的 (non-working) 解决方案如下:
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_schedule);
main_layout = findViewById(R.id.schedule_main_view);
Animation fadeInAnimation = AnimationUtils.loadAnimation(this, R.anim.fade);
main_layout.startAnimation(fadeInAnimation);
GestureDetector.SimpleOnGestureListener simpleOnGestureListener =
new GestureDetector.SimpleOnGestureListener() {
@Override
public boolean onDown(MotionEvent event) {
return true;
}
@Override
public boolean onFling(MotionEvent event1, MotionEvent event2,
float velocityX, float velocityY) {
Log.d(null,"Fling");
int dx = (int) (event2.getX() - event1.getX());
// don't accept the fling if it's too short
// as it may conflict with a button push
if (Math.abs(dx) > 20
&& Math.abs(velocityX) > Math.abs(velocityY)) {
if (velocityX > 0) {
Log.d(DEBUG_TAG, "onFling: " + event1.toString() + event2.toString());
Log.d(DEBUG_TAG, "onFling To Right");
} else {
Log.d(DEBUG_TAG, "onFling: " + event1.toString() + event2.toString());
Log.d(DEBUG_TAG, "onFling To Left");
}
return true;
} else {
return false;
}
}
};
shift = getIntent().getIntExtra(WEEK_SHIFT, CURRENT_WEEK);
mDetector = new GestureDetectorCompat(this,simpleOnGestureListener);
unDimScreen();
setupWeek();
}
重复一遍:如果 activity 处于顶部没有 child 视图的状态,它会按预期工作。
所以问题是:我可以做些什么来使 activity 获取手势而忽略上层视图?
问题是子视图获取触摸事件,但没有将其提供给父视图。
如果您没有在重叠视图上使用可点击事件,您可以关闭该视图可点击 属性 ,如 view.setClickable(false);
... 然后所有点击事件都将进入其父视图。如果它不起作用,您可以像这样在每个重叠视图上定义触摸侦听器:
view.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View view, MotionEvent motionEvent) {
return false;
}
});
更新: 这是这个问题的另一个(正确的)解决方案:https://developer.android.com/training/gestures/viewgroup.html#delegate
尝试将 android:clickable="true"
和 android:descendantFocusability="blocksDescendants"
设置为要在 xml 文件中滑动的视图。这应该会阻止 children 接收点击事件。