【问题标题】:How to auto slide android View Pager如何自动滑动android View Pager
【发布时间】:2020-10-30 16:22:26
【问题描述】:

可以将 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);
}

适配器如下:-

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);
}}

但是我想知道如何让这些片段在 viewpager 中自动滑动。

【问题讨论】:

标签: android android-viewpager


【解决方案1】:

在 setCurrentItem(int item, boolean smoothScroll) 中设置 smoothScroll = true 并不总是具有平滑滚动效果。假设如果您的 viewpager 中的页面少于 5 个,您几乎不会注意到平滑滚动。

在这种情况下,最困难的方法是把它放在一个 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);

如果有人需要更慢的滚动,他们可以像这样使用 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++;
                    }
                }
            };

总是不推荐休眠:如果有人需要更慢的滚动,他们可能会在这个 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();

        }

【讨论】:

  • 毫无疑问,在 UI 线程中休眠是个坏主意。最好使用 postDelayed() 代替。
  • @sandrstar 是的,我接受你的建议。我通过删除 Thread.sleep() 重新编辑了代码
  • 两者都会造成内存泄漏。
【解决方案2】:

如果您想要拖动模拟,您应该看看以下 API ViewPager.beginFakeDrag()ViewPager. fakeDragBy(float offset)ViewPager.endFakeDrag()。此外,setCurrentItem() API 提供了设置当前页面并顺利完成的能力。 我建议自动制作幻灯片的最简单方法是使用简单的 Runnable 设置Handler,它会调用寻呼机方法来设置活动中的项目,然后为它执行 postDelayed()。并且不要忘记在用户交互时为它调用 removeCallbacks() 或例如活动暂停。

【讨论】:

【解决方案3】:

首先使用 TimerTask 创建 Slider 类扩展

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);
            }
        });
    }
}

下一步为慢速滚动创建 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);
    }
}

最后将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) {
 }

【讨论】:

    【解决方案4】:

    2020 年简答题

    设置 viewPager 适配器后

       private Runnable runnable = null;
      
       public void function DisplaySlider(){
    
        sliderItemAdapter = new SliderItemAdapter(getActivity(), mSliderList);//push the data to the adapter
        mViewPager.setAdapter(sliderItemAdapter); //set the adapter to the view pager
        startAutoSlider(sliderItem.getCount());
    
       }
    
    
         
    
    private void startAutoSlider(final int count) {
    
        runnable = new Runnable() {
            @Override
            public void run() {
                int pos = mViewPager.getCurrentItem();
                pos = pos + 1;
                if (pos >= count) pos = 0;
                mViewPager.setCurrentItem(pos);
                handler.postDelayed(runnable, 3000);
            }
        };
        handler.postDelayed(runnable, 3000);
    }
    
       
    

    最后别忘了从回调中释放内存

    @Override
    public void onDestroy() {
        if (runnable != null) handler.removeCallbacks(runnable);
        super.onDestroy();
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-02-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多