android - 带手势检测器的 ImageSwitcher "fling"/"swipe"

标签 android swipe gesturedetector onfling imageswitcher

我正在尝试实现一个 ImageSwitcher 以移动到下一张图片。

单击“下一步”按钮时效果很好,但我无法让它与 fling 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;
      }
    }
  }

最佳答案

正如 Varun 所说,您必须将 GestureListener 设置为 View 。您还需要覆盖 GestureDetector 类上的 onSingleTapConfirmed 和 onDown 方法:

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;
   }
}

关于android - 带手势检测器的 ImageSwitcher "fling"/"swipe",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7387541/

相关文章:

javascript - Pubnub历史消息限制超过一百条

android - 我可以知道制造商配对的蓝牙设备型号吗?

android - 在android中以编程方式将屏幕设置为关闭

Android:如何在 Activity 之间制作动画?

android - 一个 OnGestureListener 对象可以处理两个 GestureDetector 对象吗?

java - Android java循环遍历对象列表

java - 如何使用appium水平滑动

android - Imageview动画从滑动手势开始

flutter - 如何在使用自定义画家制作绘图板时为 onPanEnd 赋予空值

java - 使用连接多个 View 的单个手势检测器获得双击/触摸 View