2013-07-24 14 views
8

Próbuję zaimplementować gest w mojej aplikacji iz jakiegoś powodu wywołanie onfling() nie jest wywoływane. Próbowałem przeczytać wiele postów na ten temat i próbowałem naprawić mój kod, ale to nie działa. Poniżej znajduje się mój kod. Proszę spojrzeć:onfling() nie jest wywoływany z jakiegoś powodu

public class MainMenuSlider extends Activity implements OnClickListener{ 

protected MyGestureListener myGestureListener; 

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 ViewFlipper vf; 
private Animation animFlipInNext,animFlipOutNext, animFlipInPrevious, animFlipOutPrevious; 

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    setContentView(R.layout.mainmenuslider); 
    myGestureListener = new MyGestureListener(this); 

    //vf for viewflipper 
    vf=(ViewFlipper)findViewById(R.id.ViewFlipper01); 
    animFlipInNext = AnimationUtils.loadAnimation(this, R.anim.flipinnext); 
    animFlipOutNext = AnimationUtils.loadAnimation(this, R.anim.flipoutnext); 
    animFlipInPrevious = AnimationUtils.loadAnimation(this, R.anim.flipinprevious); 
    animFlipOutPrevious = AnimationUtils.loadAnimation(this, R.anim.flipoutprevious); 

    imageone = (ImageView) findViewById(R.id.imageone); 
    imagetwo = (ImageView) findViewById(R.id.imagetwo); 
    imageone.setOnClickListener(myGestureListener); 
    imagetwo.setOnClickListener(myGestureListener); 


} 


class MyGestureListener extends SimpleOnGestureListener implements OnTouchListener 
    { 
     Context context; 
     GestureDetector gDetector; 

    public MyGestureListener() 
    { 
     super(); 
    } 

    public GestureDetector getDetector() 
    { 
     return gDetector; 
    } 

    public MyGestureListener(Context context) 
    { 
     this(context, null); 
    } 

    public MyGestureListener(Context context, GestureDetector gDetector) 
    { 

     if(gDetector == null) 
      gDetector = new GestureDetector(context, this); 

     this.context = context; 
     this.gDetector = gDetector; 
    } 

    public boolean onDown(MotionEvent event) 
    { 
     return true; 
    } 


    @Override 
    public boolean onFling(MotionEvent e1,MotionEvent e2,float velocityX,float velocityY) 
    { 
     try { 
      if(e1.getX() > e2.getX() && Math.abs(e1.getX() - e2.getX()) > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) { 
       vf.setInAnimation(animFlipInPrevious); 
       vf.setOutAnimation(animFlipOutPrevious); 
       vf.showPrevious(); 
      }else if (e1.getX() < e2.getX() && e2.getX() - e1.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) { 
       vf.setInAnimation(animFlipInNext); 
       vf.setOutAnimation(animFlipOutNext); 
       vf.showNext(); 
      } 
     } catch (Exception e) { 
      // nothing 
     } 
     return true; 

    } 

    @Override 
    public boolean onSingleTapConfirmed(MotionEvent e) 
    { 

     return super.onSingleTapConfirmed(e); 
    } 

    public boolean onTouch(View v, MotionEvent event) 
    { 

     // Within the MyGestureListener class you can now manage the event.getAction() codes. 

     // Note that we are now calling the gesture Detectors onTouchEvent. And given we've set this class as the GestureDetectors listener 
     // the onFling, onSingleTap etc methods will be executed. 
     return gDetector.onTouchEvent(event); 
    } 


    public void onClick(View v) 
    { 
     if (v == imageone) 
     { 
      Intent j = new Intent(getApplicationContext(), MainActivity.class); 
      j.putExtra("slideindex", 0); 
      startActivity(j); 
     } 

     if (v == imagetwo) 
     { 
      Intent j = new Intent(getApplicationContext(), MainActivity.class); 
      j.putExtra("slideindex", 1); 
      startActivity(j); 
     } 
    } 

    public boolean onScroll(MotionEvent e1,MotionEvent e2,float distanceX,float distanceY) 
    { 
     return true; 
    } 


    } 
} 

EDIT: Oto zawartość pliku XML mainmenuslider zgodnie z wnioskiem

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
       android:layout_width="match_parent" 
       android:layout_height="match_parent" 
       android:orientation="vertical" 
       android:background="#291E3D" > 

      <ScrollView android:layout_width="fill_parent" 
          android:layout_height="fill_parent" 
          android:orientation="vertical" > 

        <LinearLayout android:layout_width="fill_parent" 
            android:layout_height="fill_parent" 
            android:gravity="center" 
            android:orientation="vertical" > 

          <ViewFlipper android:id="@+id/ViewFlipper01" 
               android:layout_height="wrap_content" 
               android:layout_width="fill_parent" 
               android:gravity="center" > 

            <!-- adding views to ViewFlipper --> 

              <!-- First Slide --> 
              <LinearLayout android:layout_width="fill_parent" 
                  android:layout_height="fill_parent" 
                  android:gravity="center" 
                  android:orientation="vertical" > 


                <TextView android:id="@+id/title1" 
                   android:text="title1" 
                   android:textColor="#ffffff" 
                   android:layout_width="fill_parent" 
                   android:layout_height="wrap_content" 
                   android:gravity="center" 
                   android:layout_marginBottom="3dip" 
                   android:textSize="25dip"/> 


                <ImageView android:id="@+id/imageone" 
                   android:clickable="true" 
                   android:layout_width="wrap_content" 
                   android:layout_height="wrap_content" 
                   android:src="@drawable/splash_screen"> 
                </ImageView> 


              </LinearLayout> 

              <!-- Second Slide --> 
              <LinearLayout android:layout_width="fill_parent" 
                  android:layout_height="fill_parent" 
                  android:gravity="center" 
                  android:orientation="vertical" > 


                <TextView android:id="@+id/title2" 
                   android:text="title2" 
                   android:textColor="#ffffff" 
                   android:layout_width="fill_parent" 
                   android:layout_height="wrap_content" 
                   android:gravity="center" 
                   android:layout_marginBottom="3dip" 
                   android:textSize="25dip" /> 


                <ImageView android:id="@+id/imagetwo" 
                   android:clickable="true" 
                   android:layout_width="wrap_content" 
                   android:layout_height="wrap_content" 
                   android:src="@drawable/sunnahsplash"> 
                </ImageView> 


              </LinearLayout> 



            </ViewFlipper> 





          <!-- footer --> 
          <LinearLayout android:id="@+id/LinearLayout03" 
              android:layout_height="wrap_content" 
              android:layout_width="wrap_content" 
              android:orientation="horizontal" 
              android:layout_gravity="center" 
              android:layout_marginTop="10dip"> 

              <Button android:id="@+id/Button02" 
                android:layout_height="wrap_content" 
                android:text="&lt;Previous" 
                android:textSize="18dip" 
                android:layout_width="wrap_content" 
                android:layout_gravity="center" 
                android:layout_marginRight="15dip" 
                android:padding="5dp" 
                android:background="@drawable/background_button_slider"></Button> 
              <Button android:id="@+id/Select" 
                android:text=" Select " 
                android:textSize="18dip" 
                android:layout_height="match_parent" 
                android:layout_width="wrap_content" 
                android:layout_gravity="center" 
                android:padding="5dp" 
                android:background="@drawable/background_button_slider"></Button> 
              <Button android:id="@+id/Button01" 
                android:text=" Next&gt;" 
                android:textSize="18dip" 
                android:layout_height="match_parent" 
                android:layout_width="wrap_content" 
                android:layout_gravity="center" 
                android:layout_marginLeft="15dip" 
                android:padding="5dp" 
                android:background="@drawable/background_button_slider"></Button> 
          </LinearLayout> 

        </LinearLayout> 

      </ScrollView> 


</LinearLayout> 
+0

Czy możesz przesłać swój plik xml układu? –

+0

dlaczego seryp słucha gest dla imageone, imagetwo itp? – pskink

+0

@AbhishekAgarwal: Edytowałem główny post i dodałem XML. Proszę sprawdź to. Dziękuję Ci. – Azhar92

Odpowiedz

6

Według mnie rzucać nie działa ze względu na widok przewijania .... Dodaj ten kod do klasy MainMenuSlider.

GestureDetector gestureDetector 
    = new GestureDetector(myGestureListener); 

    @Override 
    public boolean dispatchTouchEvent(MotionEvent e) 
    { 
     super.dispatchTouchEvent(e); 
     return gestureDetector.onTouchEvent(e); 
    } 

Mam edytowany kod klasy jako

 public class MainMenuSlider extends Activity implements OnClickListener{ 



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 ViewFlipper vf; 
private Animation animFlipInNext,animFlipOutNext, animFlipInPrevious, a nimFlipOutPrevious; 

private ImageView imageone; 

private ImageView imagetwo; 

public void onCreate(Bundle savedInstanceState) { 
super.onCreate(savedInstanceState); 

setContentView(R.layout.activity_main_menu_slider); 
//myGestureListener = new MyGestureListener(this); 

//vf for viewflipper 
vf=(ViewFlipper)findViewById(R.id.ViewFlipper01); 
animFlipInNext = AnimationUtils.loadAnimation(this, R.anim.flipinnext); 
animFlipOutNext = AnimationUtils.loadAnimation(this, R.anim.flipoutnext); 
animFlipInPrevious = AnimationUtils.loadAnimation(this, R.anim.flipinprevious); 
animFlipOutPrevious = AnimationUtils.loadAnimation(this, R.anim.flipoutprevious); 

imageone = (ImageView) findViewById(R.id.imageone); 
imagetwo = (ImageView) findViewById(R.id.imagetwo); 
imageone.setOnClickListener(myGestureListener); 
imagetwo.setOnClickListener(myGestureListener); 


} 

@Override 
public boolean onTouchEvent(MotionEvent event) { 
// TODO Auto-generated method stub 
return gestureDetector.onTouchEvent(event); 
    } 

SimpleOnGestureListener simpleOnGestureListener 
= new SimpleOnGestureListener(){ 

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

    float sensitvity = 50; 
    if((e1.getX() - e2.getX()) > sensitvity){ 
     vf.showPrevious(); 
    }else if((e2.getX() - e1.getX()) > sensitvity){ 
     vf.showNext(); 
    } 

    return true; 
} 

}; 

GestureDetector gestureDetector 
= new GestureDetector(simpleOnGestureListener); 
@Override 
public boolean dispatchTouchEvent(MotionEvent e) 
{ 
super.dispatchTouchEvent(e); 
return gestureDetector.onTouchEvent(e); 
} 
    public void onClick(View v) { 
// TODO Auto-generated method stub 
Toast.makeText(getApplicationContext(), "Hello",Toast.LENGTH_SHORT 
     ).show(); 
    } 

Ten kod działa poprawnie ..

+0

Usunąłem widok przewijania. Wciąż nie działa. – Azhar92

+0

czy wstawiłeś kod? –

+0

Daje mi błąd "Nie można rozwiązać" na gestDetector. Myślę, że tutaj gestDetector wydaje się być obiektem typu GestureDetector, ale nie ma go w mojej głównej klasie. Raczej istnieje GestureDetector w mojej klasie "MyGestureListener" (jeśli sprawdzasz kod) – Azhar92

1

Aby uchwycić dotykowe zdarzenia niepożądane inne niż kliknięć, trzeba użyć wykrywacza zwyczaj gest, być może podklasa Twojej aktywności, taka jak ta:

private class CustomGestureListener extends GestureDetector.SimpleOnGestureListener { 
    @Override  
    public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { 
     boolean usedThisFling = false; 

     // Is it horizontal? 
     if (Math.abs(velocityX) >= 2.0*Math.abs(velocityY)) { 
      if (velocityX < 0.0)  leftSwipeActions(); 
      else      rightSwipeActions(); 
      usedThisFling = true; 
     } 
     return usedThisFling; 
    } 

Następnie należy utworzyć instancję d i skonfigurowane do użycia w trybie onCreate():

// Create it. 
final GestureDetector myGestureListener = new GestureDetector(getApplicationContext(), new CustomGestureListener()); 

// Set it up for use: 
imageone.setOnTouchListener(new OnTouchListener() { 
    public boolean onTouch(View v, MotionEvent event) { 
     return myGestureListener.onTouchEvent(event); 
    } 
}); 

// And put an onClick method it to force it to work (this shouldn't be necessary but 
// it seems like sometimes it is) 
imageone.setOnClickListener(new OnClickListener() { 
    @Override 
    public void onClick(View v) { 
    } 
}); 
+0

Ale jaki jest związek między tym a działaniem OnFling()? – Azhar92

+0

odpowiedź zaktualizowana, aby pokazać link –

+0

Spróbuję Twojego rozwiązania i powiadomię Cię o tym – Azhar92

Powiązane problemy