2011-09-12 38 views
1

我想實現一個ImageSwitcher移到下一個圖像的一甩。ImageSwitcher與手勢檢測器「一扔」/「刷卡」

它點擊「下一步」按鈕時效果很好,但我無法讓它與一觸即發的GestureDetector配合使用。

基本上我已經在onFling中實現了與onClick相同的代碼。

onClick作品,onfling沒有。

這是代碼。

public class FlipActivity extends Activity { 

private int index; 

private Button nextButton; 

private Animation in; 
private Animation out; 

private ImageSwitcher questionImageSwitcher; 

private Drawable image; 

private String subjectArray[] = { "1", "2", "3", "4"}; 

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; 

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

    index = 0; 

    in = AnimationUtils.loadAnimation(this, 
      android.R.anim.fade_in); 

    out = AnimationUtils.loadAnimation(this, 
      android.R.anim.fade_out); 

    // Set up Image Switcher 
    questionImageSwitcher = (ImageSwitcher) findViewById(R.id.ImageSwitcher_QuestionImage); 
    questionImageSwitcher.setInAnimation(in); 
    questionImageSwitcher.setOutAnimation(out); 
    questionImageSwitcher.setFactory(new MyImageSwitcherFactory()); 


    image = getQuestionImageDrawableXML(subjectArray[index]); 

    questionImageSwitcher.setImageDrawable(image);  

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


    nextButton = (Button) findViewById(R.id.next); 
    nextButton.setOnClickListener(new OnClickListener() { 

     public void onClick(View v) { 
      index = index + 1; 

       image = getQuestionImageDrawableXML(subjectArray[index]); 
       questionImageSwitcher.setImageDrawable(image); 

     } 
    }); 

} // end onCreate 

private class MyImageSwitcherFactory implements ViewSwitcher.ViewFactory { 
    public View makeView() { 
     ImageView imageView = new ImageView(FlipActivity.this); 
     imageView.setScaleType(ImageView.ScaleType.FIT_CENTER); 
     imageView.setLayoutParams(new ImageSwitcher.LayoutParams(
       LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT)); 
     return imageView; 
    } 
} 

private Drawable getQuestionImageDrawableXML(String questionNumber) { 

    String uri = "img" + questionNumber; 

    int imageResource = getResources().getIdentifier(uri, "drawable", 
      getPackageName()); 

    Drawable image = getResources().getDrawable(imageResource); 
    return image; 
} 


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) { 

       questionImageSwitcher.setInAnimation(in); 
       questionImageSwitcher.setOutAnimation(out); 
       questionImageSwitcher.setFactory(new MyImageSwitcherFactory()); 


       index = index + 1; 

       image = getQuestionImageDrawableXML(subjectArray[index]); 
        questionImageSwitcher.setImageDrawable(image); 

      } 

     } catch (Exception e) { 
      // nothing 
     } 
     return false; 
     } 
    } 
    } 
+1

你在哪裏的GestureListener設爲看法?我沒有看到代碼的那一部分。我只能看到你設置了一個點擊監聽器。 – Varun

+0

謝謝Varun。我想這就是問題所在。 我現在用這個,但仍然沒有工作... questionImageSwitcher.setOnTouchListener(新View.OnTouchListener(){ @覆蓋 公共布爾onTouch(視圖V,MotionEvent事件){ 如果(gestureDetector.onTouchEvent (事件)){ return true; } return false; } }); – user885483

+1

刪除'onClickListener'並再次檢查。 – Varun

回答

1

由於Varun說您必須將GestureListener設置爲視圖。您還需要重寫onSingleTapConfirmed和onDown方法您GestureDetector類:

class MyGestureDetector extends SimpleOnGestureListener { 

    @Override 
    public boolean onSingleTapConfirmed(MotionEvent e) 
    {    
    return super.onSingleTapConfirmed(e); 
    } 

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

    @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) { 

      questionImageSwitcher.setInAnimation(in); 
      questionImageSwitcher.setOutAnimation(out); 
      questionImageSwitcher.setFactory(new MyImageSwitcherFactory()); 


      index = index + 1; 

      image = getQuestionImageDrawableXML(subjectArray[index]); 
       questionImageSwitcher.setImageDrawable(image); 

      } 

     } catch (Exception e) { 
      // nothing 
     } 
     return false; 
    } 
}