使用ViewPager实现功能:
1. ViewPager 使用设置适配器
2. ViewPager 添加addOnPageChangeListener 监听
3. ViewPager 实现伪 无限循环
public int getCount() {
return Integer.MAX_VALUE;
}
// 获取获取对应数据 position
imageView.setImageResource(imgList.get(position%imgList.size()));
4. 设置支持向右边滑动, 设置第一页为中间其实也即可
5. 延时切换,handler 设置制动轮播
6. 实现手指按下 停止 自动轮播
*******************核心代码区*********************************************************************
package lanya.denganzhi.com.viewpagerdemo;
public class MainActivity extends AppCompatActivity {
ViewPager viewPager;
List<Integer> imgList;
private LinearLayout dot_layout;
private TextView tv_intro;
Handler handler=new Handler(){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
switch (msg.what) {
case MSGWHAT:
viewPager.setCurrentItem(viewPager.getCurrentItem()+1);
handler.sendEmptyMessageDelayed(MSGWHAT,4000);
break;
}
}
};
public final int MSGWHAT=1000;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
viewPager = (ViewPager)findViewById(R.id.viewPager);
tv_intro = (TextView) findViewById(R.id.tv_intro);
imgList=new ArrayList<>();
imgList.add(R.mipmap.a);
imgList.add(R.mipmap.b);
imgList.add(R.mipmap.c);
dot_layout = (LinearLayout) findViewById(R.id.dot_layout);
initDots();
// 1. ViewPager 使用设置适配器
viewPager.setAdapter(new PagerAdapter() {
@Override
public int getCount() {
// 3. ViewPager 实现伪 无限循环, 返回页数
// return imgList.size();
return Integer.MAX_VALUE;
}
// 相当于 ListView的 getView 方法
@Override
public Object instantiateItem(ViewGroup container, final int position) {
View view= View.inflate(MainActivity.this,R.layout.adapter_ad,null);
ImageView imageView= view.findViewById(R.id.image1);
imageView.setImageResource(imgList.get(position%imgList.size()));
imageView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Log.e("denganzhi","点击了item:"+imgList.get(position%imgList.size()));
}
});
// 6. 实现手指按下Pager 停止 自动轮播
imageView.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
Log.e("denganzhi","手指按下");
handler.removeMessages(MSGWHAT);
break;
case MotionEvent.ACTION_UP:
Log.e("denganzhi","按下离开");
handler.sendEmptyMessageDelayed(MSGWHAT,4000);
break;
}
return false;
}
});
container.addView(view);//一定不能少,将view加入到viewPager中
return view;
}
@Override
public boolean isViewFromObject(View view, Object object) {
/**
* ViewPager预加载默认缓存3页 ,当前显示页,上一页,下一页,显示2个时候,3已经被创建了
* 加载第4页的时候,第0页被销毁
* true 创建使用缓冲
* false 重新创建
* google 官方推荐这么写的
*/
return view==object;
}
// object 当前被销毁的pager对象
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
container.removeView((View) object);
}
});
// viewPager.setCurrentItem(400); // 设置默认显示400页
// 4.设置支持向右边滑动, 设置第一页为中间其实也即可
// 如何理解
// 比如 100/50 50%3= 2 50-2=48 从48开始循环
int centerPager= Integer.MAX_VALUE/2;
int value = centerPager% imgList.size();
viewPager.setCurrentItem(centerPager-value);
// 5. 延时切换
handler.sendEmptyMessageDelayed(MSGWHAT,4000);
// 2. ViewPager 添加addOnPageChangeListener 监听
viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
updateIntroAndDot();
}
@Override
public void onPageSelected(int position) {
// 当pager选中的时候
}
@Override
public void onPageScrollStateChanged(int state) {
}
});
}
private void initDots(){
for (int i = 0; i < imgList.size(); i++) {
View view = new View(this);
LayoutParams params = new LayoutParams(8, 8);
if(i!=0){
params.leftMargin = 5;
}
view.setLayoutParams(params);
view.setBackgroundResource(R.drawable.selector_dot);
dot_layout.addView(view);
}
}
/**
* 更新文本
*/
private void updateIntroAndDot(){
// 设置可以轮训滚动,比如getCount 设置1000
int currentPage = viewPager.getCurrentItem()%imgList.size();
tv_intro.setText(imgList.get(currentPage)+"");
for (int i = 0; i < dot_layout.getChildCount(); i++) {
// 设置state_enabled = false ,那么 这个点走dot_unfocus.xml drawable
dot_layout.getChildAt(i).setEnabled(i==currentPage);
}
}
@Override
protected void onDestroy() {
handler.removeMessages(MSGWHAT);
super.onDestroy();
}
}
*******************核心代码区*********************************************************************
效果上图:
具体代码看源码:https://download.csdn.net/download/dreams_deng/12250485