参考
1.https://www.cnblogs.com/whyalwaysme/p/4391688.html
2.https://blog.csdn.net/zhiyuan0932/article/details/52673169
不想看的直接上代码:
https://download.csdn.net/download/luyujian6/10998167
MainActivity:
package com.demo.viewpage;
import android.os.Handler;
import android.os.Message;
import android.support.v4.view.ViewPager;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
public class MainActivity extends AppCompatActivity implements ViewPager.OnPageChangeListener {
private Handler handler;
private ViewPager viewPager;
private long lastUpdateTime;
private int currentPosition = 0;
private final int FIRST_PAGE = 1;
private final int HANDLE_MSG = 2;
private final int SLEEP_TIME = 5 * 1000;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initHandle();
viewPager = findViewById(R.id.view_page);
ViewPageAdapter adapter = new ViewPageAdapter(this, initData());
viewPager.setAdapter(adapter);
viewPager.setCurrentItem(FIRST_PAGE, false);
handler.sendEmptyMessageDelayed(HANDLE_MSG, SLEEP_TIME);
viewPager.setOnPageChangeListener(this);
}
private int[] initData() {
//一共显示四张图片,但是为了轮询,在数组的最后加第一张图片的位置,在数组的第一张加最后一张图
int resource0 = R.mipmap.image4;//
int resource1 = R.mipmap.image1;
int resource2 = R.mipmap.image2;
int resource3 = R.mipmap.image3;
int resource4 = R.mipmap.image4;
int resource5 = R.mipmap.image1;
return new int[]{resource0, resource1, resource2, resource3, resource4, resource5};
}
private void initHandle() {
if (handler != null) {
return;
}
handler = new Handler(getMainLooper()) {
@Override
public void handleMessage(Message msg) {
if (msg.what != HANDLE_MSG) {
return;
}
long intervalTime = 0;
if (lastUpdateTime > 0) {
intervalTime = (System.currentTimeMillis() - lastUpdateTime);
//如果不到达指定的更新时间,不去更新,因为当展示的ViewPage被滑动不可见,当下一次再被滑动回来可见的时候,这里的时间会被混乱,所以这里需要重置
if (intervalTime < SLEEP_TIME) {
intervalTime = SLEEP_TIME - intervalTime;
sendEmptyMessageDelayed(HANDLE_MSG, intervalTime);
return;
}
}
//重置更新时间
lastUpdateTime = System.currentTimeMillis();
//当前正在展示的图片位置+1等于下一个图片展示的位置
currentPosition = viewPager.getCurrentItem() + 1;
//计算出位置之后,走位置是否需要重置流程
resetPosition(currentPosition);
viewPager.setCurrentItem(currentPosition, false);
//继续发送消息,触发下一次更新
sendEmptyMessageDelayed(HANDLE_MSG, SLEEP_TIME);
}
};
}
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
}
@Override
public void onPageSelected(int position) {
resetPosition(position);
}
@Override
public void onPageScrollStateChanged(int state) {
//更新展示图片
if (state == ViewPager.SCROLL_STATE_IDLE) {
//因为这里是手动滑动更新进来的位置,必须把上一次自动轮询的消息移除,避免重复多次更新,为了性能优化,最后这个viewPage不可见的时候停止更新,出现的时候再更新
handler.removeMessages(HANDLE_MSG, null);
viewPager.setCurrentItem(currentPosition, false);
//更新完之后继续发送消息自动更新
handler.sendEmptyMessageDelayed(HANDLE_MSG, SLEEP_TIME);
}
}
//重置展示位置
private void resetPosition(int position) {
//当前展示的图片等于最后位置的时候,重置到第一张图的位置
if (position == initData().length - 1) {
currentPosition = FIRST_PAGE;
return;
}
//当前位置等于最后一项位置的时候,重置到最后一张图的位置
if (position == 0) {
currentPosition = initData().length - 2;
return;
}
//不是首尾位置,正常顺序展示
currentPosition = position;
}
//注意:viewPager.setCurrentItem记得是带参数false,也就是这个viewPager.setCurrentItem(currentPosition, false),不然会出现首尾切换轮播的时候不平滑
}
二 Adapter文件
package com.demo.viewpage;
import android.app.Activity;
import android.support.v4.view.PagerAdapter;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
/**
* Created by luyujian on 2019/3/5.
*/
public class ViewPageAdapter extends PagerAdapter {
private Activity activity;
private int[] imageResourceIdList;
public ViewPageAdapter(Activity activity, int[] imageResourceIdList) {
this.activity = activity;
this.imageResourceIdList = imageResourceIdList;
}
@Override
public int getCount() {
return imageResourceIdList.length;
}
@Override
public boolean isViewFromObject(View view, Object object) {
return view == object;
}
@Override
public Object instantiateItem(ViewGroup container, int position) {
//绑定自定义xml,填充数据
View view = View.inflate(activity, R.layout.main_view_page_item, null);
TextView textView = view.findViewById(R.id.view_page_text);
LinearLayout groupPoint = view.findViewById(R.id.view_page_point_group);
textView.setText("这里的Position:" + position);
ImageView imageView = view.findViewById(R.id.view_page_image);
imageView.setImageResource(imageResourceIdList[position]);
//填充小圆点
setPointState(groupPoint, position);
container.addView(view);
return view;
}
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
container.removeView((View) object);
}
private void setPointState(LinearLayout groupPoint, int position) {
for (int i = 0; i < imageResourceIdList.length - 2; i++) {
ImageView point = new ImageView(activity);
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(20, 20);
params.rightMargin = 35;
point.setLayoutParams(params);
point.setBackgroundResource(R.drawable.point_bg);
if (i == position - 1) {
point.setEnabled(true);
} else {
point.setEnabled(false);
}
groupPoint.addView(point);
}
}
}