android 简单的轮播图效果实现
来源:互联网 发布:淘宝校园卡 编辑:程序博客网 时间:2024/06/06 08:37
首先讲一下轮播图的思路 我的做法是pagerAdapter
//轮播图的适配器class CarouselVpAdapter extends PagerAdapter {//传递网址 private List<String> urlStrs; public CarouselVpAdapter(List<String> urlStrs) { this.urlStrs = urlStrs; notifyDataSetChanged(); }//总共多少的图片 @Override public int getCount() { return urlStrs != null && urlStrs.size() != 0 ? urlStrs.size() : 0; } @Override public boolean isViewFromObject(View view, Object object) { return view == object; }//加载布局 @Override public Object instantiateItem(ViewGroup container, int position) { View view = LayoutInflater.from(context).inflate(R.layout.item_item_carousel, container, false);
ImageView imageView = (ImageView) view.findViewById(R.id.carousel_imageView);
//皮卡丘下载图片 Picasso.with(context).load(urlStrs.get(position)).into(imageView);
//一个比较容易被遗忘的方法 container.addView(view); return view; } @Override public void destroyItem(ViewGroup container, int position, Object object) {
//删掉super的引用父类方法 container.removeView(LayoutInflater.from(context).inflate(R.layout.item_item_carousel, container, false)); }}
适配器具体方法的含义不多做解释了 那么现在的效果就是 滑到最后一张就停了
然后我们应该用ViewPager的currentItem这个方法 让第一张和第二张的图片一张 倒数第二张和最后一张的图片一样,这样 我们就可以在第二张滑到第一张的时候让第一张直接跳跃到倒数第二张 因为瞬间切换视图非常的快 人眼无法识别 下面的代码比较多 具体的解释在代码里面了
View headView = LayoutInflater.from(context).inflate(R.layout.item_choose_carousel_vp, null); headVp = (ViewPager) headView.findViewById(R.id.carousel_vp); pointL = (LinearLayout) headView.findViewById(R.id.rotate_point_container); initCarouselAdapter();
//初始化数据适配器 给轮播图设置数据private void initCarouselAdapter() { //初始化头布局适配器器具体的内容 datas = new ArrayList<>(); // 代码中的第1张图片 // 将视觉上的最后一张图片添加到第一个位置 datas.add("http://img02.liwushuo.com/image/170115/g1sjnq2lo.jpg-w720"); // 视觉上的第1张 datas.add("http://img01.liwushuo.com/image/170117/boql3ncgf.jpg-w720"); // 第2张 datas.add("http://img01.liwushuo.com/image/170113/jy6wz0dwx.jpg-w720"); // 第3张 datas.add("http://img03.liwushuo.com/image/170113/qv6iz1mct.jpg-w720"); // 第4张 datas.add("http://img03.liwushuo.com/image/170113/3qyb87je2.jpg-w720"); // 第5张 datas.add("http://img03.liwushuo.com/image/170114/p03mblo20.jpg-w720"); // 视觉上的最后一张 datas.add("http://img02.liwushuo.com/image/170115/g1sjnq2lo.jpg-w720"); // 代码中的最后一张 // 将视觉上的第一张图片添加到最后 datas.add("http://img01.liwushuo.com/image/170117/boql3ncgf.jpg-w720"); CarouselVpAdapter carouselVpAdapter = new CarouselVpAdapter(datas); headVp.setAdapter(carouselVpAdapter); headVp.setCurrentItem(1, false); headVp.addOnPageChangeListener(this); /********** 圆点操作 **********/ // 循环创建显示圆点的imageView // 注意循环次数 for (int i = 0; i < datas.size() - 2; i++) { // 创建控件 ImageView pointIV = new ImageView(context); // 设置间距 pointIV.setPadding(5, 5, 5, 5); // 设置尺寸(坐标)等信息 LinearLayout.LayoutParams param = new LinearLayout.LayoutParams(80, 80); pointIV.setLayoutParams(param); // 设置图片 if (0 == i) { pointIV.setScaleType(ImageView.ScaleType.FIT_XY); pointIV.setImageResource(R.mipmap.ic_launcher); } else { pointIV.setScaleType(ImageView.ScaleType.FIT_XY); pointIV.setImageResource(R.mipmap.logo); } // 将图片添加到线性布局中 pointL.addView(pointIV); } //----------定时器操作----------// handler = new Handler(); //获取当前页面 //页面+1 //跳转到下一个页面 runnable = new Runnable() { @Override public void run() { handler.postDelayed(runnable, 4000); //获取当前页面 int currentPage = headVp.getCurrentItem(); //页面+1 currentPage++; //跳转到下一个页面 headVp.setCurrentItem(currentPage); } }; handler.postDelayed(runnable, 4000);}三个方法的执行顺序: 用手指拖动翻页时, 先执行一遍onPageScrollStateChanged(1) 然后不断执行onPageScrolled 放手指时,直接立即执行一次onPageScrollStateChanged(2) 然后立即执行一次onPageSelected 然后再不断执行onPageScrolled 最后执行一次onPageScrollStateChanged(0) 滑动监听的三个方法 此方法会在屏幕滚动过程中不断调用 三个参数: 参数1:位置,当用手指滑动时,若手指按在页面不动,position和当前页 index保持一致,若手指向左拖动(相应页面向右翻动),此时position 大部分时间和当前页index一致,只有翻页成功时最后一次调用才会变为 目标页面的position 若手指向右拖动(相应页面向左翻动), 此时position大部分时间和目标页面 一致,只有翻页不成功的 情况最后一次调用才会变为原页面. 当直接setCurrentItem翻页时: 若是相邻切换(比如当前为页面2,要跳3或1) 若页面右翻,大部分时间position和当前页面一致,最后才变目标页面 若页面左翻,position和目标页面一致 若是不相邻切换 比如当前为页面1,要跳3: position先是0, 然后逐步变为1, 再逐步变为2 比如当前为3,要跳1: position先是1,然后逐步变为0,并不会出现4的情况 参数2:positionOffset - 当前页面滑动比例 若页面向右翻动,positionOffset值不断变大,最后在 趋近1的情况下突变为0 若页面向左翻动,此值不断变小,最后变为0 参数3:positionOffsetPixels - 当前页面滑动像素 变化情况和positionOffset一致@Overridepublic void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {}@Overridepublic void onPageSelected(int position) {//属性代码供全局使用 获取当前页面的图片位置currentPosition = position; for (int i = 0; i < datas.size() - 2; i++) {//设置下面的原点跟随变换图片 ImageView imageV = (ImageView) pointL.getChildAt(i); imageV.setImageResource(R.mipmap.logo); } handler.removeCallbacks(runnable); handler.postDelayed(runnable,4000);}@Overridepublic void onPageScrollStateChanged(int state) {//原点位置 int currentPagePosition = currentPosition;//判断是抬手还是放手 if (state == 0) {//滑到0位置说明第二张图片切换到了第一张 那么在么呢就在这里跳一下 if (0 == currentPosition) { headVp.setCurrentItem(datas.size() - 2, false); currentPagePosition = datas.size() - 2; }//正好相反 从倒数第二张滑到了最后一张else if (currentPosition == datas.size() - 1) { headVp.setCurrentItem(1, false); currentPagePosition = 1; }//让ImageView 原点设置图片 解释一下为什么-1 因为图片是八个 原点是六个 所以比如上面的if判断走完之后 是6 但是原点的最后一个位置是5 因为0开始的 这也就是为什么 else if 里为什么给它1了 ImageView imageV = (ImageView) pointL.getChildAt(currentPagePosition - 1); imageV.setImageResource(R.mipmap.ic_launcher); }}四秒自动播放轮播图就完成了 实现的方法比较简单
1 0
- android 简单的轮播图效果实现
- android简单实现轮播图效果
- 简单的轮播图效果实现
- android实现简单的手写笔迹效果
- Android漂浮动态效果的简单实现
- Android 实现模糊半透明效果的简单实现
- Android QuickAction效果简单实现
- Android实现简单刮刮卡效果
- Android毛玻璃效果简单实现
- Android Banner效果简单实现
- JavaScript代码实现简单的轮播图效果
- 使用javascript实现简单的轮播图效果
- 简单的实现轮播图和RecyclerView效果
- [Android][UI]模拟器启动界面动画效果的简单实现
- android 实现简单的触屏小圆移动效果
- android中图片翻页效果简单的实现方法
- android.graphics.Camera 实现简单的3D效果
- Android中再按一次退出效果的简单实现
- Linux学习1
- 学习mac开发第十弹 Mac 选择照片,拍照。
- springmvc DispatcherServlet和拦截器详解
- LeetCode 171. Excel Sheet Column Number 题解 —— Java
- Deeplearning4j例程(二) 加载本地模型预测未知图像
- android 简单的轮播图效果实现
- 计算天数
- js常见错误
- 如何修改Tomcat默认的808的端口号
- 2017-AHU校赛网络赛解题报告
- 性能测试工具LoadRunner版本:12.0 12.50 12.53
- 欢迎使用CSDN-markdown编辑器
- 8.非变异算法
- (完整版)原因可能是堆被损坏,这也说明 中或它所加载的任何DLL 中有bug】的解决