2013-04-15 12 views
30

Mam Android aplikacji, w których istnieje Lista Zobacz jak tenAndroid widoku listy w prawo/lewo swipes jak dzienników połączeń

enter image description here

teraz chcę wykonać dwa różne działania na prawo/lewo machnięcia Pozycje na liście w taki sam sposób jak rodzimy dziennik połączeń działa

przesuń w prawo od listy

enter image description here

Chcę tego typu suwaki. Czy ktoś wie, jak to zrobić? Zasadniczo chcę wdrożyć SimpleOnGestureListener.

Czytałem post Odpowiedział sir WDBFling gesture detection on grid layout a potem jestem sukcesy we wdrażaniu lewy i prawy bezstykowa wykrywanie bezstykowa ale jedyną rzeczą, ja nie dostaję, na którym Wykaz egzemplarzy nastąpiło machnięcia.

Aktualizacja 24 maja 2013

Teraz jestem w stanie wykryć działania bezstykowa przy użyciu tego kodu -

SwipeDetector.java

/** 
* Class swipe detection to View 
*/ 
public class SwipeDetector implements View.OnTouchListener { 

    public static enum Action { 
     LR, // Left to right 
     RL, // Right to left 
     TB, // Top to bottom 
     BT, // Bottom to top 
     None // Action not found 
    } 

    private static final int HORIZONTAL_MIN_DISTANCE = 30; // The minimum 
    // distance for 
    // horizontal swipe 
    private static final int VERTICAL_MIN_DISTANCE = 80; // The minimum distance 
    // for vertical 
    // swipe 
    private float downX, downY, upX, upY; // Coordinates 
    private Action mSwipeDetected = Action.None; // Last action 

    public boolean swipeDetected() { 
     return mSwipeDetected != Action.None; 
    } 

    public Action getAction() { 
     return mSwipeDetected; 
    } 

    /** 
    * Swipe detection 
    */@Override 
    public boolean onTouch(View v, MotionEvent event) { 
     switch (event.getAction()) { 
     case MotionEvent.ACTION_DOWN: 
      { 
       downX = event.getX(); 
       downY = event.getY(); 
       mSwipeDetected = Action.None; 
       return false; // allow other events like Click to be processed 
      } 
     case MotionEvent.ACTION_MOVE: 
      { 
       upX = event.getX(); 
       upY = event.getY(); 

       float deltaX = downX - upX; 
       float deltaY = downY - upY; 

       // horizontal swipe detection 
       if (Math.abs(deltaX) > HORIZONTAL_MIN_DISTANCE) { 
        // left or right 
        if (deltaX < 0) { 

         mSwipeDetected = Action.LR; 
         return true; 
        } 
        if (deltaX > 0) { 

         mSwipeDetected = Action.RL; 
         return true; 
        } 
       } else 

       // vertical swipe detection 
       if (Math.abs(deltaY) > VERTICAL_MIN_DISTANCE) { 
        // top or down 
        if (deltaY < 0) { 

         mSwipeDetected = Action.TB; 
         return false; 
        } 
        if (deltaY > 0) { 

         mSwipeDetected = Action.BT; 
         return false; 
        } 
       } 
       return true; 
      } 
     } 
     return false; 
    } 

} 

teraz używać go z ListView w w ten sposób

// Set the touch listener 
    final SwipeDetector swipeDetector = new SwipeDetector(); 
    lv.setOnTouchListener(swipeDetector); 

w twojej setOnItemClickListener można wykrywać zdarzenia machnięcia jak te

lv.setOnItemClickListener(new OnItemClickListener() { 


    @Override 
    public void onItemClick(AdapterView <? > parent, View view, 
     int position, long id) { 

     if (swipeDetector.swipeDetected()) { 
      if (swipeDetector.getAction() == SwipeDetector.Action.LR) { 

       Toast.makeText(getApplicationContext(), 
        "Left to right", Toast.LENGTH_SHORT).show(); 

      } 
      if (swipeDetector.getAction() == SwipeDetector.Action.RL) { 

       Toast.makeText(getApplicationContext(), 
        "Right to left", Toast.LENGTH_SHORT).show(); 

      } 
     } 
    } 
}); 

Ale nadal nie jestem w stanie ożywić bezstykowa, takie jak:

enter image description here

+1

może to pomoże http://stackoverflow.com/questions/11833504/simple-swipe-gesture- to-activity-tutorial – Elior

+0

@Nikhil Agrawal ma rozwiązanie dla tego –

+0

@Nikhil Agrwal: Szukam tego samego, czy masz jakieś rozwiązanie? – Jayesh

Odpowiedz

1

można użyć Fragmenty tego wymogu. Użyj FragmentPagerAdapter i overide getItem (pozycja int), która zwróci ci fragment. Ustaw adapter na viewPager iw ustawieniu setOnPageChangeListener możesz mieć logikę do wywoływania innego fragmentu.

Shrishail

13

OnSwipeTouchListener.java:

import android.view.GestureDetector; 
import android.view.GestureDetector.SimpleOnGestureListener; 
import android.view.MotionEvent; 
import android.view.View; 
import android.view.View.OnTouchListener; 

public class OnSwipeTouchListener implements OnTouchListener { 

    private final GestureDetector gestureDetector = new GestureDetector(new GestureListener()); 

    public boolean onTouch(final View view, final MotionEvent motionEvent) { 

     super.onTouch(view, motionEvent); 
     return gestureDetector.onTouchEvent(motionEvent); 

    } 

    private final class GestureListener extends SimpleOnGestureListener { 

     private static final int SWIPE_THRESHOLD = 100; 
     private static final int SWIPE_VELOCITY_THRESHOLD = 100; 

     @Override 
     public boolean onDown(MotionEvent e) { 
      return true; 
     } 

     @Override 
     public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { 

      boolean result = false; 
      try { 
       float diffY = e2.getY() - e1.getY(); 
       float diffX = e2.getX() - e1.getX(); 
       if (Math.abs(diffX) > Math.abs(diffY)) { 
        if (Math.abs(diffX) > SWIPE_THRESHOLD && Math.abs(velocityX) > SWIPE_VELOCITY_THRESHOLD) { 
         if (diffX > 0) { 
          onSwipeRight(); 
         } else { 
          onSwipeLeft(); 
         } 
        } 
       } else { 
        if (Math.abs(diffY) > SWIPE_THRESHOLD && Math.abs(velocityY) > SWIPE_VELOCITY_THRESHOLD) { 
         if (diffY > 0) { 
          onSwipeBottom(); 
         } else { 
          onSwipeTop(); 
         } 
        } 
       } 
      } catch (Exception exception) { 
       exception.printStackTrace(); 
      } 
      return result; 
     } 
    } 
    public void onSwipeRight() {} 
    public void onSwipeLeft() {} 
    public void onSwipeTop() {} 
    public void onSwipeBottom() {} 
} 

ZASTOSOWANIE:

imageView.setOnTouchListener(new OnSwipeTouchListener() { 

    public void onSwipeTop() { 
     Toast.makeText(MyActivity.this, "top", Toast.LENGTH_SHORT).show(); 
    } 
    public void onSwipeRight() { 
     Toast.makeText(MyActivity.this, "right", Toast.LENGTH_SHORT).show(); 
    } 
    public void onSwipeLeft() { 
     Toast.makeText(MyActivity.this, "left", Toast.LENGTH_SHORT).show(); 
    } 
    public void onSwipeBottom() { 
     Toast.makeText(MyActivity.this, "bottom", Toast.LENGTH_SHORT).show(); 
    } 

}); 
+0

hmmmm ... Zobaczę i dam ci znać, ale lepiej wklej ten kod tylko tutaj. –

+0

Jeśli możemy połączyć DSLV i SwipeListView, możemy zrealizować automatyczne przeciąganie w samsungu. – Jayesh

+0

Co to jest super.onTouch (view, motionEvent); w metodzie OnTouch.? –