Gallery通过onFling设置滑动

设置滑动方法:

myGallery.onFling(null, null, -2000, 0);

第三个参数,数值是滑动距离
正数时:向左切换,
负数时:向右切换

看源码发现,除了第三个参数其他三个参数都无用

    @Override
    public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
        
        if (!mShouldCallbackDuringFling) {
            // We want to suppress selection changes
            
            // Remove any future code to set mSuppressSelectionChanged = false
            removeCallbacks(mDisableSuppressSelectionChangedRunnable);

            // This will get reset once we scroll into slots
            if (!mSuppressSelectionChanged) mSuppressSelectionChanged = true;
        }
        
        // Fling the gallery!
        mFlingRunnable.startUsingVelocity((int) -velocityX);
        
        return true;
    }

总结下,为什么其他三个参数无效

1.先说第四个参数

Gallery,第一句描述就是A view that shows items in a center-locked, horizontally scrolling list

翻译:一个锁定竖直方向,水平方向滑动的列表view

第四个参数是设置竖直方向滑动距离,不符合锁定竖直方向这一条。所以也没用了

2.第一和第二个参数:
首先onFling方法中最终执行的代码是下边这句,

 mFlingRunnable.startUsingVelocity((int) -velocityX);

源码中的startUsingVelocity方法

  		@UnsupportedAppUsage
        public void startUsingVelocity(int initialVelocity) {
            if (initialVelocity == 0) return;
            
            startCommon();
            
            int initialX = initialVelocity < 0 ? Integer.MAX_VALUE : 0;
            mLastFlingX = initialX;
            mScroller.fling(initialX, 0, initialVelocity, 0,
                    0, Integer.MAX_VALUE, 0, Integer.MAX_VALUE);
            post(this);
        }

这个方法里最终调用的是Scrollerfling方法

这里int initialX = initialVelocity < 0 ? Integer.MAX_VALUE : 0;

这里设置了起始位置,是最大值还是0,

所以不需要第一 第二个参数的MotionEvent, 来提供水平的位置信息,而竖直方向不能滑动,所以也不需要。

所以你要是使用GalleryonFling方法,只要传第三个参数就行了。

你可能感兴趣的:(学习总结)