ViewPager
public class RotationChartViewPager extends ViewPager {
private static final int DEFAULT_SWITCH_TIME = 3000;
private long delayTime = DEFAULT_SWITCH_TIME;
private boolean running = false; //标示是否正在自动轮询
private boolean canRun = true; //标示是否可以自动轮询,可在不需要的是否置false
public RotationChartViewPager(@NonNull Context context) {
super(context);
}
public RotationChartViewPager(@NonNull Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
}
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
switch (ev.getAction()) {
case MotionEvent.ACTION_DOWN:
if (running) {
stopPlay();
}
break;
//当手指抬起或者划出页面时
case MotionEvent.ACTION_UP:
case MotionEvent.ACTION_OUTSIDE:
case MotionEvent.ACTION_CANCEL:
if (canRun) {
startPlay();
}
break;
}
return super.dispatchTouchEvent(ev);
}
private final Runnable mTask = new Runnable() {
@Override
public void run() {
if (running && canRun) {
int currentItem = getCurrentItem();
currentItem++;
setCurrentItem(currentItem);
postDelayed(mTask, delayTime);
}
}
};
public void setDelayTime(long delayTime) {
this.delayTime = delayTime;
}
@Override
protected void onDetachedFromWindow() {
super.onDetachedFromWindow();
stopPlay();
}
public void stopPlay() {
running = false;
removeCallbacks(mTask);
}
public void startPlay() {
canRun = true;
running = true;
removeCallbacks(mTask);
// 这里没调用Handler,view里面自带postDelayed
postDelayed(mTask, delayTime);
}
}
PagerAdapter
public class RotationChartViewPagerAdapter extends PagerAdapter {
private Context context;
private List<String> data;
public RotationChartViewPagerAdapter(Context context, List<String> data) {
this.context = context;
this.data = data;
}
@Override
public int getCount() {
return Integer.MAX_VALUE;
}
@Override
public boolean isViewFromObject(@NonNull View view, @NonNull Object o) {
return view == o;
}
@NonNull
@Override
public Object instantiateItem(@NonNull ViewGroup container, int position) {
View view = LayoutInflater.from(context).inflate(RUtil.layout("sdk7477_item_rotation_chart"), container, false);
container.addView(view);
return view;
}
@Override
public void destroyItem(ViewGroup container, int position, @NonNull Object object) {
container.removeView((View) object);
}
}
ViewPager.PageTransformer
public class RotationChartViewPagerTransformer implements ViewPager.PageTransformer {
private static final float DEFAULT_MIN_SCALE = 0.8f;
private float mMinScale = DEFAULT_MIN_SCALE;
@Override
public void transformPage(@NonNull View view, float position) {
float limitLow = -1;
float limitMid = 0;
float limitHigh = 1;
if (position < limitLow) {
view.setScaleX(mMinScale);
view.setScaleY(mMinScale);
} else if (position <= limitHigh) { // [-1,1]
float factor;
if (position < limitMid) //[-1,0)
{
factor = mMinScale + (1 - mMinScale) * (1 + position);
} else//[0,1]
{
factor = mMinScale + (1 - mMinScale) * (1 - position);
}
view.setScaleX(factor);
view.setScaleY(factor);
} else { // (1,+Infinity]
view.setScaleX(mMinScale);
view.setScaleY(mMinScale);
}
}
}
xml
<com.yxkj.gameboxsdk.ui.fragment.home.page.RotationChartViewPager
android:id="@+id/sdk7477_home_page_rotation_chart_vp"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:clipChildren="false"
android:clipToPadding="false"
android:paddingHorizontal="@dimen/dimen_50sdp" />
使用
rotationChartVp.setPageTransformer(true, new RotationChartViewPagerTransformer());
rotationChartVp.setOffscreenPageLimit(data.size());
rotationChartVp.setAdapter(new RotationChartViewPagerAdapter(requireContext(), data));
//这儿的1000,可以随便改,只要用户滑不出边界即可
int startPos = 1000 * data.size() + 1;
rotationChartVp.setCurrentItem(startPos, false);
rotationChartVp.startPlay();