Подтвердить что ты не робот

Изменение скорости перехода ViewPager и setCurrentItem

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

Я видел ответы на этот вопрос здесь

Скорость замедления контроллера Viewpager в android

но все они используют отражение. Кто-нибудь знает о любом способе замедления автоматической скорости ViewPager без использования отражения?

Я думал об использовании PageTransformer, но не уверен, что это сработает, а также, возможно, это повлияет на скорость, если пользователь и как автоматический, так и автоматический? Если я не смогу каким-то образом обнаружить разницу, а затем сделать ту или иную PageTransformation?

4b9b3361

Ответ 1

Используйте этот пользовательский View

public class ViewPagerCustomDuration extends ViewPager {
private FixedSpeedScroller mScroller = null;

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

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

/*
 * Override the Scroller instance with our own class so we can change the
 * duration
 */
private void init() {
    try {
        Class<?> viewpager = ViewPager.class;
        Field scroller = viewpager.getDeclaredField("mScroller");
        scroller.setAccessible(true);
        mScroller = new FixedSpeedScroller(getContext(),
                new DecelerateInterpolator());
        scroller.set(this, mScroller);
    } catch (Exception ignored) {
    }
}

/*
 * Set the factor by which the duration will change
 */
public void setScrollDuration(int duration) {
    mScroller.setScrollDuration(duration);
}

private class FixedSpeedScroller extends Scroller {

    private int mDuration = 500;

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

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

    public FixedSpeedScroller(Context context, Interpolator interpolator, boolean flywheel) {
        super(context, interpolator, flywheel);
    }

    @Override
    public void startScroll(int startX, int startY, int dx, int dy, int duration) {
        // Ignore received duration, use fixed one instead
        super.startScroll(startX, startY, dx, dy, mDuration);
    }

    @Override
    public void startScroll(int startX, int startY, int dx, int dy) {
        // Ignore received duration, use fixed one instead
        super.startScroll(startX, startY, dx, dy, mDuration);
    }

    public void setScrollDuration(int duration) {
        mDuration = duration;
    }
}
}

Ответ 2

используйте параметр таймера расписания для автоматического поворота страниц.

int i = 0;
static Timer timer = new Timer();

//Scroller scroll = new Scroller(this);

@Override
protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);

    setContentView(R.layout.simple_circles);

    mAdapter = new TestFragmentAdapter(getSupportFragmentManager());

    mPager = (ViewPager) findViewById(R.id.pager);

    mPager.setAdapter(mAdapter);

     mIndicator = (CirclePageIndicator) findViewById(R.id.indicator);

    mIndicator.setViewPager(mPager);

    mPager.setCurrentItem(i);

    SwitchPage(3);


  }

public void SwitchPage(int seconds) 

{

if(timer != null)
{
    timer.cancel();
}

timer = new Timer(); // At this line a new Thread will be created

timer.schedule(new SwitchPageTask(), 
2000, seconds * 2000);               
 // delay in milliseconds
 }


class SwitchPageTask extends TimerTask 
{

@Override
public void run() {

    runOnUiThread(new Runnable() {

        public void run() {

            if(i < mAdapter.getCount())

            {

                i++;

                mPager.setCurrentItem(i, true);

            }
            else
            {

                i=0;

                mPager.setCurrentItem(i, true);
            }
        }
    });
}
}

just cancel the timer like.. timer.cancel().. or
cancel timer from another activity or fragment activity..

    textView1_page3.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {

                if (SampleCirclesDefault.timer != null) {
                    SampleCirclesDefault.timer.cancel();
                    Toast.makeText(getActivity(), "timer
                  cancled", 1).show();
                }

            }
        });