带指示点的无限轮播(直接可以向左滑,速度稳定,时间久了速度也不会变)
来源:互联网 发布:淘宝app最新版本下载 编辑:程序博客网 时间:2024/04/30 10:06
代码稍做修改可实现的效果:
无限轮播的分析图 :指示点及图片显示角标的对照
直接 贴代码
package myapp.first.myapplication.view;import android.content.Context;import android.os.Handler;import android.os.Message;import android.support.v4.view.PagerAdapter;import android.support.v4.view.ViewPager;import android.util.AttributeSet;import android.view.MotionEvent;import android.view.View;import android.view.ViewGroup;/** * Created by xi on 2016/7/9. */public class RollViewPager extends ViewPager { public RollViewPager(Context context) { super(context); } public RollViewPager(Context context, AttributeSet attrs) { super(context, attrs); } @Override public void addOnPageChangeListener(OnPageChangeListener listener) { MyPageChangeListener myPageChangeListener = new MyPageChangeListener(listener); super.addOnPageChangeListener(myPageChangeListener); } @Override public void setAdapter(PagerAdapter adapter) { // 修正 adapter 中position MyAdapter myAdapter = new MyAdapter(adapter); addOnPageChangeListener(null); //手动增加一个监听 super.setAdapter(myAdapter); setCurrentItem(1); //开启自动轮播 startScroll();//自动轮播 } @Override public boolean onTouchEvent(MotionEvent ev) { //手指触摸 按下 停止轮播 抬起继续轮播 switch (ev.getAction()){ case MotionEvent.ACTION_DOWN: stopScroll(); break; case MotionEvent.ACTION_MOVE: break; case MotionEvent.ACTION_CANCEL://取消事件 case MotionEvent.ACTION_UP: startScroll(); break; } return super.onTouchEvent(ev); } Handler handler = new Handler(){ @Override public void handleMessage(Message msg) { super.handleMessage(msg); int currentItem = getCurrentItem(); currentItem ++; setCurrentItem(currentItem); handler.sendEmptyMessageDelayed(1, 4000);//4s发送消息 } }; public void startScroll() { //开启轮播 handler.sendEmptyMessageDelayed(1, 4000);//4s发送消息 } public void stopScroll(){ handler.removeMessages(1); } public class MyPageChangeListener implements OnPageChangeListener { private OnPageChangeListener listener; private int position; public MyPageChangeListener(OnPageChangeListener listener) { this.listener = listener; } @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { if (listener != null) listener.onPageScrolled(position, positionOffset, positionOffsetPixels); } @Override public void onPageSelected(int position) { this.position = position; if (listener != null) listener.onPageSelected(position); } @Override public void onPageScrollStateChanged(int state) { //状态改变的时候 调用 手指抬起的时候切换 if (state == ViewPager.SCROLL_STATE_IDLE) { //空闲切换 // 页面切换 自动的切换到对应的界面 最后一个A----->第一个A if (position == getAdapter().getCount() - 1) { //最后一个元素 是否平滑切换 setCurrentItem(1, false); } else if (position == 0) { //是第一个元素{D] ----> 倒数第二个元素[D] setCurrentItem(getAdapter().getCount() - 2, false); } } if (listener != null) listener.onPageScrollStateChanged(state); } } public class MyAdapter extends PagerAdapter { private PagerAdapter adapter; public MyAdapter(PagerAdapter adapter) { this.adapter = adapter; //[ABCD] } @Override public Object instantiateItem(ViewGroup container, int position) { // position 已经是 [DABCDA] 的索引了 // 修正后的索引 应该是 [ABCD]的索引 //修正position if (position == 0) { //新增的D position = adapter.getCount() - 1;// 最后一个元素 } else if (position == getCount() - 1) { //最后一个元素 A position = 0; } else { position -= 1; //计算新的索引 } return adapter.instantiateItem(container, position); } @Override public void destroyItem(ViewGroup container, int position, Object object) { adapter.destroyItem(container, position, object); } @Override public int getCount() { return adapter.getCount() + 2; } @Override public boolean isViewFromObject(View view, Object object) { return adapter.isViewFromObject(view, object); } }}
轮播布局的xml:
<?xml version="1.0" encoding="utf-8"?><FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <myapp.first.myapplication.view.RollViewPager android:id="@+id/roll_viewpager" android:layout_width="match_parent" android:layout_height="match_parent"/> <include layout="@layout/ll_roll_point"/> <!--<include layout="@layout/ll_roll_number"/>--></FrameLayout>
下面为指示点时 指示点的 xml
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/ll_point" android:gravity="bottom|center_horizontal" android:layout_gravity="bottom" android:layout_width="match_parent" android:layout_height="match_parent" android:background="#00000000" android:layout_marginBottom="8dp" android:orientation="horizontal"></LinearLayout>
右下角为圆圈数字的xml
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="45dp" android:layout_height="45dp" android:gravity="center" android:layout_gravity="right|bottom" android:paddingTop="5dp" android:layout_marginBottom="11dp" android:layout_marginRight="13dp" android:id="@+id/ll_roll_number" android:background="@drawable/roll_circle_conner"> <TextView android:id="@+id/tv_current_number" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textColor="#ffffff" android:textSize="20dp" android:layout_marginBottom="3dp" android:text="1"/> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:textColor="#ffffff" android:textSize="18dp" android:text="/"/> <TextView android:id="@+id/tv_count_number" android:textColor="#ffffff" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="n" android:layout_centerVertical="true" android:layout_toRightOf="@+id/chu" android:layout_toEndOf="@+id/chu" /></LinearLayout>
适配器:
package myapp.first.myapplication.adapter;import android.content.Context;import android.view.ViewGroup;import android.widget.ImageView;import com.bumptech.glide.Glide;import java.util.List;import myapp.first.myapplication.R;/** * @Author Xi * Created by zz.wbkj.xi on 2016/8/15. */public class RollViewPagerAdapter extends BasePagerAdapter<Integer> { public RollViewPagerAdapter(Context context, List<Integer> dataList) { super(context, dataList); } @Override public Object instantiateItem(ViewGroup container, int position) { ImageView imageView = new ImageView(mContext); imageView.setScaleType(ImageView.ScaleType.CENTER_CROP); imageView.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT)); container.addView(imageView); Glide.with(mContext) .load(dataList.get(position))// .load(R.mipmap.ic_launcher)// .placeholder(R.mipmap.not_login_bg)// .error(R.mipmap.not_login_bg) .into(imageView);// Glide.with(mContext).load(NetPath.BASE_IMG_PATH+dataList.get(position).getPath()).into(imageView);// LogUtils.e(mContext,"加载轮播图",position+""); return imageView; }}
BasePagerAdapter:
package myapp.first.myapplication.adapter;import android.content.Context;import android.support.v4.view.PagerAdapter;import android.view.View;import android.view.ViewGroup;import java.util.List;/** * @Author Xi * Created by zz.wbkj.xi on 2016/8/13. */public abstract class BasePagerAdapter<T> extends PagerAdapter { public Context mContext; public List<T> dataList; public BasePagerAdapter(Context context , List<T> dataList) { this.mContext = context; this.dataList = dataList; } @Override public int getCount() { return dataList.size(); } @Override public boolean isViewFromObject(View view, Object object) { return view == object; } @Override public abstract Object instantiateItem(ViewGroup container, int position) ; @Override public void destroyItem(ViewGroup container, int position, Object object) { container.removeView((View) object); }}
工具类:
package myapp.first.myapplication.tools;import android.content.Context;/** * @Author Xi * Created by zz.wbkj.xi on 2016/8/15. */public class DensityUtil { /** * 根据手机的分辨率从 dp 的单位 转成为 px(像素) */ public static int dip2px(Context context, float dpValue) { final float scale = context.getResources().getDisplayMetrics().density; return (int) (dpValue * scale + 0.5f); } /** * 根据手机的分辨率从 px(像素) 的单位 转成为 dp */ public static int px2dip(Context context, float pxValue) { final float scale = context.getResources().getDisplayMetrics().density; return (int) (pxValue / scale + 0.5f); }}
package myapp.first.myapplication.tools;import android.content.Context;import android.view.ViewGroup;import android.widget.ImageView;import android.widget.LinearLayout;import android.widget.TextView;import java.util.List;import myapp.first.myapplication.R;import myapp.first.myapplication.adapter.RollViewPagerAdapter;import myapp.first.myapplication.listener.RollViewPagerOnPageChangeListener;import myapp.first.myapplication.view.RollViewPager;/** * @Author Xi * Created by zz.wbkj.xi on 2016/8/16. */public class RollUtils { private static LinearLayout.LayoutParams layoutParams; /*** * 处理轮播点 * @param mContext * @param rollList * @param ll_point * @param pointSelectorResourceId * @param rollViewPager */ public static void dealPoint(Context mContext,List rollList, LinearLayout ll_point, int pointSelectorResourceId, RollViewPager rollViewPager){ ll_point.removeAllViews(); if (rollList.size()!=0) { for (int i = 0; i < rollList.size(); i++) { ImageView point = new ImageView(mContext);// point.setBackgroundResource(R.drawable.point_selector); point.setBackgroundResource(pointSelectorResourceId); if (i == 0) point.setEnabled(true); else { point.setEnabled(false); } if (layoutParams == null) layoutParams = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT); layoutParams.rightMargin = DensityUtil.dip2px(mContext, Float.valueOf(mContext.getResources().getString(R.string.point_margin))); // layoutParams.rightMargin = DensityUtil.px2dip(mContext,Float.valueOf(15)); ll_point.addView(point, layoutParams); }// LogUtils.e(mContext, "添加指示点", ""); } rollViewPager.addOnPageChangeListener(new RollViewPagerOnPageChangeListener(mContext,rollList,ll_point));// rollViewPager.setCurrentItem(0); } /*** * 处理数字 * @param mContext * @param rollList * @param tv_count_number * @param tv_current_number * @param rollViewPager */ public static void dealNumber(Context mContext,List rollList, TextView tv_count_number,TextView tv_current_number, RollViewPager rollViewPager){ tv_count_number.setText(String.valueOf(rollList.size())); rollViewPager.addOnPageChangeListener(new RollViewPagerOnPageChangeListener(mContext,rollList,tv_current_number)); }}
重写的页面改变监听:
package myapp.first.myapplication.listener;import android.content.Context;import android.support.v4.view.ViewPager;import android.widget.LinearLayout;import android.widget.TextView;//import com.basedemo.my.xi.basedemo.utils.LogUtils;import java.util.List;/** * @Author Xi * Created by zz.wbkj.xi on 2016/8/16. */public class RollViewPagerOnPageChangeListener implements ViewPager.OnPageChangeListener { private Context mContext; private LinearLayout ll_point; private List rollList; private int lastPosition ; TextView tv_currentNumber; boolean isPoint; boolean isNumber; public RollViewPagerOnPageChangeListener(Context context , List rollList, LinearLayout ll_point) { this.mContext = context; this.rollList = rollList; this.ll_point = ll_point; isPoint = true; isNumber = false; } public RollViewPagerOnPageChangeListener(Context context , List rollList, TextView tv_currentNumber) { this.mContext = context; this.rollList = rollList; this.tv_currentNumber = tv_currentNumber; isNumber = true; isPoint = false; } @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { } @Override public void onPageSelected(int position) { if (isPoint) { if (rollList.size() != 0) { position = position % rollList.size(); if (position != 0){ position = position -1; }else { position = rollList.size()-1; } ll_point.getChildAt(lastPosition).setEnabled(false); ll_point.getChildAt(position).setEnabled(true); lastPosition = position; } }else if (isNumber){ if (position > rollList.size()) { position = 1; } else if (position == 0) { position = rollList.size(); } tv_currentNumber.setText(String.valueOf(position)); } } @Override public void onPageScrollStateChanged(int state) { }}
使用:
package myapp.first.myapplication.ui;import android.view.LayoutInflater;import android.view.View;import android.widget.LinearLayout;import android.widget.TextView;import java.util.ArrayList;import java.util.List;import myapp.first.myapplication.R;import myapp.first.myapplication.adapter.RollViewPagerAdapter;import myapp.first.myapplication.base.MyBaseFragment;import myapp.first.myapplication.tools.RollUtils;import myapp.first.myapplication.view.RollViewPager;/** * Created by Administrator on 2016/10/7 0007. */public class FragmentRbtn2 extends MyBaseFragment { private LinearLayout ll_fragment2; @Override public void init() { } @Override public int getLayoutResID() { return R.layout.fragment_rbtn2; } List<Integer> list = new ArrayList<>(); @Override public void initView(View view) { ll_fragment2 = (LinearLayout) view.findViewById(R.id.ll_fragment2); View rollView = LayoutInflater.from(mContext).inflate(R.layout.rollviewpager,null); RollViewPager rollViewPager = (RollViewPager) rollView.findViewById(R.id.roll_viewpager); LinearLayout ll_point = (LinearLayout) rollView.findViewById(R.id.ll_point);// TextView tv_current_number = (TextView) rollView.findViewById(R.id.tv_current_number);// TextView tv_count_number = (TextView) rollView.findViewById(R.id.tv_count_number); ll_fragment2.addView(rollView); list.clear(); list.add(R.mipmap.lambo); list.add(R.mipmap.wheel); list.add(R.mipmap.zhanweitu); rollViewPager.setAdapter(new RollViewPagerAdapter(mContext,list)); RollUtils.dealPoint(mContext,list,ll_point,R.drawable.point_selector,rollViewPager);// RollUtils.dealNumber(mContext,list,tv_count_number,tv_current_number,rollViewPager); } @Override public void initData() { } @Override public void initListener() { }}
<?xml version="1.0" encoding="utf-8"?><selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:state_enabled="false" android:drawable="@mipmap/dian_off"/> <item android:state_enabled="true" android:drawable="@mipmap/dian_on"/></selector>
数字圆 的 conner
<?xml version="1.0" encoding="utf-8"?><shape xmlns:android="http://schemas.android.com/apk/res/android"> <corners android:radius="30dp" /> <solid android:color="#c6c7cc" /> <stroke android:width="0dp" android:color="#00000000"/></shape>
1 0
- 带指示点的无限轮播(直接可以向左滑,速度稳定,时间久了速度也不会变)
- 资讯类项目无限轮播Banner+圆点指示
- android自定义无限轮播的轮播图,可动态添加指示点,可点击跳转页面
- RecyclerView里嵌套带小圆点的无限轮播
- viewpager的无限轮播和带点
- 稳定--恐怖的速度
- 网易的响应速度变慢了
- 解决viewpager自动轮播速度变快的问题
- 带bar的横向图片循环轮播(可修改轮播速度)
- 自动轮播并且能够无限轮播的ViewPager,可纵向滑动、可修改滑动速度
- 只需九招就可以让你的硬盘读取速度变快
- 带黑点的无限图片轮播
- 时间久了不访问站点站点会变得很慢
- ViewPager+小圆点的无限轮播
- 无限轮播的小圆点设置
- 无限轮播的小圆点设置
- 根据接口获取图片的无限轮播,带小圆点+Listview
- 电脑用久了,运行速度慢了,教你们怎样清除电脑里面的垃圾
- Windows系统资源性能常用计数器
- android 最简单的颜色渐变动画
- 哪本书是对程序员最有影响、每个程序员都该阅读的书?
- 关于Collections.reverseOrder
- 高德地图在fragment切换时闪黑屏
- 带指示点的无限轮播(直接可以向左滑,速度稳定,时间久了速度也不会变)
- nyoj 16 矩形嵌套
- 7.6.2 内部排序算法的应用
- 有章法的学习c++(7)变量
- Cocos2d-x 3.x的坑有哪些
- Maximum Subarray
- 多级次动态合并表格行
- java 字符串括号匹配
- 这个错误跟我之前的不一样,不是clean一下就可以解决的,这个要把所有引用的module的support包全部改成同一个版本的,Android API改成同一个版本的即可。 如果改完了还报这个重复的错