2011-02-10 12 views
7

私は、SimpleOnGestureListenerを拡張するMyGestureDetectorを実装しています。私はこのクラスをhttp://www.codeshogun.com/blog/tag/view-flipper/から借りて、ViewFlipperでスワイプアクションを可能にしました。エミュレータで機能するかどうかはわかりません。助言がありますか?MyGestureDetector extends SimpleOnGestureListener

以下のすべてのコードは次のとおりです。

main.java

import android.app.Activity; 
import android.os.Bundle; 
import android.view.GestureDetector; 
import android.view.KeyEvent; 
import android.view.MotionEvent;import android.view.View; 
import android.view.GestureDetector.SimpleOnGestureListener; 
import android.view.animation.Animation; 
import android.view.animation.AnimationUtils; 
import android.webkit.WebView; 
import android.widget.ViewFlipper; 


public class main extends Activity { 

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; 
View.OnTouchListener gestureListener; 
private Animation slideLeftIn; 
private Animation slideLeftOut; 
private Animation slideRightIn; 
private Animation slideRightOut; 
private ViewFlipper viewFlipper; 

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

    // ---------------------------------Sets Swipe Animation to Next View -->  
    viewFlipper = (ViewFlipper)findViewById(R.id.AC4313); 
    slideLeftIn = AnimationUtils.loadAnimation(this, R.anim.slide_left_in); 
    slideLeftOut = AnimationUtils.loadAnimation(this, R.anim.slide_left_out); 
    slideRightIn = AnimationUtils.loadAnimation(this, R.anim.slide_right_in); 
    slideRightOut = AnimationUtils.loadAnimation(this, R.anim.slide_right_out); 

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

class MyGestureDetector extends SimpleOnGestureListener { 
    @Override 
    public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,float velocityY) { 
     try { 
      if (Math.abs(e1.getY() - e2.getY()) > SWIPE_MAX_OFF_PATH) 
       return false; 
      // right to left swipe 
      if(e1.getX() - e2.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) { 
       viewFlipper.setInAnimation(slideLeftIn); 
       viewFlipper.setOutAnimation(slideLeftOut); 
       viewFlipper.showNext(); 
      } else if (e2.getX() - e1.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) { 
       viewFlipper.setInAnimation(slideRightIn); 
       viewFlipper.setOutAnimation(slideRightOut); 
       viewFlipper.showPrevious(); 
      } 
     } catch (Exception e) { 
      // nothing 
     } 
     return false; 
    } 
}  

@Override // ------------------------------ Catch the Gesture Event by Overriding onTouch() method: --> 
public boolean onTouchEvent(MotionEvent event) { 
    if (gestureDetector.onTouchEvent(event)) 
     return true; 
    else 
     return false; 
} 

アニメーションの* .xmlを者:

<?xml version="1.0" encoding="utf-8"?> 

<set xmlns:android="http://schemas.android.com/apk/res/android"> 
    <translate android:fromXDelta="100%p" android:toXDelta="0" android:duration="800"/> 
</set> 
+2

行動は何ですか? –

+0

FWIW、私は既に 'GestureDetector'を介してスワイプサポート付きの' ViewFlipper'を実装しました:https://github.com/commonsguy/cwac-viewswiper – CommonsWare

+0

あなたはデバイスでそれを試しましたか?私は、エミュレータがflingsを処理できるかどうかはわかりません。このコードは私の使っているものと同じように見えますが、あなたがリンクしたのと同じウェブサイトに基づいています。実際のデバイスではうまく動作しますが、エミュレータでテストしたことはありません。 – FoamyGuy

答えて

11

私はこの問題は、あなたがオーバーライドしないということだと思いますOnDownイベント。このコードスニペットをMyGestureDetectorクラスに追加してください。

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

onDownイベントは、デフォルトではfalseを返し、すべてのジェスチャーをので、あなたのonFlingイベントは発生しませんonDownで始まります。あなたは今、このように、ジェスチャーの検出器を使用してはるかに少ないコードでこの問題を解決することができるように

イシュトヴァーン

2

は思え:

import android.content.Context; 
import android.util.AttributeSet; 
import android.view.GestureDetector; 
import android.view.MotionEvent; 
import android.view.View; 
import android.widget.GridView; 

public class ScrollingGridView extends GridView { 
    private GestureDetector gestureDetector; 

    public ScrollingGridView(Context context, AttributeSet attrs) { 
     this(context, attrs, 0); 
    } 

    public ScrollingGridView(Context context, AttributeSet attrs, int defStyle) { 
     super(context, attrs, defStyle); 
     setupGestureListener(); 
    } 

    private void setupGestureListener() { 
     GestureDetector.SimpleOnGestureListener gestureListener = new GestureDetector.SimpleOnGestureListener() { 
      @Override 
      public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) { 
       scrollBy((int)distanceX, (int)distanceY); 
       return true; 
      } 
     }; 
     gestureDetector = new GestureDetector(getContext(), gestureListener); 
     setOnTouchListener(new OnTouchListener() { 
      @Override 
      public boolean onTouch(View view, MotionEvent motionEvent) { 
       gestureDetector.onTouchEvent(motionEvent); 
       return true; 
      } 
     }); 
    } 
} 
関連する問題