更多Android高级架构进阶视频学习请点击:https://space.bilibili.com/474380680
本篇文章将从ViewPager来介绍常用View:
文章目录
一、简介
二、基本使用
- xml引用
- page布局
- 创建适配器
- 设置适配器
- 标题栏
5.1. xml引用
5.2. 重写PagerAdapter的getTitle()方法 - 翻页动画
6.1. DepthPageTransformer
6.2. ZoomOutPageTransformer
6.3. 自定义动画
6.4. 开源框架ViewPagerTransforms - 翻页监听
7.1. 设置方法
7.2. 翻页监听接口
7.3. 重写方法
7.4. 使用
三、与Fragment结合使用
- 创建Fragment及相应的xml布局
- 给Viewpager设置数据和适配器
四、实现轮播图效果
- 特点
- 使用介绍
2.1. 导包 + 权限
2.2. xml引用
2.3. 创建图片加载器
2.4. 设置数据
五、实现画廊效果
- viewpager布局
- pager布局
- Adapter
- vp设置adapter
- 问题
一、简介
Viewpager,视图翻页工具,提供了多页面切换的效果。Android 3.0后引入的一个UI控件,位于v4包中。低版本使用需要导入v4包,但是现在我们开发的APP一般不再兼容3.0及以下的系统版本,另外现在大多数使用Android studio进行开发,默认导入v7包,v7包含了v4,所以不用导包,越来越方便了。
Viewpager使用起来就是我们通过创建adapter给它填充多个view,左右滑动时,切换不同的view。Google官方是建议我们使用Fragment来填充ViewPager的,这样 可以更加方便的生成每个Page,以及管理每个Page的生命周期。
Viewpager在Android开发中使用频率还是比较高的,下面开始一起学习吧!
二、基本使用
1. xml引用
2. page布局
3. 创建适配器
可直接new PagerAdapter,亦可创建它的子类
4. 设置适配器
效果:
5. 标题栏
给Viewpager设置标题栏有一下几种方式:
PagerTabStrip: 带有下划线
PagerTitleStrip: 不带下划线
TabLayout:5.0后推出
TabLayout的详细使用,可以看我的另一篇文章TabLayout。
下面介绍另外两个的使用方法,没什么区别:
1. xml引用
- 重写PagerAdapter的getTitle()方法
这两种方法作为了解,不常用,项目中还没用到过
效果:
6. 翻页动画
ViewPager有个方法叫做:
setPageTransformer(boolean reverseDrawingOrder, PageTransformer transformer) 用于设置ViewPager切换时的动画效果,并且google官方还给出了两个示例(因为使用的是属性动画,所以不兼容3.0以下)。
1. DepthPageTransformer
调用:
效果:
2. ZoomOutPageTransformer
调用:
效果:
3. 自定义动画
网上看到鸿洋大神写的
效果:
position说明:
当前显示页为0,前一页为-1,后一页为1,滑动过程中数值不断变大或变小,所以为float类型
4. 开源框架ViewPagerTransforms
里面有十几种翻页动画,基本够用了
Github地址:ViewPagerTransforms
7. 翻页监听
1. 设置方法
2. 翻页监听接口
3. 重写方法
onPageScrolled(int position, float positionOffset, int positionOffsetPixels)
页面滑动状态停止前一直调用
position:当前点击滑动页面的位置
positionOffset:当前页面偏移的百分比
positionOffsetPixels:当前页面偏移的像素位置
onPageSelected(int position)
滑动后显示的页面和滑动前不同,调用
position:选中显示页面的位置
onPageScrollStateChanged(int state)
页面状态改变时调用
state:当前页面的状态
SCROLL_STATE_IDLE:空闲状态
SCROLL_STATE_DRAGGING:滑动状态
SCROLL_STATE_SETTLING:滑动后滑翔的状态
- 使用
Log:
三、与Fragment结合使用
与Fragment结合使用其实也一样,只是用Fragment代替原先的View,填充Viewpager;然后就是Adapter不一样,配合Fragment使用的有两个Adapter:FragmentPagerAdapter和FragmentStatePagerAdapter。
相同点:
FragmentPagerAdapter和FragmentStatePagerAdapter都继承自PagerAdapter
不同点:
卸载不再需fragment时,各自采用的处理方法有所不同
FragmentStatePagerAdapter会销毁不需要的fragment。事务提交后, activity的FragmentManager中的fragment会被彻底移除。 FragmentStatePagerAdapter类名中的“state”表明:在销毁fragment时,可在onSaveInstanceState(Bundle)方法中保存fragment的Bundle信息。用户切换回来时,保存的实例状态可用来恢复生成新的fragment
FragmentPagerAdapter有不同的做法。对于不再需要的fragment, FragmentPagerAdapter会选择调用事务的detach(Fragment)方法来处理它,而非remove(Fragment)方法。也就是说, FragmentPagerAdapter只是销毁了fragment的视图, fragment实例还保留在FragmentManager中。因此,FragmentPagerAdapter创建的fragment永远不会被销毁
也就是:在destroyItem()方法中,FragmentStatePagerAdapter调用的是remove()方法,适用于页面较多的情况;FragmentPagerAdapter调用的是detach()方法,适用于页面较少的情况。但是有页面数据需要刷新的情况,不管是页面少还是多,还是要用FragmentStatePagerAdapter,否则页面会因为没有重建得不到刷新
使用如下:
1. 创建Fragment及相应的xml布局
2. 给Viewpager设置数据和适配器
效果:
四、实现轮播图效果
这里我就不自己实现了,介绍一个轮播图开源控件:banner
1. 特点
支持无限循环和多种主题
可以灵活设置轮播样式、动画、轮播和切换时间、位置、图片加载框架
2. 使用介绍
1. 导包 + 权限
2. xml引用
3. 创建图片加载器
4. 设置数据
以上是简单使用,更详细的用法可以直接到GitHub上去看,文档是中文的,很方便,API也很简单,上面已经给出链接
效果:(项目里截图不方便,直接拿的示例图)
五、实现画廊效果
效果如下:
实现步骤:
1. viewpager布局
要点:
给viewpager和它的父布局都设置属性android:clipChildren=“false”
. pager布局
item_banner_samll.xml
item_banner.xml
区别:
宽度,一个占满viewpager的宽度,一个小于viewpager的宽度
3. Adapter
如果是page宽度 < vp宽度,需要重写getPageWidth()方法,用于计算page占据vp的百分比
3. vp设置adapter
4. 问题
当page宽度 < vp宽度,且page的数量较少,没有占满vp,这时滑动vp,会出现闪屏,如下:
解决办法:
当明确知道vp放不下2个page时,可以如下处理
当vp可以放置两个以上的page时,也是个通用的方法
更多Android高级架构进阶视频学习请点击:https://space.bilibili.com/474380680
原文链接:https://blog.csdn.net/weixin_39251617/article/details/79399592