9

ビューページャーを自動スライドまたは自動ページングすることができますか。以下のようなアダプターを使用するようにビューページャーを設定しましたが、正常に動作します:-

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

ただし、これらのフラグメントをビューページャーで自動スライドさせる方法を知りたいと思います。

4

4 に答える 4

13

setCurrentItem(int item、boolean SmoothScroll)でsmoothScroll = trueを設定しても、必ずしもスムーズスクロール効果があるとは限りません。ビューページャーのページ数が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();

        }
于 2013-11-13T10:55:03.540 に答える
11

おそらく、次のAPI ViewPager.beginFakeDrag()ViewPagerを確認する必要があります。ドラッグシミュレーションが必要な場合は、fakeDragBy (float offset)およびViewPager.endFakeDrag() 。また、setCurrentItem() APIは、現在のページを設定してスムーズに実行する機能を提供します。スライドを自動的に作成するための最も簡単な方法は、アクティビティにアイテムを設定するためのページャーメソッドを呼び出し、postDelayed()を実行する単純なRunnableを使用してハンドラーを設定することです。また、ユーザーの操作やアクティビティの一時停止などの場合は、removeCallbacks()を呼び出すことを忘れないでください。

于 2012-07-28T10:49:43.227 に答える
4

最初のCreateSliderクラスは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);
            }
        });
    }
}

次に、低速スクロール用の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) {
 }
于 2019-05-02T12:11:28.430 に答える
3

短い答え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();
}
于 2020-10-30T08:22:26.440 に答える