Sign Up

Sign Up to our social questions and Answers Engine to ask questions, answer people’s questions, and connect with other people.

Have an account? Sign In

Have an account? Sign In Now

Sign In

Login to our social questions & Answers Engine to ask questions answer people’s questions & connect with other people.

Sign Up Here

Forgot Password?

Don't have account, Sign Up Here

Forgot Password

Lost your password? Please enter your email address. You will receive a link and will create a new password via email.

Have an account? Sign In Now

You must login to ask a question.

Forgot Password?

Need An Account, Sign Up Here

Please briefly explain why you feel this question should be reported.

Please briefly explain why you feel this answer should be reported.

Please briefly explain why you feel this user should be reported.

Sign InSign Up

The Archive Base

The Archive Base Logo The Archive Base Logo

The Archive Base Navigation

  • SEARCH
  • Home
  • About Us
  • Blog
  • Contact Us
Search
Ask A Question

Mobile menu

Close
Ask a Question
  • Home
  • Add group
  • Groups page
  • Feed
  • User Profile
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Buy Points
  • Users
  • Help
  • Buy Theme
  • SEARCH
Home/ Questions/Q 9312913
In Process

The Archive Base Latest Questions

Editorial Team
  • 0
Editorial Team
Asked: June 19, 20262026-06-19T01:44:57+00:00 2026-06-19T01:44:57+00:00

The way the ViewPager scrolls right now is by one item per gesture. It

  • 0

The way the ViewPager scrolls right now is by one item per gesture. It treats flinging gesture the same way no matter if it’s full screen fast fling or slow dragging; at the end page advances one step only.

Is there any projects perhaps or examples that would add velocity-based flinging that scrolls multiple items based on velocity of the existing fling (if it still in progress) and scrolls further if the flinging gesture is wide and fast?

And if there’s none where to start with something like this?

P.S. The bounty is offered. Please no answers with references to Gallery or HorizontalScrollView

  • 1 1 Answer
  • 0 Views
  • 0 Followers
  • 0
Share
  • Facebook
  • Report

Leave an answer
Cancel reply

You must login to add an answer.

Forgot Password?

Need An Account, Sign Up Here

1 Answer

  • Voted
  • Oldest
  • Recent
  • Random
  1. Editorial Team
    Editorial Team
    2026-06-19T01:44:58+00:00Added an answer on June 19, 2026 at 1:44 am

    The technique here is to extends ViewPager and mimic most of what the pager will be doing internally, coupled with scrolling logic from the Gallery widget. The general idea is to monitor the fling (and velocity and accompanying scrolls) and then feed them in as fake drag events to the underlying ViewPager. If you do this alone, it won’t work though (you’ll still get only one page scroll). This happens because the fake drag implements caps on the bounds that the scroll will be effective. You can mimic the calculations in the extended ViewPager and detect when this will happen, then just flip the page and continue as usual. The benefit of using fake drag means you don’t have to deal with snapping to pages or handling the edges of the ViewPager.

    I tested the following code on the animation demos example, downloadable from http://developer.android.com/training/animation/screen-slide.html by replacing the ViewPager in ScreenSlideActivity with this VelocityViewPager (both in the layout activity_screen_slide and the field within the Activity).

    /*
     * Copyright 2012 The Android Open Source Project
     *
     * Licensed under the Apache License, Version 2.0 (the "License");
     * you may not use this file except in compliance with the License.
     * You may obtain a copy of the License at
     *
     *     http://www.apache.org/licenses/LICENSE-2.0
     *
     * Unless required by applicable law or agreed to in writing, software
     * distributed under the License is distributed on an "AS IS" BASIS,
     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     * See the License for the specific language governing permissions and 
     * limitations under the License.
     * 
     * Author: Dororo @ StackOverflow
     * An extended ViewPager which implements multiple page flinging.
     * 
     */
    
    package com.example.android.animationsdemo;
    
    import android.content.Context;
    import android.support.v4.view.ViewPager;
    import android.util.AttributeSet;
    import android.view.MotionEvent;
    import android.view.GestureDetector;
    import android.widget.Scroller;
    
    public class VelocityViewPager extends ViewPager implements GestureDetector.OnGestureListener {
    
    private GestureDetector mGestureDetector;
    private FlingRunnable mFlingRunnable = new FlingRunnable();
    private boolean mScrolling = false;
    
    public VelocityViewPager(Context context) {
        super(context);
    }
    
    public VelocityViewPager(Context context, AttributeSet attrs) {
        super(context, attrs);
        mGestureDetector = new GestureDetector(context, this);
    }
    
    // We have to intercept this touch event else fakeDrag functions won't work as it will
    // be in a real drag when we want to initialise the fake drag.
    @Override
    public boolean onInterceptTouchEvent(MotionEvent event) {
        return true;
    }
    
    @Override
    public boolean onTouchEvent(MotionEvent event) {
        // give all the events to the gesture detector. I'm returning true here so the viewpager doesn't
        // get any events at all, I'm sure you could adjust this to make that not true.
        mGestureDetector.onTouchEvent(event);
        return true;
    }
    
    @Override
    public boolean onFling(MotionEvent e1, MotionEvent e2, float velX, float velY) {
        mFlingRunnable.startUsingVelocity((int)velX);
        return false;
    }
    
    private void trackMotion(float distX) {
    
        // The following mimics the underlying calculations in ViewPager
        float scrollX = getScrollX() - distX;
        final int width = getWidth();
        final int widthWithMargin = width + this.getPageMargin();
        final float leftBound = Math.max(0, (this.getCurrentItem() - 1) * widthWithMargin);
        final float rightBound = Math.min(this.getCurrentItem() + 1, this.getAdapter().getCount() - 1) * widthWithMargin;
    
        if (scrollX < leftBound) {
            scrollX = leftBound;
            // Now we know that we've hit the bound, flip the page
            if (this.getCurrentItem() > 0) {
                this.setCurrentItem(this.getCurrentItem() - 1, false);
            }
        } 
        else if (scrollX > rightBound) {
            scrollX = rightBound;
            // Now we know that we've hit the bound, flip the page
            if (this.getCurrentItem() < (this.getAdapter().getCount() - 1) ) {
                this.setCurrentItem(this.getCurrentItem() + 1, false);
            }
        }
    
        // Do the fake dragging
        if (mScrolling) {
            this.fakeDragBy(distX);
        }
        else {
            this.beginFakeDrag();
            this.fakeDragBy(distX);
            mScrolling = true;
        }
    
    }
    
    private void endFlingMotion() {
        mScrolling = false;
        this.endFakeDrag();
    }
    
    // The fling runnable which moves the view pager and tracks decay
    private class FlingRunnable implements Runnable {
        private Scroller mScroller; // use this to store the points which will be used to create the scroll
        private int mLastFlingX;
    
        private FlingRunnable() {
            mScroller = new Scroller(getContext());
        }
    
        public void startUsingVelocity(int initialVel) {
            if (initialVel == 0) {
                // there is no velocity to fling!
                return;
            }
    
            removeCallbacks(this); // stop pending flings
    
            int initialX = initialVel < 0 ? Integer.MAX_VALUE : 0;
            mLastFlingX = initialX;
            // setup the scroller to calulate the new x positions based on the initial velocity. Impose no cap on the min/max x values.
            mScroller.fling(initialX, 0, initialVel, 0, 0, Integer.MAX_VALUE, 0, Integer.MAX_VALUE);
    
            post(this);
        }
    
        private void endFling() {
            mScroller.forceFinished(true);
            endFlingMotion();
        }
    
        @Override
        public void run() {
    
            final Scroller scroller = mScroller;
            boolean animationNotFinished = scroller.computeScrollOffset();
            final int x = scroller.getCurrX();
            int delta = x - mLastFlingX;
    
            trackMotion(delta); 
    
            if (animationNotFinished) {
                mLastFlingX = x;
                post(this);
            }
            else {
                endFling();
            }
    
        }
    }
    
    @Override
    public boolean onScroll(MotionEvent e1, MotionEvent e2, float distX, float distY) {
        trackMotion(-distX);
        return false;
    }
    
        // Unused Gesture Detector functions below
    
    @Override
    public boolean onDown(MotionEvent event) {
        return false;
    }
    
    @Override
    public void onLongPress(MotionEvent event) {
        // we don't want to do anything on a long press, though you should probably feed this to the page being long-pressed.
    }
    
    @Override
    public void onShowPress(MotionEvent event) {
        // we don't want to show any visual feedback
    }
    
    @Override
    public boolean onSingleTapUp(MotionEvent event) {
        // we don't want to snap to the next page on a tap so ignore this
        return false;
    }
    
    }
    

    There are a few minor issues with this, which can be resolved easily but I will leave up to you, namely things like if you scroll (dragging, not flinging) you can end up half way between pages (you’ll want to snap on the ACTION_UP event). Also, touch events are being completely overridden in order to do this, so you will need to feed relevant events to the underlying ViewPager where appropriate.

    • 0
    • Reply
    • Share
      Share
      • Share on Facebook
      • Share on Twitter
      • Share on LinkedIn
      • Share on WhatsApp
      • Report

Sidebar

Related Questions

Possible Duplicate: ViewPager and fragments — what's the right way to store fragment's state?
What is the best way to present a full screen picture gallery read from
Is there a way to add a viewpager as a listview item? I want
Is there any way to slow the scroll speed with the viewpager adaptor in
I have a screen which uses ViewPager + actionbar Sherlock tabs. I have a
I was looking for an effective way to implement gestures for ImageView with ViewPager
I have a ViewPager with three Fragments , each one shows a List (or
Possible Duplicate: gesture issue with mapview in viewpager page I use the template that
Is there a way to bypass the normal behavior of ViewPager and its offscreen
I have a viewpager including 3 pages. I set one viewgroup in each page

Explore

  • Home
  • Add group
  • Groups page
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Users
  • Help
  • SEARCH

Footer

© 2021 The Archive Base. All Rights Reserved
With Love by The Archive Base

Insert/edit link

Enter the destination URL

Or link to existing content

    No search term specified. Showing recent items. Search or use up and down arrow keys to select an item.