2

我有一个带有gridview 的日历,并且更改月份应该使用gridview 上的手势(甩动)。从左到右一甩到上个月,从右到左一甩到下个月。第一个有效,第二个并不总是有效,它检测到从左到右的翻转(40-50%)。我正在使用标准的联机功能,并且我还有另外两个带有箭头的按钮,表示更改月份的另一个选项。这些按钮工作得很好,如果我在 imageview 或 textview 或任何不是 gridview 的东西上使用 onfling 功能,它工作得很好。

    class MyGestureDetector extends SimpleOnGestureListener
    {
        private static final int SWIPE_MIN_DISTANCE = 40;
        private static final int SWIPE_MAX_OFF_PATH = 250;
        private static final int SWIPE_THRESHOLD_VELOCITY = 200;

        @Override
        public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY)
        {
            if (Math.abs(e1.getY() - e2.getY()) > SWIPE_MAX_OFF_PATH)
                return false;

            if (e1.getX() - e2.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY)
            {
                //Log.i("Swipe", "Right to Left");
                //Log.i("Swipe", "Swipe rowid2" + selected_row_id2 + "set to true");
                gestureDirection = "rtl";
                Toast toast = Toast.makeText(getApplicationContext(), "RTL", 3500);
                toast.show();
                return true;
            }
            else if (e2.getX() - e1.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY)
            {
                //Log.i("Swipe", "Left to Right");
                //Log.i("Swipe", "Swipe rowid" + selected_row_id2 + "set to false");
                gestureDirection = "ltr";
                Toast toast2 = Toast.makeText(getApplicationContext(), "LTR", 3500);
                toast2.show();
                return true;
            }
            return false;
        }
    }

正如我所提到的,它是一个标准的 onFLing 函数,但是从右到左的弹跳有时表现得好像我从左到右弹跳一样,而不是更改到下个月,而是回到上个月。这应该是不可能的,因为(e1.getX() - e2.getX())不应该允许这样做。我注意到如果我从右到左的投掷很短(但当然比 SWIPE_MIN_DISTANCE 大)它总是可以工作,但是例如如果我的投掷的大小几乎是 3/4 屏幕,它有时会表现不正确。另一个有趣的事情,它总是在模拟器上工作,在手机上检测到问题。有人遇到过这个问题吗?

4

0 回答 0