如何自动滑动android View Pager
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/11698987/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
How to auto slide android View Pager
提问by Rasmus
Can a View Pager be made to auto slide or autopage. I have my viewpager set up to use the adapter like the below and it works fine:-
可以将 View Pager 设为自动滑动或自动翻页。我已将我的 viewpager 设置为使用如下所示的适配器,并且工作正常:-
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.gridslide);
ImagePagerAdapter mAdapter = new ImagePagerAdapter(
getSupportFragmentManager(),4);
ViewPager mPager = (ViewPager) findViewById(R.id.pager);
mPager.setAdapter(mAdapter);
}
And the adapter is like below:-
适配器如下所示:-
public static class ImagePagerAdapter extends FragmentStatePagerAdapter {
private final int mSize;
public ImagePagerAdapter(FragmentManager fm, int size) {
super(fm);
mSize = size;
}
@Override
public int getCount() {
return mSize;
}
@Override
public Fragment getItem(int position) {
Log.v(TAG,"position="+position);
return TheFragment.newInstance(position);
}}
However I would want to know how to make these fragments autoslide in a viewpager.
但是我想知道如何使这些片段在 viewpager 中自动滑动。
回答by Raghu
Setting smoothScroll = true in setCurrentItem(int item, boolean smoothScroll) does not always have the smooth scroll effect. Suppose if you have less than 5 pages in you viewpager, you will hardly notice the smooth scroll.
在 setCurrentItem(int item, boolean smoothScroll) 中设置 smoothScroll = true 并不总是具有平滑滚动效果。假设您的 viewpager 中的页面少于 5 页,您几乎不会注意到平滑滚动。
In this scenario, the hard way to do it is to put it in a for loop
在这种情况下,很难做到的方法是将其放入 for 循环中
//This will scroll page-by-page so that you can view scroll happening
for (int i = 0; i < mAdapter.getCount()-1; i++)
mPager.setCurrentItem(i, true);
If some one needs more slower scroll, they can use postDelayed() like this...
如果有人需要更慢的滚动,他们可以像这样使用 postDelayed() ......
static int i=0;
private final Handler handler = new Handler();
somefunction()
{
handle.post(ViewPagerVisibleScroll);
}
Runnable ViewPagerVisibleScroll= new Runnable() {
@Override
public void run() {
if(i <= mAdapter.getCount()-1)
{
mPager.setCurrentItem(i, true);
handle.postDelayed(TopChartAnimation, 100);
i++;
}
}
};
Sleep is always NOT recommended: If some one needs more slower scroll, they may use a sleep in this for loop...
总是不推荐睡眠:如果有人需要更慢的滚动,他们可能会在这个 for 循环中使用睡眠......
@Override
public void onClick(View v) {
Runnable runnable = new Runnable() {
@Override
public void run() {
for (int i = 0; i < mAdapter.getCount()-1; i++) {
final int value = i;
try {
Thread.sleep(50);
} catch (InterruptedException e) {
e.printStackTrace();
}
handler.post(new Runnable() {
@Override
public void run() {
mPager.setCurrentItem(value, true);
}
});
}
}
};
new Thread(runnable).start();
}
回答by sandrstar
Probably, You should take a look at the following APIs ViewPager.beginFakeDrag(), ViewPager. fakeDragBy(float offset)and ViewPager.endFakeDrag()if You want drag simulation. Also, setCurrentItem()APIs provide ability to set current page and do it smoothly. Simplest way I could suggest to make slide automatically is to setup Handlerwith simple Runnable which would call pager methods for setting item in the activity and just do postDelayed() for it. And don't forget to call removeCallbacks() for it when user interaction or e.g. activity pause.
也许,您应该看看以下 API ViewPager.beginFakeDrag(),ViewPager。如果您想要拖动模拟,fakeDragBy(float offset)和ViewPager.endFakeDrag()。此外,setCurrentItem()API 提供了设置当前页面并顺利完成的能力。我建议自动制作幻灯片的最简单方法是使用简单的 Runnable设置Handler,它会调用寻呼机方法来设置活动中的项目,并为其执行 postDelayed() 。并且不要忘记在用户交互或例如活动暂停时为其调用 removeCallbacks()。
回答by Suhad Bin Zubair
First Create Slider class extend with TimerTask
首先创建 Slider 类扩展 TimerTask
public class SliderTimer extends TimerTask {
private ViewPager viewPager;
private int size;
private Activity activity;
public SliderTimer(ViewPager viewPager, int size, Activity activity) {
this.viewPager = viewPager;
this.size = size;
this.activity = activity;
}
@Override
public void run() {
activity.runOnUiThread(() -> {
if (viewPager.getCurrentItem() < size - 1) {
viewPager.setCurrentItem(viewPager.getCurrentItem() + 1, true);
} else {
viewPager.setCurrentItem(0, true);
}
});
}
}
Next Create SpeedSlowScroller for slow scrolling
Next 创建 SpeedSlowScroller 用于慢速滚动
public class SpeedSlowScroller extends Scroller {
private int mDuration = 2500;
public SpeedSlowScroller(Context context) {
super(context);
}
public SpeedSlowScroller(Context context, Interpolator interpolator) {
super(context, interpolator);
}
public SpeedSlowScroller(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);
}
}
Finally add SpeedSlowScrollerinto ViewPager, and SliderTimerfor auto scroll
最后将SpeedSlowScroller添加到 ViewPager 和SliderTimer以进行自动滚动
try {
Field mScroller = ViewPager.class.getDeclaredField("mScroller");
mScroller.setAccessible(true);
SpeedSlowScroller scroller = new SpeedSlowScroller(_context);
mScroller.set(your_viewpager, scroller);
Timer timer = new Timer();
timer.scheduleAtFixedRate(new SliderTimer(your_viewpager, models.size(), activity), 4000, 6000);
} catch (Exception ignored) {
}