2

我有一个 ViewFlipper,它包含一个 ImageView。我希望能够滑动以更改图像/视图,然后单击图像以播放声音。

我有一个 GestureDetector 正在处理 OnFling 以更改视图。我试图将一个 onClickListener 放到 imageview 中,它工作但停止了 OnFling 工作。

最后,我在 GestureDetector 中添加了一个 onSingleTapConfirmed。这行得通,但是它在 Activity 中的任何位置注册点击,而不仅仅是 ImageView。

谁能建议如何缩小 onSingleTapConfirmed 的范围以仅在 Imageview 上工作?

到目前为止,这是我的代码:

 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) {
                Log.v("Swipe", "Right to Left");

                viewFlipper.setInAnimation(slideLeftIn);
                viewFlipper.setOutAnimation(slideLeftOut);
                viewFlipper.addView(nextImage(true));

                viewFlipper.showNext();

            }  else if (e2.getX() - e1.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) {
                Log.v("Swipe", "Left to Right");

                viewFlipper.setInAnimation(slideRightIn);
                viewFlipper.setOutAnimation(slideRightOut);
                viewFlipper.addView(nextImage(false));
                viewFlipper.showNext();
            }
        } catch (Exception e) {
            // nothing
        }
        return false;
    }

    @Override
    public boolean onSingleTapConfirmed(MotionEvent e)
    {
        // TODO Auto-generated method stub

        Log.v("SingleTap", "OnSingleTapConfirmed Run");

        return super.onSingleTapConfirmed(e);   

    }    

}

private View nextImage(boolean righttoleft) {
    ImageView imgv1 = new ImageView(this);

    if(righttoleft == true)
    {

            Uri image = Uri.parse("android.resource://com.owentech.brainybaby/drawable/" + variables.letters[variables.currentpos]);
            imgv1.setImageURI(image);
            imgv1.setScaleType(ImageView.ScaleType.CENTER_INSIDE);

    return imgv1;
}
4

1 回答 1

3

我过去遇到过这个问题。

也许您可以尝试通过将 OnTouchListener 设置为 ViewFlipper 来实现单击,因此 ViewFlipper 将是唯一的触摸事件接收器。然后在 onTouch 函数中编写播放声音的代码。最后,为了保持 onFling 正常工作,将 onTouch 函数的返回值设置为 false。

viewFlipper.setOnTouchListener(new OnTouchListener()
{
      @Override
      public boolean onTouch(View view, MotionEvent e) {
          // TODO Auto-generated method stub
          switch(e.getActionMasked())
          {
             case MotionEvent.ACTION_DOWN:
                  //put the playing sound code here.
                  break;
          }
          return false;  //means that the listener dosen't consume the event
      }
}
);

这只是解决此问题的简单解决方案。如果你想实现更复杂的功能,比如手指在屏幕上滑动改变视图时避免播放声音,你必须花更多的精力来区分手势,例如计算ACTION_DOWN事件和ACTION_UP事件之间的时间并播放声音如果它小于 300 毫秒。

我希望这对你有帮助。:)

于 2011-07-01T04:17:49.203 回答