package me.xiaopan.sketchsample.util;
import android.content.Context;
import android.os.Handler;
import android.os.Looper;
import android.support.v4.view.ViewPager;
import android.view.animation.AccelerateDecelerateInterpolator;
import android.view.animation.Interpolator;
import android.widget.Scroller;
import java.lang.reflect.Field;
/**
* 播放器
*/
public class ViewPagerPlayer implements Runnable {
private ViewPager viewPager;
private boolean playing;
private Handler handler;
private long delayMillis = 4000;
private boolean leftToRight = true;
private FixedSpeedScroller fixedSpeedScroller;
public ViewPagerPlayer(ViewPager viewPager) {
this.viewPager = viewPager;
this.handler = new Handler(Looper.getMainLooper());
try {
Field field = ViewPager.class.getDeclaredField("mScroller");
field.setAccessible(true);
field.set(viewPager, fixedSpeedScroller = new FixedSpeedScroller(viewPager.getContext(), new AccelerateDecelerateInterpolator()));
} catch (Exception e) {
e.printStackTrace();
}
}
public boolean start() {
if (playing) {
return false;
}
fixedSpeedScroller.setAnimationDuration(1000);
leftToRight = true;
playing = true;
handler.post(this);
return true;
}
public boolean stop() {
if (!playing) {
return false;
}
fixedSpeedScroller.setAnimationDuration(300);
playing = false;
handler.removeCallbacks(this);
return true;
}
public boolean isPlaying() {
return playing;
}
@Override
public void run() {
int currentItem = viewPager.getCurrentItem();
if (currentItem == 0) {
leftToRight = true;
} else if (currentItem == viewPager.getAdapter().getCount() - 1) {
leftToRight = false;
}
int nextItem;
if (leftToRight) {
nextItem = currentItem + 1;
} else {
nextItem = currentItem - 1;
}
viewPager.setCurrentItem(nextItem, true);
if (playing) {
handler.postDelayed(this, delayMillis);
}
}
private class FixedSpeedScroller extends Scroller {
private int animationDuration = 300;
public FixedSpeedScroller(Context context) {
super(context);
}
public FixedSpeedScroller(Context context, Interpolator interpolator) {
super(context, interpolator);
}
@Override
public void startScroll(int startX, int startY, int dx, int dy, int duration) {
super.startScroll(startX, startY, dx, dy, animationDuration);
}
@Override
public void startScroll(int startX, int startY, int dx, int dy) {
super.startScroll(startX, startY, dx, dy, animationDuration);
}
public void setAnimationDuration(int animationDuration) {
this.animationDuration = animationDuration;
}
}
}