【发布时间】:2023-03-23 15:49:01
【问题描述】:
当用户在屏幕的任意位置右滑时,我必须完成Activity。我已经尝试过GestureDetector,如果Activity 中既不存在ScrollView 也不存在RescyclerView 并且另外具有onClickListener 的视图也不允许检测到它们上方的滑动,那它工作得很好。所以我尝试了一种不同的方法,通过编程将视图覆盖到所有视图顶部的布局中,然后尝试检测其上方的滑动事件。
private void swipeOverToExit(ViewGroup rootView) {
OverlayLayout child = new OverlayLayout(this);
ViewGroup.LayoutParams layoutParams =
new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
child.setLayoutParams(layoutParams);
rootView.addView(child);
}
叠加布局
public class OverlayLayout extends RelativeLayout {
private float x1, x2;
private final int MIN_DISTANCE = 150;
public OverlayLayout(Context context) {
super(context);
}
public OverlayLayout(Context context, AttributeSet attrs) {
super(context, attrs);
}
public OverlayLayout(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
public OverlayLayout(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
super(context, attrs, defStyleAttr, defStyleRes);
}
@Override
public boolean onInterceptTouchEvent(MotionEvent event) {
/*
* This method JUST determines whether we want to intercept the motion.
* If we return true, onTouchEvent will be called and we do the actual
* logic there.
*/
final int action = MotionEventCompat.getActionMasked(event);
Logger.logD("Intercept===", action + "");
// Always handle the case of the touch gesture being complete.
if (action == MotionEvent.ACTION_DOWN) {
return true; // Intercept touch event, let the parent handle swipe
}
Logger.logD("===", "Out side" + action + "");
// In general, we don't want to intercept touch events. They should be
// handled by the child view.
return false;
}
@Override
public boolean onTouchEvent(MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
x1 = event.getX();
break;
case MotionEvent.ACTION_UP:
x2 = event.getX();
float deltaX = x2 - x1;
if (Math.abs(deltaX) > MIN_DISTANCE) {
Logger.logD("Swipe Right===", MIN_DISTANCE + "");
return true;
} else {
Logger.logD("Tap===", "Tap===");
return super.onTouchEvent(event);
}
}
return true;
}
}
如果滑动操作在OverlayLayout 上执行,逻辑是拦截触摸事件到其他视图,然后进一步结束Activity。但是,现在我可以在OverlayLayout 上检测到滑动事件,但是即使我在onTouchEvent 的其他条件下返回return super.onTouchEvent(event);,其他视图也无法响应,因为您可以在我的代码中找到。任何人请帮我完成它。我被固定在这里并且非常兴奋地学习这个技巧:)
【问题讨论】:
-
尝试添加@Override public boolean dispatchTouchEvent(MotionEvent ev){ super.dispatchTouchEvent(ev);返回 productGestureDetector.onTouchEvent(ev); } 到您的活动
-
@Stella 你在活动中尝试过 dispatchTouchEvent 吗?
-
尝试搜索
touchIntercept在任何布局中控制手势的方法。 -
我在活动中尝试过
dispatchTouchEvent,但似乎对我没有帮助。我尝试了所有搜索,但我无法做到,这就是为什么我终于在这里@Atif。如果您知道发生了什么,请提供帮助。谢谢 -
@Stella 可能 help
标签: android android-activity swipe ontouchlistener