webentwicklung-frage-antwort-db.com.de

Android: Swipe-Bildschirm, um eine andere Aktivität zu öffnen?

ich bin ein N00B-Programmierer und brauche viel Hilfe.

Nur zu Übungszwecken möchte ich eine einfache Enzyklopädie über Flora und Fauna (Pflanzen und Tiere) erstellen

Ich möchte meinen Startbildschirm wie den Startbildschirm von Android ziehen lassen. Streichen Sie nach rechts, um die Pflanzenseite zu öffnen, und streichen Sie nach links, um die Tierseite zu öffnen. Ich weiß nicht, wie ich den Übergangseffekt erzielen soll. Wir können es also zur Hälfte ziehen, um zu sehen, was auf der nächsten Seite steht, und es einfach zurückziehen, um es abzubrechen

Könnt ihr einen Link teilen, um den ziehbaren Bildschirm zu erstellen?

Danke schon mal

[Bearbeiten]

@Agarwal Ich habe versucht, den Code von Ihrem Link2 und es funktioniert nicht

Ich versuche zu testen, ob die Geste erkannt wurde oder nicht, indem ich Toast in die innere Klasse stecke, aber der Toast wird nicht angezeigt. Der Link1 ist im Grunde das gleiche.

und so wie der Code aussieht, kann ich meinen Bildschirm nicht wie auf dem Startbildschirm von Android ziehen

mein Code:

public class Home extends Activity implements OnClickListener {
    private GestureDetector gestureDetector;
    View.OnTouchListener gestureListener;
    ImageButton flora, fauna;
    Intent go;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    initialize();

    gestureDetector = new GestureDetector(new SwipeGestureDetector());
    gestureListener = new View.OnTouchListener() {
        public boolean onTouch(View v, MotionEvent event) {
            return gestureDetector.onTouchEvent(event);
        }
    };
}

private void initialize() {
    //find view by id to image button
    //set onClickListener to image button
}

public void onClick(View v) {
    //normal switch and case for each button

}

private void onLeftSwipe() {
    Toast t = Toast.makeText(Home.this, "Left swipe", Toast.LENGTH_LONG);
    t.show();
    go = new Intent("test.apps.FLORA");
    startActivity(go);
}

private void onRightSwipe() {
    Toast t = Toast.makeText(Home.this, "Right swipe", Toast.LENGTH_LONG);
    t.show();
    go = new Intent("test.apps.FAUNA");
    startActivity(go);
}

private class SwipeGestureDetector extends SimpleOnGestureListener {
    private static final int SWIPE_MIN_DISTANCE = 50;
    private static final int SWIPE_MAX_OFF_PATH = 200;
    private static final int SWIPE_THRESHOLD_VELOCITY = 200;

    @Override
    public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
            float velocityY) {
        try {
            Toast t = Toast.makeText(Home.this, "Gesture detected", Toast.LENGTH_SHORT);
            t.show();
            float diffAbs = Math.abs(e1.getY() - e2.getY());
            float diff = e1.getX() - e2.getX();

            if (diffAbs > SWIPE_MAX_OFF_PATH)
                return false;

            // Left swipe
            if (diff > SWIPE_MIN_DISTANCE
                    && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) {
                Home.this.onLeftSwipe();
            } 
            // Right swipe
            else if (-diff > SWIPE_MIN_DISTANCE
                    && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) {
                Home.this.onRightSwipe();
            }
        } catch (Exception e) {
            Log.e("Home", "Error on gestures");
        }
        return false;
    }

}
}
19
hrsetyono

Ich weiß, dass dies eine alte Frage ist, aber für alle, die sich fragen, warum der obige Code nicht funktioniert, liegt es daran, dass er den OnTouchListener nicht auf ein View-Objekt festgelegt hat. Deshalb wird sein Swipe "Event" nicht aufgegriffen, weil nichts darauf wartet.

Er könnte diese Zeile hinzufügen, um die Bildschaltfläche zu streichen (obwohl Sie wahrscheinlich ein besseres View-Objekt als dieses wünschen):

flora.setOnTouchListener(gestureListener);
15
David Hirst
13
chandan

Android-Aktivitätserkennung

Erstellen Sie eine Basisaktivitätsklasse

public abstract class _SwipeActivityClass extends AppCompatActivity
{
    private static final int SWIPE_MIN_DISTANCE = 120;
    private static final int SWIPE_MAX_OFF_PATH = 250;
    private static final int SWIPE_THRESHOLD_VELOCITY = 200;
    private GestureDetector gestureDetector;

    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        gestureDetector = new GestureDetector( this, new SwipeDetector());
    }

    protected abstract void onSwipeRight();
    protected abstract void onSwipeLeft();

    public class SwipeDetector extends GestureDetector.SimpleOnGestureListener
    {
        @Override
        public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY)
        {

            // Check movement along the Y-axis. If it exceeds SWIPE_MAX_OFF_PATH,
            // then dismiss the swipe.
            if (Math.abs(e1.getY() - e2.getY()) > SWIPE_MAX_OFF_PATH)
            {
                return false;
            }

            //toast( "start = "+String.valueOf( e1.getX() )+" | end = "+String.valueOf( e2.getX() )  );
            //from left to right
            if( e2.getX() > e1.getX() )
            {
                if (e2.getX() - e1.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY)
                {
                    onSwipeRight();
                    return true;
                }
            }

            if( e1.getX() > e2.getX() )
            {
                if (e1.getX() - e2.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY)
                {
                    onSwipeLeft();
                    return true;
                }
            }

            return false;
        }
    }

    @Override
    public boolean dispatchTouchEvent(MotionEvent ev)
    {
        // TouchEvent dispatcher.
        if (gestureDetector != null)
        {
            if (gestureDetector.onTouchEvent(ev))
            // If the gestureDetector handles the event, a swipe has been
            // executed and no more needs to be done.
            return true;
        }

        return super.dispatchTouchEvent(ev);
    }

    @Override
    public boolean onTouchEvent(MotionEvent event)
    {
        return gestureDetector.onTouchEvent(event);
    }
}

Dann erweitern Sie MainActivity von _SwipeActivityClass.

implementieren Sie die Methoden onSwipeLeft () und onSwipeRight (), um eine weitere Aktivität zu starten

1
Manish Dhruw