Я должен закончить Activity
, когда пользователь предлагает прокрутку в любом месте экрана. Я пробовал с GestureDetector
, и это работает нормально, если нет ScrollView
или RescyclerView
существует в Activity
, и кроме того, виды, которые имеют 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);
}
OverlayLayout
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
. Тем не менее, теперь я могу обнаружить событие swipe на OverlayLayout
, но другие представления не могли ответить, хотя я вернулся return super.onTouchEvent(event);
в еще состоянии onTouchEvent
, так как вы можете найти его в моем коде. Кто-нибудь, пожалуйста, помогите мне это сделать. Я возлагал здесь и супер рад узнать трюк :)
попробуйте добавить @Override public boolean dispatchTouchEvent (MotionEvent ev) { super.dispatchTouchEvent (ev); return productGestureDetector.onTouchEvent (ev); } к вашей деятельности –
@Stella Вы пробовали dispatchTouchEvent в своей деятельности? – Nisarg
Попробуйте найти метод touchTellIntercept для управления жестами в любом виде макета. –