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;
}
}
}
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);
Sie sollten ViewPager verwenden, siehe die folgenden Links.
http://Android-developers.blogspot.in/2011/08/horizontal-view-swiping-with-viewpager.html
http://developer.Android.com/training/implementing-navigation/lateral.html#horizontal-paging
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