带指示点的无限轮播(直接可以向左滑,速度稳定,时间久了速度也不会变)
2016-09-08 18:49
435 查看
代码稍做修改可实现的效果:
直接 贴代码
轮播布局的xml:
下面为指示点时 指示点的 xml
右下角为圆圈数字的xml
适配器:
BasePagerAdapter:
工具类:
重写的页面改变监听:
使用:
数字圆 的 conner
无限轮播的分析图 :指示点及图片显示角标的对照
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>
相关文章推荐
- Android广告图片轮播控件,支持无限循环和5种主题,可以灵活设置轮播样式、时间、位置、图片加载框架等!
- Android广告图片轮播控件,支持无限循环和5种主题,可以灵活设置轮播样式、时间、位置、图片加载框架等!
- Android广告图片轮播控件,支持无限循环和5种主题,可以灵活设置轮播样式、时间、位置、图片加载框架等!
- Android广告图片轮播控件,支持无限循环和5种主题,可以灵活设置轮播样式、时间、位置、图片加载框架等!
- javascript可以直接比较时间字符串的大小
- C#代码生成器 如果发生重构或模板变更可以直接覆盖,在自动生成之后不会被覆盖,防止误操作?
- Android ViewPager+Handler实现无限轮播和监听处理事件时轮播速度越来越快的问题解决
- javascript可以直接比较时间字符串的大小
- 每门课由平时成绩和考试成绩组成,满分为r。现在他知道每门课的平时成绩为ai ,若想让这门课的考试成绩多拿一分的话,小v要花bi 的时间复习,不复习的话当然就是0分。同时我们显然可以发现复习得再多也不会拿到超过满分的分数。为了拿到奖学金,小v至少要花多少时间复习。
- [置顶] 自动轮播并且能够无限轮播的ViewPager,可纵向滑动、可修改滑动速度
- 连连看外挂,可以实现无限时间和无限提示
- QStringLiteral(源代码里有一个通过构造函数产生的从const char*到QString的隐式转换,QStringLiteral字符串可以放在代码的任何地方,编译期直接生成utf16字符串,速度很快,体积变大)
- Android的AnimationSet动画实现图片的轮播,移动和切换可以自定义时间
- EasySwift/YXJCycleView 任意视图的无限循环轮播图,可以是本地图片,可以是任意的view,可以是远程图片,再加文字描述岂不更好,pageController也支持高度自定义。
- C#代码生成器 如果发生重构或模板变更可以直接覆盖,在自动生成之后不会被覆盖,防止误操作?
- UIScrollView 实现广告栏的无限轮播(可设置自动播放时间)
- Android广告图片轮播,支持无限循环和设置轮播样式、切换时间等
- Android实现带指示点的自动轮播无限循环效果
- timestamp也可以直接被转换到UTC标准时区的时间
- sql 语句关于时间的比较; 直接用大于小于就好了; 注意时间格式; 也可以直接比较到秒