Как автоматически переключаться между страницами viewPager

У меня есть приложение для Android, в котором используется ViewPager с двумя страницами. Когда действие сначала отображается, я хотел бы представить каждую страницу по очереди пользователю, чтобы они знали, что могут переключаться между двумя представлениями. Мне не удалось найти какие-либо документы, описывающие, как это сделать. Я обнаружил PageTransformations, которые звучали многообещающе, но пользователь должен сначала провести пальцем по экрану. Мне нужно, чтобы мои две страницы автоматически прокручивались, как только отображается первая страница в ViewPager. как добиться желаемого результата?


person Hector    schedule 12.07.2013    source источник
comment
вы можете использовать таймер для выполнения this.set продолжительности, которую вы хотите, и viewPager.setCurrentItem(position).explain больше, чтобы я мог помочь.   -  person TheFlash    schedule 12.07.2013
comment
Имейте viewpager с двумя страницами, например. Левая и правая страница. только когда viewpager сначала отображает, я хотел бы эту последовательность событий. а). изначально отображать правую страницу. б). плавная прокрутка до левой страницы. Если возможно, добавьте плавную анимацию удара или выброса в конце плавной прокрутки.   -  person Hector    schedule 12.07.2013
comment
ждите меня, я буду публиковать код для этого.   -  person Shajeel Afzal    schedule 12.07.2013


Ответы (8)


Вы можете использовать Timer для этой цели. Следующий код говорит сам за себя:

// ---------------------------------------------------------------------------

Timer timer;
int page = 1;

public void pageSwitcher(int seconds) {
    timer = new Timer(); // At this line a new Thread will be created
    timer.scheduleAtFixedRate(new RemindTask(), 0, seconds * 1000); // delay
                                                                    // in
    // milliseconds
}

    // this is an inner class...
class RemindTask extends TimerTask {

    @Override
    public void run() {

        // As the TimerTask run on a seprate thread from UI thread we have
        // to call runOnUiThread to do work on UI thread.
        runOnUiThread(new Runnable() {
            public void run() {

                if (page > 4) { // In my case the number of pages are 5
                    timer.cancel();
                    // Showing a toast for just testing purpose
                    Toast.makeText(getApplicationContext(), "Timer stoped",
                            Toast.LENGTH_LONG).show();
                } else {
                    mViewPager.setCurrentItem(page++);
                }
            }
        });

    }
}

// ---------------------------------------------------------------------------

Примечание 1. Убедитесь, что вы вызываете метод pageSwitcher после правильной настройки adapter в методе viewPager внутри onCreate вашего действия.

Примечание 2. viewPager будет смахивать каждый раз, когда вы его запускаете. Вы должны обработать его так, чтобы он прокручивал все страницы только один раз (когда пользователь просматривает viewPager в первый раз)

Примечание 3. Если вы хотите дополнительно замедлить скорость прокрутки viewPager, вы можете следовать этому ответу на StackOverflow. .


Пишите в комментариях, если это не помогло вам...

person Shajeel Afzal    schedule 12.07.2013
comment
спасибо за ваше предложение. я изменил ваш код, так как мне нужна была задержка перед переходом, однако переход все еще очень быстрый! я бы подумал, что смогу исправить этот ViewPager.PageTransformer. - person Hector; 12.07.2013
comment
@ user423199 Итак, вы имеете в виду, что это все еще не решило вашу проблему? - person Shajeel Afzal; 12.07.2013
comment
это решает половину моей проблемы. что до сих пор не решено, так это то, что с помощью setCurrentItem страницы переключаются слишком быстро, я бы хотел, чтобы они медленнее прокручивались с левой страницы на правую страницу - person Hector; 12.07.2013
comment
Я надеюсь, что этот ответ поможет вам в этом: stackoverflow.com/a/9731345/1773155 - person Shajeel Afzal; 12.07.2013
comment
да, спасибо, я только что добавил этот код в свое приложение, и он отлично работает, к сожалению, хотя для этого требуется минимальный SDK 11, а мне нужно использовать минимальный SDK 8 - person Hector; 12.07.2013
comment
Таким образом, вам не следует менять свою minSdk версию на 11, вы должны изменить свой код, чтобы на более ранних версиях, чем 11, скорость оставалась по умолчанию, а на SDK 11 и выше вы должны применить этот хак... - person Shajeel Afzal; 12.07.2013
comment
ПОКАЖИТЕ МНЕ МАСЛО! - одна вещь, которая расстраивает, это то, что начальная анимация работает НЕ МАСЛЯНО, это ДЖАНКИ! Я не уверен, почему это так, поскольку последующие прокрутки (запущенные вручную, проводя пальцем) всегда плавные - person Hector; 12.07.2013
comment
Вы имели в виду, что когда вы вручную прокручиваете страницу просмотра, она теперь прокручивается медленно? - person Shajeel Afzal; 12.07.2013
comment
да, установив взломанный скроллер, связанный с просмотрщиком в моем onCreate(), любые ручные прокрутки идеальны как по скорости перехода, так и по плавности движения. однако автоматическая прокрутка при первом отображении экрана дергается - person Hector; 12.07.2013
comment
Я думаю, что после первого отображения viewPager пользователю, использующему хак, вы должны вернуть viewPager по умолчанию. - person Shajeel Afzal; 12.07.2013
comment
давайте продолжим это обсуждение в чате - person Shajeel Afzal; 12.07.2013
comment
Если кому-то нужно бесконечно перебирать заголовки, просто выполните viewPager.setCurrentItem( (viewPager.getCurrentItem() + 1) % (viewPager.getChildCount() + 1) ); - person Bitcoin Cash - ADA enthusiast; 30.01.2014
comment
@ShajeelAfzal привет. остановится ли таймер автоматически, когда пользователь откроет новый фрагмент? - person Lendl Leyba; 23.04.2015
comment
Привет @LeiLeyba, это зависит от того, как вы открываете новый фрагмент. Я думаю, вы должны заменить фрагменты. Покажите нам код, который вы пытаетесь. - person Shajeel Afzal; 23.04.2015
comment
Да, я использую замену. Так что это означает, что я хорошо с кодом. Правильно? - person Lendl Leyba; 23.04.2015
comment
Да, вы должны быть, вы можете убедиться в этом, показав метод входа в систему onDestroy вашего фрагмента. - person Shajeel Afzal; 23.04.2015
comment
Это приводит к утечке памяти. - person Clive Jefferies; 12.06.2015
comment
@CliveJefferies, пожалуйста, уточните и предложите свое решение. - person Shajeel Afzal; 12.06.2015
comment
При поиске утечек памяти в приложении, над которым я работаю, это было довольно серьезным нарушением из-за использования TimerTask. Вот дальнейшее объяснение: mopri.de/2010/timertask-bad-do-it-the-android-way-use-a-handler - person Clive Jefferies; 15.06.2015
comment
Если вам нужна плавная прокрутка, вы можете просто использовать другую реализацию метода setCurrentItem, подобную этой: mViewPager.setCurrentItem(page++, true); //где второй параметр, который имеет значение true, предназначен для smoothScroll - person Shubhral; 03.06.2016

Вопрос старый, но я надеюсь, что он кому-то поможет Мое решение с использованием Runnable

Короткий ответ

Runnable runnable = new Runnable() {
    public void run() {
        if (myAdapter.getCount() == page) {
            page = 0;
        } else {
            page++;
        }
        viewPager.setCurrentItem(page, true);
        handler.postDelayed(this, delay);
    }
};

Длинный ответ Использование в действии

public class activity extends AppCompatActivity {

    private Handler handler;
    private int delay = 5000; //milliseconds
    private ViewPager viewPager;
    private int page = 0;
    private MyAdapter myAdapter;
    Runnable runnable = new Runnable() {
        public void run() {
            if (myAdapter.getCount() == page) {
                page = 0;
            } else {
                page++;
            }
            viewPager.setCurrentItem(page, true);
            handler.postDelayed(this, delay);
        }
    };

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        handler = new Handler();
        viewPager = (ViewPager) findViewById(R.id.viewPager);
        myAdapter = new MyAdapter(getSupportFragmentManager());
        viewPager.setAdapter(myAdapter);
        viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
            @Override
            public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {

            }

            @Override
            public void onPageSelected(int position) {
                page = position;
            }

            @Override
            public void onPageScrollStateChanged(int state) {

            }
        });
    }

    @Override
    protected void onResume() {
        super.onResume();
        handler.postDelayed(runnable, delay);
    }

    @Override
    protected void onPause() {
        super.onPause();
        handler.removeCallbacks(runnable);
    }
}
person Luciano Marqueto    schedule 24.06.2016
comment
сработало отлично, спасибо за лучшее и простое решение. - person Kapil Rajput; 17.04.2017

Я создал проект с открытым исходным кодом на github, который реализует автоматическую прокрутку ViewPager. Пример диаграммы ниже: auto srcoll viewPager

использовать

<cn.trinea.android.view.autoscrollviewpager.AutoScrollViewPager
    android:id="@+id/view_pager"
    android:layout_width="match_parent"
    android:layout_height="wrap_content" />

заменять

<android.support.v4.view.ViewPager
    android:id="@+id/view_pager"
    android:layout_width="match_parent"
    android:layout_height="wrap_content" />

вызовите startAutoScroll(), чтобы запустить автоматическую прокрутку.

stopAutoScroll(), чтобы остановить автоматическую прокрутку.

Подробнее: https://github.com/Trinea/android-auto-scroll-view-pager

person Trinea    schedule 28.02.2014
comment
Почти дубликат вашего ответа. Прекратите публиковать повторяющийся ответ, вместо этого опубликуйте один и дайте ссылку на опубликованный ответ здесь для справки. - person Paresh Mayani; 28.02.2014
comment
@Trinea Вам нужно проделать больше работы в onMeasure или где-то еще, где вы могли бы измерить размер детей. Если я хочу дать оберточный контент, ваш код не работает. поэтому я должен установить ширину и высоту в коде во время выполнения, что действительно больно в заднице. - person AZ_; 19.03.2014
comment
@AZ_ Я думаю, вы использовали ViewPager в ScrollView, вам следует добавить свойство android:fillViewport=true для просмотра прокрутки. stackoverflow.com/questions/9034030/viewpager-in-scrollview - person Trinea; 20.03.2014
comment
@Trinea Нет, дорогой, я использую его в com.handmark.pulltorefresh.library.PullToRefreshGridView github.com/chrisbanes/ Android-PullToRefresh - person AZ_; 21.03.2014
comment
@AZ_, вы можете проверить с помощью android.support.v4.view.ViewPager, существует ли эта проблема? - person Trinea; 21.03.2014
comment
Да, потому что вы не измеряете размер его дочерних элементов в onMeasure, поэтому мне приходится вручную переопределять добавленный макет ImagePagerAdapter instanceiateItem в изображение, а затем также устанавливать размер viewpager во время выполнения. @см. youtube.com/watch?v=NYtB6mlu7vA - person AZ_; 21.03.2014
comment
Кроме того, если вы видите свою демонстрацию, если вы нажмете пальцем на изображение пейджера просмотра, оно ничего не покажет и изменит изображение на 4/4, даже если вы находитесь на изображении 1/4. посмотрите демонстрацию, нажмите на изображение, отображаемое в пейджере с автоматическим просмотром - person AZ_; 21.03.2014
comment
@AZ_ да, есть какая-то ошибка, когда viewPager.setSlideBorderMode(AutoScrollViewPager.SLIDE_BORDER_MODE_CYCLE); У меня нет времени, чтобы исправить это сейчас, у вас есть какие-либо идеи? - person Trinea; 21.03.2014
comment
@Trinea Я исправлю это и отправлю тебе, но позже, дорогая. На самом деле мы используем viewpager для какой-то другой цели, для которой он не предназначен. Я прочитаю весь исходный код Google Native viewpager, а затем смогу вам что-то предложить. - person AZ_; 23.03.2014
comment
@AZ_ Отлично! Вы можете сделать коммит непосредственно на Github github.com/Trinea/android-auto-scroll- пейджер просмотра - person Trinea; 24.03.2014
comment
Пожалуйста, не используйте изображения сексуального характера в своей демонстрации. - person FindOut_Quran; 24.10.2015

Вот пейджер с автопрокруткой

package com.otapp.net.view;

import android.content.Context;
import android.os.Handler;
import android.os.Message;
import android.support.v4.view.MotionEventCompat;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.animation.Interpolator;
import android.widget.Scroller;

import java.lang.ref.WeakReference;
import java.lang.reflect.Field;

public class AutoScrollViewPager extends ViewPager {

    public static final int DEFAULT_INTERVAL = 1500;

    public static final int LEFT = 0;
    public static final int RIGHT = 1;

    public static final int SLIDE_BORDER_MODE_NONE = 0;
    public static final int SLIDE_BORDER_MODE_CYCLE = 1;
    public static final int SLIDE_BORDER_MODE_TO_PARENT = 2;

    private long interval = DEFAULT_INTERVAL;
    private int direction = RIGHT;
    private boolean isCycle = true;
    private boolean stopScrollWhenTouch = true;
    private int slideBorderMode = SLIDE_BORDER_MODE_NONE;
    private boolean isBorderAnimation = true;
    private double autoScrollFactor = 1.0;
    private double swipeScrollFactor = 1.0;

    private Handler handler;
    private boolean isAutoScroll = false;
    private boolean isStopByTouch = false;
    private float touchX = 0f, downX = 0f;
    private float touchY = 0f;

    private CustomDurationScroller scroller = null;

    public static final int SCROLL_WHAT = 0;

    public AutoScrollViewPager(Context paramContext) {
        super(paramContext);
        init();
    }

    public AutoScrollViewPager(Context paramContext, AttributeSet paramAttributeSet) {
        super(paramContext, paramAttributeSet);
        init();
    }

    private void init() {
        handler = new MyHandler(this);
        setViewPagerScroller();
    }

    /**
     * start auto scroll, first scroll delay time is {@link #getInterval()}
     */
    public void startAutoScroll() {
        isAutoScroll = true;
        sendScrollMessage((long) (interval + scroller.getDuration() / autoScrollFactor * swipeScrollFactor));
    }

    /**
     * start auto scroll
     *
     * @param delayTimeInMills first scroll delay time
     */
    public void startAutoScroll(int delayTimeInMills) {
        isAutoScroll = true;
        sendScrollMessage(delayTimeInMills);
    }

    /**
     * stop auto scroll
     */
    public void stopAutoScroll() {
        isAutoScroll = false;
        handler.removeMessages(SCROLL_WHAT);
    }

    /**
     * set the factor by which the duration of sliding animation will change while swiping
     */
    public void setSwipeScrollDurationFactor(double scrollFactor) {
        swipeScrollFactor = scrollFactor;
    }

    /**
     * set the factor by which the duration of sliding animation will change while auto scrolling
     */
    public void setAutoScrollDurationFactor(double scrollFactor) {
        autoScrollFactor = scrollFactor;
    }

    private void sendScrollMessage(long delayTimeInMills) {
        /** remove messages before, keeps one message is running at most **/
        handler.removeMessages(SCROLL_WHAT);
        handler.sendEmptyMessageDelayed(SCROLL_WHAT, delayTimeInMills);
    }

    /**
     * set ViewPager scroller to change animation duration when sliding
     */
    private void setViewPagerScroller() {
        try {
            Field scrollerField = ViewPager.class.getDeclaredField("mScroller");
            scrollerField.setAccessible(true);
            Field interpolatorField = ViewPager.class.getDeclaredField("sInterpolator");
            interpolatorField.setAccessible(true);

            scroller = new CustomDurationScroller(getContext(), (Interpolator) interpolatorField.get(null));
            scrollerField.set(this, scroller);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * scroll only once
     */
    public void scrollOnce() {
        PagerAdapter adapter = getAdapter();
        int currentItem = getCurrentItem();
        int totalCount;
        if (adapter == null || (totalCount = adapter.getCount()) <= 1) {
            return;
        }

        int nextItem = (direction == LEFT) ? --currentItem : ++currentItem;
        if (nextItem < 0) {
            if (isCycle) {
                setCurrentItem(totalCount - 1, isBorderAnimation);
            }
        } else if (nextItem == totalCount) {
            if (isCycle) {
                setCurrentItem(0, isBorderAnimation);
            }
        } else {
            setCurrentItem(nextItem, true);
        }
    }

    /**
     * <ul>
     * if stopScrollWhenTouch is true
     * <li>if event is down, stop auto scroll.</li>
     * <li>if event is up, start auto scroll again.</li>
     * </ul>
     */

    boolean consumeTouch = false;

    @Override
    public boolean dispatchTouchEvent(MotionEvent ev) {
        int action = MotionEventCompat.getActionMasked(ev);

        if (stopScrollWhenTouch) {
            if ((action == MotionEvent.ACTION_DOWN) && isAutoScroll) {
                isStopByTouch = true;
                stopAutoScroll();
            } else if (ev.getAction() == MotionEvent.ACTION_UP && isStopByTouch) {
                startAutoScroll();
            }
        }

        if (slideBorderMode == SLIDE_BORDER_MODE_TO_PARENT || slideBorderMode == SLIDE_BORDER_MODE_CYCLE) {
            touchX = ev.getX();
            if (ev.getAction() == MotionEvent.ACTION_DOWN) {
                downX = touchX;
                touchY = ev.getY();
            } else if (action == MotionEvent.ACTION_UP) {
                consumeTouch = Math.abs(touchY - ev.getY()) > 0;
            }

            int currentItem = getCurrentItem();
            PagerAdapter adapter = getAdapter();
            int pageCount = adapter == null ? 0 : adapter.getCount();
            /**
             * current index is first one and slide to right or current index is last one and slide to left.<br/>
             * if slide border mode is to parent, then requestDisallowInterceptTouchEvent false.<br/>
             * else scroll to last one when current item is first one, scroll to first one when current item is last
             * one.
             */
            if ((currentItem == 0 && downX <= touchX) || (currentItem == pageCount - 1 && downX >= touchX)) {
                if (slideBorderMode == SLIDE_BORDER_MODE_TO_PARENT) {
                    getParent().requestDisallowInterceptTouchEvent(false);
                } else {
                    if (pageCount > 1) {
                        setCurrentItem(pageCount - currentItem - 1, isBorderAnimation);
                    }
                    getParent().requestDisallowInterceptTouchEvent(true);
                }
                return super.dispatchTouchEvent(ev);
            }
        }
        if (consumeTouch) {
            getParent().requestDisallowInterceptTouchEvent(true);
        } else {
            getParent().requestDisallowInterceptTouchEvent(false);
            if (stopScrollWhenTouch)
                startAutoScroll();
        }

        return super.dispatchTouchEvent(ev);
    }

    private static class MyHandler extends Handler {

        private final WeakReference<AutoScrollViewPager> autoScrollViewPager;

        public MyHandler(AutoScrollViewPager autoScrollViewPager) {
            this.autoScrollViewPager = new WeakReference<AutoScrollViewPager>(autoScrollViewPager);
        }

        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);

            switch (msg.what) {
                case SCROLL_WHAT:
                    AutoScrollViewPager pager = this.autoScrollViewPager.get();
                    if (pager != null) {
                        pager.scroller.setScrollDurationFactor(pager.autoScrollFactor);
                        pager.scrollOnce();
                        pager.scroller.setScrollDurationFactor(pager.swipeScrollFactor);
                        pager.sendScrollMessage(pager.interval + pager.scroller.getDuration());
                    }
                default:
                    break;
            }
        }
    }

    public long getInterval() {
        return interval;
    }

    public void setInterval(long interval) {
        this.interval = interval;
    }

    public int getDirection() {
        return (direction == LEFT) ? LEFT : RIGHT;
    }

    public void setDirection(int direction) {
        this.direction = direction;
    }

    public boolean isCycle() {
        return isCycle;
    }

    public void setCycle(boolean isCycle) {
        this.isCycle = isCycle;
    }

    public boolean isStopScrollWhenTouch() {
        return stopScrollWhenTouch;
    }

    public void setStopScrollWhenTouch(boolean stopScrollWhenTouch) {
        this.stopScrollWhenTouch = stopScrollWhenTouch;
    }

    public int getSlideBorderMode() {
        return slideBorderMode;
    }

    public void setSlideBorderMode(int slideBorderMode) {
        this.slideBorderMode = slideBorderMode;
    }

    public boolean isBorderAnimation() {
        return isBorderAnimation;
    }

    public void setBorderAnimation(boolean isBorderAnimation) {
        this.isBorderAnimation = isBorderAnimation;
    }

    public class CustomDurationScroller extends Scroller {

        private double scrollFactor = 1;

        public CustomDurationScroller(Context context) {
            super(context);
        }

        public CustomDurationScroller(Context context, Interpolator interpolator) {
            super(context, interpolator);
        }

        // @SuppressLint("NewApi")
        // public CustomDurationScroller(Context context, Interpolator interpolator, boolean flywheel){
        // super(context, interpolator, flywheel);
        // }

        public void setScrollDurationFactor(double scrollFactor) {
            this.scrollFactor = scrollFactor;
        }

        @Override
        public void startScroll(int startX, int startY, int dx, int dy, int duration) {
            super.startScroll(startX, startY, dx, dy, (int) (duration * scrollFactor));
        }
    }

}

Вот реализация xml

Вот реализация файла класса

 MovieFeaturedAdapter mMovieFeaturedAdapter = new MovieFeaturedAdapter(getActivity(), mCurrentMovies);
                    vpFeatured.setAdapter(mMovieFeaturedAdapter);
person Jitendra ramoliya    schedule 16.04.2019

Ниже метод используется для автоматического переключения страниц через некоторое время (вы можете изменить время в соответствии с вашими требованиями)

 private void timer() {
                timer = new Timer();
                timer.scheduleAtFixedRate(new TimerTask() {
                    @Override
                    public void run() {
                        runOnUiThread(new Runnable() {
                            @Override
                            public void run() {
                                if (currentPage == NUM_PAGES - 1) {
                                    currentPage = 0;
                                }
                                view.setCurrentItem(currentPage++, true);
                            }
                        });
                    }
                }, 500, 5000);
            }

если вы хотите, чтобы бесконечная прокрутка в viewpager использовала класс viewpager с бесконечной прокруткой по приведенной ниже ссылке, и внесите незначительные изменения (удалить условие) в интерфейсе Runnable.

runOnUiThread(new Runnable() {
                                @Override
                                public void run() {

                                    view.setCurrentItem(currentPage++, true);
                                }
                            });

также не забудьте отменить таймер в режиме уничтожения.

person Rucha Bhatt Joshi    schedule 23.01.2017
comment
Не работает с бесконечной прокруткой. Вы проверили это? - person Hitesh Dhamshaniya; 14.10.2017
comment
в чем проблема бесконечной прокрутки? - person Rucha Bhatt Joshi; 16.10.2017
comment
Приложение получает принудительное закрытие, возникает проблема, связанная с индексом. - person Hitesh Dhamshaniya; 16.10.2017
comment
ты решил это? если у вас есть решение, пожалуйста, обновите мой ответ, и я также посмотрю на проблему, давайте попробуем ее решить :) - person Rucha Bhatt Joshi; 16.10.2017
comment
да, я решил это. Используя помощь InfiniteViewPager и небольшую настройку в вашем ответе, я добился успеха в достижении своей цели - пейджер с автоматическим бесконечным просмотром. Я загрузил gist.github.com/hitesh-dhamshaniya/ Спасибо. - person Hitesh Dhamshaniya; 17.10.2017
comment
@HiteshDhamshaniya, не могли бы вы обновить мой ответ !? чтобы другие могли легко понять !! - person Rucha Bhatt Joshi; 17.10.2017
comment
ваш ответ абсолютно правильный для тех, кто хочет просто автоматически прокручивать страницы. Просто нужно отменить таймер при уничтожении Activity или Fragment - person Hitesh Dhamshaniya; 17.10.2017


Если вы хотите автоматически воспроизводить страницы просмотра, но, прежде всего, решение правильное, но после автовоспроизведения первый элемент потребляет время задержки, но это неправильно после быстрого переключения текущего элемента автоматического воспроизведения. Я добавляю свой код ниже, он работает правильно, автовоспроизведение/пауза.

        @Override
        public void onClick(View v) {

            if (!isAutoPlay) {              
                img_autoplay.setImageResource(R.drawable.pause);
                int currentcount = getModel().getCurrentIndex();
                currentcount++;
                getMainImage().setCurrentItem(currentcount);
                autoPlay(getMainImage());
                isAutoPlay = true;
            } else {
                img_autoplay.setImageResource(R.drawable.auto_play);
                isAutoPlay = false;
            }
        }
    });

и вот метод:

    viewPager.postDelayed(new Runnable() {
        @Override
        public void run() {
            try {
                if (myAdapter != null
                        && viewPager.getAdapter().getCount() > 0
                        && isAutoPlay) {
                    getWindow().addFlags(
                            WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
                    int currentcount = getModel().getCurrentIndex();
                    currentcount++;
                    viewPager.setCurrentItem(currentcount);

                    if (getModel().isLastCard()) {
                        final Handler handler = new Handler();
                        handler.postDelayed(new Runnable() {
                            @Override
                            public void run() {
                                isAutoPlay = false;
                                packFinished();
                                getWindow()
                                        .clearFlags(
                                                WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
                            }
                        }, 6000);
                    }
                    autoPlay(viewPager);
                }
            } catch (Exception e) {

            }
        }
    }, 6000);
person Bhavinkumar Patel    schedule 19.10.2015

Если вы собираетесь автоматически переключать страницы, вам следует отключить пейджинг/прокрутку в ViewPager, потому что, если вы коснетесь страницы и в это время переключение страниц, то это выглядит не очень хорошо, значит, вы заметили, что страница поражена.

Чтобы отключить пейджинг/перелистывание на ViewPager, вам нужно добавить приведенный ниже фрагмент кода с помощью пользовательского пейджера просмотра.

import android.content.Context;
import android.support.v4.view.ViewPager;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.animation.Interpolator;

import java.lang.reflect.Field;

public class ViewPagerCustomDuration extends ViewPager {

    private boolean swipeable = false;

    public ViewPagerCustomDuration(Context context) {
        super(context);
        postInitViewPager();
    }

    public ViewPagerCustomDuration(Context context, AttributeSet attrs) {
        super(context, attrs);
        postInitViewPager();
    }

    public void setSwipeable(boolean swipeable) {
        this.swipeable = swipeable;
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        if (this.swipeable) {
            return super.onTouchEvent(event);
        }

        return false;
    }

    @Override
    public boolean onInterceptTouchEvent(MotionEvent event) {
        if (this.swipeable) {
            return super.onInterceptTouchEvent(event);
        }

        return false;
    }

    private ScrollerCustomDuration mScroller = null;

    /**
     * Override the Scroller instance with our own class so we can change the
     * duration
     */
    private void postInitViewPager() {
        try {
            Field scroller = ViewPager.class.getDeclaredField("mScroller");
            scroller.setAccessible(true);
            Field interpolator = ViewPager.class.getDeclaredField("sInterpolator");
            interpolator.setAccessible(true);

            mScroller = new ScrollerCustomDuration(getContext(),
                    (Interpolator) interpolator.get(null));
            scroller.set(this, mScroller);
        } catch (Exception e) {
        }
    }

    /**
     * Set the factor by which the duration will change
     */
    public void setScrollDurationFactor(double scrollFactor) {
        mScroller.setScrollDurationFactor(scrollFactor);
    }

}

после этого вызовите метод из объекта просмотра пейджера.

import android.os.Bundle;
import android.support.v4.view.ViewPager;
import android.support.v7.app.AppCompatActivity;
import android.widget.Toast;

import java.util.Timer;
import java.util.TimerTask;



public class MainActivity extends AppCompatActivity {
    ViewPagerCustomDuration viewPager;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main_3);

        viewPager = (ViewPagerCustomDuration) findViewById(R.id.viewpager);
        viewPager.setScrollDurationFactor(2);
        viewPager.setAdapter(new CustomPagerAdapter(this));
        viewPager.setSwipeable(false);
        pageSwitcher(5);

        viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
            @Override
            public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {

            }

            @Override
            public void onPageSelected(int position) {
            }

            @Override
            public void onPageScrollStateChanged(int state) {

            }
        });

    }

    Timer timer;
    int page = 1;

    public void pageSwitcher(int seconds) {
        timer = new Timer(); // At this line a new Thread will be created
        timer.scheduleAtFixedRate(new RemindTask(), 0, seconds * 1000); // delay
        // in
        // milliseconds
    }

    // this is an inner class...
    class RemindTask extends TimerTask {

        @Override
        public void run() {

            // As the TimerTask run on a seprate thread from UI thread we have
            // to call runOnUiThread to do work on UI thread.
            runOnUiThread(new Runnable() {
                public void run() {

                    if (page > 4) { // In my case the number of pages are 5
//                        timer.cancel();
                        page = 0;
                        viewPager.setCurrentItem(page++);
                        // Showing a toast for just testing purpose
                        Toast.makeText(getApplicationContext(), "Timer stoped",
                                Toast.LENGTH_LONG).show();
                    } else {
                        viewPager.setCurrentItem(page++);
                    }
                }
            });

        }
    }

Класс Scroller для плавной прокрутки страницы

import android.annotation.SuppressLint;
import android.content.Context;
import android.view.animation.Interpolator;
import android.widget.Scroller;

public class ScrollerCustomDuration extends Scroller {

    private double mScrollFactor = 1;

    public ScrollerCustomDuration(Context context) {
        super(context);
    }

    public ScrollerCustomDuration(Context context, Interpolator interpolator) {
        super(context, interpolator);
    }

    @SuppressLint("NewApi")
    public ScrollerCustomDuration(Context context, Interpolator interpolator, boolean flywheel) {
        super(context, interpolator, flywheel);
    }

    /**
     * Set the factor by which the duration will change
     */
    public void setScrollDurationFactor(double scrollFactor) {
        mScrollFactor = scrollFactor;
    }

    @Override
    public void startScroll(int startX, int startY, int dx, int dy, int duration) {
        super.startScroll(startX, startY, dx, dy, (int) (duration * mScrollFactor));
    }

}
person ViramP    schedule 11.06.2018