发表于: 2018-11-30 22:50:09
0 976
一、今天完成的事情
利用ViePager实现自动循环播放
思路:
自动播放:通过Handler.postDelayed()实现
循环播放:创建ViewPager视图时,其后各增加一个额外的页面,最前面的加载最后一个页面,最后面的加载第一个页面,比如原先要加载的页面顺序是 1、2、3,现在加载的顺序是3、1、2、3、1,监听ViewPager,当右>前滑动到第一个页面(3)时,调用setCurrentItem()方法切换到倒数第二个页面(3),当向左<滑动到最后一页面(1)时,立刻切换到第二个页面(1),这样就实现了循环播放,并且不会有违和感。其实不添加额外的页面也能实现,但是效果不好因为从最后一个页面切换到第一个页面时动画效果是向右<而不是向左>滚动,效果不太好。
效果:
基础知识:PagerAdapter
Google官方是建议使用Fragment来填充ViewPager的,这样可以更加方便的生成每个Page,以及管理每个Page的生命周期,提供了两个Fragment 专用的Adapter:FragmentPageAdapterFragmentStatePagerAdapter。
FragmentPageAdapter:和PagerAdapter一样,只会缓存当前的Fragment以及左边一个,右边 一个,即总共 会缓存3个Fragment而已,例如有1,2,3,4四个页面:
处于1页面:缓存1,2
处于2页面:缓存1,2,3
处于3页面:销毁1页面,缓存2,3,4
处于4页面:销毁2页面,缓存3,4
依次类推
FragmentStatePagerAdapter:当Fragment对用户不 见得时,整个Fragment会被销毁, 只会保存Fragment的状态!而在页面需要重新显示的时候,会生成新的页面!
综上,FragmentPageAdapter适合固定的页面较少的场合;而FragmentStatePagerAdapter则适合 于页面较多或者页面内容非常复杂(需占用大量内存)的情况。
需要重写四个方法,如果只是简单使用,只需重写getCount()和isViewFromObject()
getCount( ):获得viewpager中有多少个view
destroyItem( ):移除一个给定位置的页面。适配器有责任从容器中删除这个视图。这是为了确保 在finishUpdate(viewGroup)返回时视图能够被移除。
instantiateItem( ):①将给定位置的view添加到ViewGroup(容器)中,创建并显示出来 ②返回一个代表新增页面的Object(key),通常都是直接返回view本身就可以了, 当然你也可以自定义自己的key,但是key和每个view要一一对应的关系
isViewFromObject( ):判断instantiateItem(ViewGroup, int)函数所返回来的Key与一个页面视图是否是 代表的同一个视图(即它俩是否是对应的,对应的表示同一个View),通常我们直接写 return view == object;
实现循环播放
为ViewPager设置监听
topNewsVP.addOnPageChangeListener(this);
@Override
public void onPageScrollStateChanged(int state) {
switch(state) {
//静止
case ViewPager.SCROLL_STATE_IDLE:
int count = topNewsAdapter.getCount();
if (topNewsVP.getCurrentItem() == 0) {
//跳转到倒数第二
topNewsVP.setCurrentItem(count - 2, false);
} else if (topNewsVP.getCurrentItem() == count - 1) {
//跳转到第一
topNewsVP.setCurrentItem(1, false);
}
break;
......
}
}
实现自动播放
利用Hanlder和Runnable创建定时任务,每隔一段时间发送一次 任务
二、明天的计划
在RecyclerVIew中插入时间点
三、遇到的问题
自动播放的速度有时候会变快
四、收获
ViewPager、PagerAdapter
评论