(自定义View)自动翻页ViewPager
来源:互联网 发布:手机科幻特效软件 编辑:程序博客网 时间:2024/06/04 17:59
/** * 描述:自动翻页ViewPager * 作者:FrankChoo */public class AutoSlideViewPager extends FrameLayout { private ViewPager mViewPager; private AutoSlideViewPagerAdapter mAdapter; private List<ImageView> mImageViewList = new ArrayList<>();//放图片的list private List<ImageView> mDotViewList = new ArrayList<>();//放圆点的View的list private boolean mIsAutoPlay = true;//是否开启自动轮播 private int mAutoSlideTime = 5000;//自动翻页时间(单位mm) private int mDotSize = 50;//小圆点的大小, 默认是50 private int mImageCount = 0;//图片的数量 private int mCurrentItem = 0;//ViewPager的当前页 private Context mContext; private Timer mTiemr = new Timer();//定时任务 private TimerTask mTimerTask = new TimerTask() { @Override public void run() { post(new Runnable() {//post到主线程处理页面切换 @Override public void run() { if (mIsAutoPlay) {//判断当前状态是否允许自动滑动 mCurrentItem = (mCurrentItem + 1) % mImageCount; mViewPager.setCurrentItem(mCurrentItem); } } }); } }; private OnImageClickListener mListener;//图片点击监听器接口 public AutoSlideViewPager(Context context) { this(context, null); mContext = context; } public AutoSlideViewPager(Context context, AttributeSet attrs) { this(context, attrs, 0); mContext = context; } public AutoSlideViewPager(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); mContext = context; } /** * 设置小圆点的大小 */ public void setDotSize(int size) { mDotSize = size; } /** * 设置自动滑动时间间隔 */ public void setAutoSlideTime(int time) { mAutoSlideTime = time; } /** * 添加要循环的图片 */ public void setImageUriList(List<?> imageUriList){ mImageCount = imageUriList.size(); for ( int i = 0; i < mImageCount ; i++) { addImageToList(i, imageUriList.get(i)); } } /** * 设置图片点击监听器 */ public void setOnImageClickListener(OnImageClickListener listener) { mListener = listener; } public interface OnImageClickListener { void onClick(int position);//接口的抽象方法根据需要自行修改 } @Override protected void onAttachedToWindow() { refreshUI(); super.onAttachedToWindow(); } /**刷新当前自定义View*/ private void refreshUI() { removeAllViews(); //添加ViewPager到该ViewGroup mViewPager = new ViewPager(mContext); mViewPager.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT)); mViewPager.setFocusable(true); mAdapter = new AutoSlideViewPagerAdapter(mImageViewList); mViewPager.setAdapter(mAdapter); mViewPager.addOnPageChangeListener(new OnPageChangeListener() { @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { } @Override public void onPageSelected(int position) { mCurrentItem = position; for(int i = 0; i < mImageCount; i++){ if(i == position){ mDotViewList.get(i).setImageResource(R.drawable.ic_dot_selected); }else { mDotViewList.get(i).setImageResource(R.drawable.ic_dot_unselected); } } } @Override public void onPageScrollStateChanged(int state) { Log.e("AutoSlideViewPager", "正在滑动"); switch (state) { //手指拖拽ViewPager时的状态 case 1: { mIsAutoPlay = false;//当手指拖拽ViewPager时进制自动翻页 break; } //界面切换中 case 2: { mIsAutoPlay = true; break; } //滑动结束 case 0: { mIsAutoPlay = true; break; } } } }); addView(mViewPager); //添加小圆点到该ViewGroup for ( int i =0; i < mImageCount ; i++) { addView(mDotViewList.get(i)); } //开启定时任务 mTiemr.schedule(mTimerTask, mAutoSlideTime, mAutoSlideTime); } /**添加ImageView到该ViewGroup*/ private void addImageToList(final int position, Object uri) { //将ImageView添加到List ImageView imageView = new ImageView(mContext); imageView.setScaleType(ScaleType.FIT_XY); imageView.setImageResource(R.mipmap.image_default);//图片占位符 Glide.with(mContext).load(uri).into(imageView); imageView.setOnClickListener(new OnClickListener() { @Override public void onClick(View view) { mListener.onClick(position); } }); mImageViewList.add(imageView); //将小圆点添加进List ImageView dotView = new ImageView(mContext); dotView.setLayoutParams(new ViewGroup.LayoutParams(mDotSize, mDotSize)); dotView.setImageResource( position == 0 ? (R.drawable.ic_dot_selected) : (R.drawable.ic_dot_unselected)); mDotViewList.add(dotView); } /** * ViewPager适配器 * 非静态内部类会持有对外部类的引用, 可能会造成内存泄漏, 所以最好加上static */ private static class AutoSlideViewPagerAdapter extends PagerAdapter { private List<ImageView> children = new ArrayList<>(); AutoSlideViewPagerAdapter(List<ImageView> children) { this.children = children; } /**获取子级布局的数量*/ @Override public int getCount() { return children.size(); } /**判断某个View对象是否为当前被添加到ViewPager容器中的对象*/ @Override public boolean isViewFromObject(View view, Object object) { return view == object; } /**实例化ViewPager容器中指定的position位置需要显示的View对象*/ @Override public Object instantiateItem(ViewGroup container, int position) { View view = children.get(position); container.addView(view); return view; } /**在ViewPager中移除指定的positon位置的view对象*/ @Override public void destroyItem(ViewGroup container, int position, Object object) { View view = children.get(position); container.removeView(view); } } @Override protected void onLayout(boolean changed, int left, int top, int right, int bottom) { Log.e("AutoSlideViewPager", "onLayout"); super.onLayout(changed, left, top, right, bottom); int childCount = getChildCount(); if (childCount != 0) { for (int i = 0; i < getChildCount(); i++) { View childView = getChildAt(i); if (childView instanceof ImageView) { int spacing = mDotSize; int width = mDotSize; int start; if (mImageCount % 2 == 1) {//小白点的数量为奇数时的起点 start = (right - left) / 2 - width/2 - (mImageCount/2) * 2 * spacing; } else {//小白点的数量为偶数时的起点 start = (right - left)/2 - width/2 - (mImageCount -1) * spacing; } int mLeft = start + (i-1) * (2*spacing); int mTop = bottom - (bottom - top)/10; int mRight = mLeft + mDotSize; int mBottom = mTop + mDotSize; childView.layout(mLeft, mTop, mRight, mBottom); } else { childView.layout(0, 0, right, bottom); } } } } /**终止mTiemr定时任务, 防止内存泄漏*/ @Override protected void onDetachedFromWindow() { mTimerTask.cancel(); mTiemr.cancel(); mTiemr = null; mTimerTask = null; super.onDetachedFromWindow(); }}
阅读全文
0 0
- (自定义View)自动翻页ViewPager
- Android ViewPager 自定义翻页动画
- Android 自定义View 横向翻页
- 自定义View之垂直翻页公告
- Android 自定义view 折线翻页原理笔记
- Android 自定义view 折线翻页原理笔记
- 自定义View之垂直翻页公告
- Android 自定义view 折线翻页原理笔记
- 自定义view实现ViewPager指示器
- 关于view的自定义viewpager
- 自定义日历 ViewPager FragmentStatePagerAdapter 自定义View
- Android自定义View——自定义ViewPager
- Android自定义View——自定义ViewPager
- Android不继承ViewPager实现自动滚动翻页功能
- 初学自定义view实现viewpager导航栏
- 自定义View之垂直滑动的ViewPager
- Android 自定义View实现ViewPager指示器
- ViewPager+Fragment自定义View滑动条
- pyhotn3入门基础-12 迭代器
- 2. Python
- 推荐系统:概述
- Javascript模块化编程(一)
- es6 扩展运算符 三个点(...)
- (自定义View)自动翻页ViewPager
- CSS书写规则
- Mac 使用小技巧——调整 Launchpad 行列数目(图标大小)
- Spark原理---导航
- make的更新规则和.PHONY
- SpringBoot的项目在Eclipse中启动很快但是丢到centos服务器上启动很慢的问题处理
- 排序--js版
- 【unity学习笔记】Character controller在运动的刚体碰撞体上会掉落
- Opencv Mat、CvMat 和 Iplimage 的相互转换