ViewPager实现图片无限轮播(下)
来源:互联网 发布:遇害求救 知乎 编辑:程序博客网 时间:2024/05/24 01:47
上一篇写的是如何实现viewPager无限轮播效果(手动滑动)
以及解释了ViewPager在进行显示View时容易出现的Bug
在最后演示了
1.底部指示器效果
2.自动轮播效果
这一篇就来写写上面的两个功能是如何实现的
添加底部指示器效果
这个效果是当图片滑动的时候底部的小圆圈也会随着滑动而改变
1.设置指示器布局
在ViewPager的底部设置一个线性布局,线性布局中添加三个ImageView,就是三个小圆圈的样子
<RelativeLayout android:layout_width="match_parent" android:layout_height="140dp"> <android.support.v4.view.ViewPager android:layout_width="match_parent" android:layout_height="140dp" android:id="@+id/main_view_pager" ></android.support.v4.view.ViewPager> <!--图片轮播指示器--> <LinearLayout android:id="@+id/main_ll" android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="horizontal" android:layout_alignParentBottom="true" android:layout_centerHorizontal="true" android:layout_marginBottom="20dp" ></LinearLayout> </RelativeLayout>>
ViewPager和线性布局的指示器是重合的,所以两个的根布局为 RelativeLayout
因为也许我们并不知道我们的轮播器中需要轮播几张图片,所以线性布局的小圆圈是需要动态添加的
但是可以先将小圆圈的样子做出来(这个圆圈是自己画出来的)
<?xml version="1.0" encoding="utf-8"?><ImageView xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="10dp" android:layout_height="10dp" android:background="@drawable/banner_point" android:layout_margin="10dp" ></ImageView>
上面是向线性布局动态添加的小圆圈的样子,是一个ImageView
<?xml version="1.0" encoding="utf-8"?><selector xmlns:android="http://schemas.android.com/apk/res/android"><item android:state_selected="true"> <shape android:shape="oval"> <solid android:color="@android:color/holo_red_light"/> <stroke android:width="1px" android:color="@android:color/black" /> </shape></item> <item android:state_selected="false"> <shape android:shape="oval"> <solid android:color="@android:color/white"/> <stroke android:width="1px" android:color="@android:color/black" /> </shape> </item></selector>
select是我对小圆圈样子的绘制,不懂select的可以直接将这些复制到drawable目录下,我取名为
banner_point.xml
这样指示器的位置和小圆圈显示的样子就写完了
2.将小圆圈动态添加到线性布局当中
private void initPointData() { //images是一个数组,放置轮播的图片资源地址 int len = images.length; //判断一共几个数据就添加几个小圆点 for (int i = 0; i < len; i++) { //得到小圆点对象 ImageView imageView = (ImageView) LayoutInflater.from(SecondActivity.this).inflate(R.layout.view_banner_point, null); imageView.setImageResource(R.drawable.banner_point); //设置添加ImageView的宽高(像素) 在xml文件中虽然定义过但是不出现效果,需要在java文件中重新定义 LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(20, 20); //设置每个小圆圈的左右间距,会更加美观 lp.leftMargin = 10; lp.rightMargin = 10; imageView.setLayoutParams(lp); //将这个小圆圈View添加到线性布局当中(ll为线性布局的对象) ll.addView(imageView); } }
布局添加完了,下面就要添加对ViewPager滑动改变的监听,并改变小圆圈的颜色
3.根据滑动的改变,改变小圆圈的颜色
根据当前显示的position,改变小圆圈颜色的方法
//选中某一个指示器 private void setPoint(int position) { int len = images.length; for (int i = 0; i < len; i++) { //选择线性布局中第i个小圆圈 ImageView imageView = (ImageView) ll.getChildAt(i); //如果选择的小圆圈和当前显示的View的position是吻合的 if (i ==position) { //将第i个圆圈设成被选中状态 imageView.setSelected(true); } else { imageView.setSelected(false); } } }
在ViewPager的页面监听事件中,根据页面的切换,更改小圆圈的颜色
//viewPager的监听事件 private void initEvent() { viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() { //页面在滚动,页面的滑动信息 //positionOffset 滑动的百分比 positionOffsetPixels滑动的像素点 @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { } @Override public void onPageSelected(int position) { //修改小圆点显示的位置 setPoint(position % images.length); } @Override public void onPageScrollStateChanged(int state) { } }); }
通过上面的步骤就可以实现手动滑动ViewPager时,指示器的改变
自动轮播图片效果
实现每两秒钟图片自动切换
1.开启子线程,睡眠时间为两秒,两秒之后切换ViewPager
2.实例化一个Handler,在handler中更新UI
1.开启子线程,每隔两秒钟通知handler更新UI
//两秒钟切换一次界面 private class TimerThread extends Thread{ @Override public void run() { super.run(); //判断此界面是否存在 while (isAlive){ try { Thread.sleep(1000*2); if (isAlive) { //判断线程是否停止工作 if (isWorking) { handler.sendEmptyMessage(1); } } } catch (InterruptedException e) { e.printStackTrace(); } } } }
2.实例化Handler 更新UI
private Handler handler=new Handler(){ @Override public void handleMessage(Message msg) { super.handleMessage(msg); if (msg.what==1){ //切换到下一页 viewPager.setCurrentItem(viewPager.getCurrentItem()+1); } } };
开启线程
new TimerThread().start();
上面有两个变量
isAlive
因为此子线程是一个无限自动轮播,无限循环,当退出此界面时,为了防止内存泄漏,要将此线程中的while无限循环结束
isWorking
当手指进行滑动的时候线程的自动轮播要停止,防止出现手指滑动距离小(不足以翻页时),子线程就将ViewPager自动轮播到下一页
下面是当程序退出时,while循环也要关闭,子线程停止操作
@Override protected void onDestroy() { super.onDestroy(); isAlive=false; }
下面是ViewPager监听事件(initEvent()方法)中的判断用户点击状态的事件
@Override public void onPageScrollStateChanged(int state) { //处于空闲状态,线程工作 if(state==ViewPager.SCROLL_STATE_IDLE){ isWorking=true; //手动进行拖拽状态 }else if(state==ViewPager.SCROLL_STATE_DRAGGING){ //线程停止轮播(并没有将线程杀死) isWorking=false; }
最终实现效果
最后放上此工程的源码地址
https://github.com/XuDaHaoRen/ViewPagerDemo
- ViewPager实现图片无限轮播(下)
- ViewPager实现图片无限轮播(上)
- ImageView实现图片的无限轮播 以及viewpager实现图片的无限轮播
- ViewPager实现无限轮播
- ViewPager无限轮播实现
- Android ViewPager从网络获取图片实现无限轮播
- Android之ViewPager实现图片无限循环轮播
- 使用Viewpager Indicator实现图片无限轮播
- ViewPager网络加载图片并无限轮播实现
- 使用Viewpager Indicator实现图片无限轮播
- ViewPager无限轮播(网上加载图片)
- viewpager自动无限轮播(网络请求的图片)
- handler+viewpager无限轮播图片
- ViewPager的图片无限轮播
- ViewPager网络加载图片+无限轮播
- ViewPager无限轮播(网络图片
- ViewPager加载图片自动无限轮播
- ViewPager无限轮播+GridView图片展示
- JAVA面向对象之包装类
- VMWare下的CentOs的磁盘扩容以及与windows文件系统的关系对比
- Thinkphp5学习(14)读取器和修改器
- Excel应用-人生格子(30*30)的绘制
- Android 常用控件(二)
- ViewPager实现图片无限轮播(下)
- hdu 4857 逃生 反向拓扑排序
- git 修改已提交的内容
- windows里,通过vnc连接Ubuntu主机的最佳体验
- 一般性假币称重鉴别问题
- Linux例行性工作之系统配置文件(用户级crontab -e与系统级/etc/crontab)
- windows 安装scipy
- 是夜 到此
- sizeof()与strlen()的区别 memcpy memmove区别和实现