Ich muss Activity
beenden, wenn Benutzer ein Recht anbieten, irgendwo auf dem Bildschirm wischen. Ich habe versucht, mit GestureDetector
und das ist in Ordnung, wenn es weder ScrollView
noch RescyclerView
gibt es in der Activity
und zusätzlich Ansichten, die onClickListener
auch nicht erlauben, über sie wischen zu erkennen. Also hatte ich einen anderen Weg ausprobiert, indem ich eine Ansicht in das Layout über dem ganzen Programm überlagert und dann versucht habe, das Swipe-Ereignis darüber zu erkennen.Aktivität am Swipe rechts beenden?
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;
}
}
Die Logik ist Berührungsereignis auf andere Ansicht abfangen, wenn über die Swipe-Aktion die Activity
Ende OverlayLayout
führt dann weiter. Allerdings kann ich jetzt das Swipe-Ereignis auf OverlayLayout
erkennen, aber andere Ansichten konnten nicht antworten, obwohl ich return super.onTouchEvent(event);
in einem anderen Zustand von onTouchEvent
zurückgegeben habe, wie Sie dort in meinem Code herausfinden können. Bitte helfen Sie mir, es zu machen. Ich bin hier festgesteckt und super aufgeregt, den Trick zu lernen :)
versuchen, @Override öffentlichen boolean DispatchTouchEvent (MotionEvent ev) { super.dispatchTouchEvent (ev); return productGestureDetector.onTouchEvent (ev); } zu Ihrer Aktivität –
@Stella Haben Sie dispatchTouchEvent in Aktivität versucht? – Nisarg
Suchen Sie nach der 'touchIntercept' Methode zum Steuern der Gesten in jedem Layout. –