android gallery滑动监听,利用RecyclerView和ViewPager实现GalleryView可无限左滑右滑
导包
implementation 'com.android.support:design:28.0.0'
implementation 'com.android.support:recyclerview-v7:28.0.0'
一个是ViewPager所在包,另一个是RecyclerView所在包
RecyclerView实现GalleryView效果可(伪无限)无限左滑右滑
先上效果图
RecyclerView实现的GalleryView效果
要点:
在有限的数据里面, 实现无限个Item,也就是可循环
在第一次显示的时候, 就可以左滑
滑动Item被放大
用RecyclerView实现GalleryView效果已经有BCsl大神的BCsl/GalleryLayoutManager使用自定义 LayoutManager 实现 Android 中 Gallery 或者 ViewPager 控件的效果
美滋滋:-P
传送门在这里
支持垂直和水平两个方向,支持 RecycleView 的试图回收机制
在有限的数据里面,实现无限个Item
在RecyclerView.Adapter的方法中:
@Override
public int getItemCount() {
return Integer.MAX_VALUE;
}
Integer.MAX_VALUE,即2147483647(2^32-1),距离真正的无限大还是有点差距的,不过效果也可以
第一次显示的时候实现左滑
只需要在一开始的时候,产生一定的偏移量就可以左滑了
@Override
public void setAdapter(Adapter adapter) {
super.setAdapter(adapter);
scrollToPosition(getAdapter().getItemRawCount() * 10000);//开始时的偏移量
}
RecyclerView有4个滑动方法:
scrollBy(x,y)
scrollToPosition(int position)
smoothScrollToPosition(int position)
scrollToPositionWithOffset(position,0)
smoothScrollToPosition 其实可以理解成一个模拟的滑动操作,会回调那个滑动监听的回调方法,有滑动效果。而 scrollToPosition 相当于直接把你想要的东西再重绘到界面上,不带滑动效果。
smoothScrollToPosition(position)和scrollToPosition(position)效果基本相似,也是把你想显示的项显示出来,只要那一项现在看得到了,那它就罢工了,
不同的是smoothScrollToPosition是平滑到你想显示的项,而scrollToPosition是直接定位显示。
scrollToPositionWithOffset(position,0)可以定位到指定项如果该项可以置顶就将其置顶显示,第二个参数可以决定 距离顶部的offset 偏移量
scrollBy(x, y)这个方法是自己去控制移动的距离,单位是像素,所以在使用scrollBy(x, y)需要自己去计算移动的高度或宽度
如果使用BCsl大BCsl/GalleryLayoutManager的自定义 LayoutManager 实现的 Gallery 可使用以下方法初始化偏移量:
GalleryLayoutManager manager = new GalleryLayoutManager(GalleryLayoutManager.HORIZONTAL);
manager.attach(recyclerView, 1000000);
滑动Item放大
实现GalleryLayoutManager.ItemTransformer的方法重写即可
@Override
public void transformItem(GalleryLayoutManager layoutManager, View item, float fraction) {
//以圆心进行缩放
item.setPivotX(item.getWidth() / 2.0f);
item.setPivotY(item.getHeight() / 2.0f);
float scale = 1 - 0.433f * Math.abs(fraction); // 0.433f是放大的View面积和缩小的View面积的比值
item.setScaleX(scale);
item.setScaleY(scale);
}
ViewPager 实现GalleryView效果
继承JakeWharton/salvage大封装的可用于复用的PagerAdapterRecyclingPagerAdapter
支持View回收,美滋滋:-P
ViewPager实现GalleryView效果可无限左滑右滑
先上效果图
ViewPager实现的GalleryView效果
要点:
在有限的数据里面, 实现无限个Item,也就是可循环
在第一次显示的时候, 就可以左滑
滑动的Item被放大
ViewPager这里用到JakeWharton大实现的支持view的回收机制PagerAdapter RecyclingPagerAdapter继承这个PagerAdapter就可以实现类似RecyclerView的回收机制了
在有限的数据,实现循环
viewpagergallery.png
在 ViewPager 的首尾多添加一个 View,监听 ViewPager 滚动事件,当滑到边界时,设置当前 position 为中间的某个 item,不过这种方式容易出现页面闪动导致滑动不连贯,这是因为 ViewPager#setCurrentItem(item)是需要时间来完成测量及绘制的
mViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
}
@Override
public void onPageSelected(int position) {
if (position < 1) {
//如果item位置小于1,也就是滑动到第0个item的位置时,则直接跳转到倒数第二个view处,并关闭跳转动画
mViewPager.setCurrentItem(mPagerAdapter.getCount() - 2, false);
} else if (position > mPagerAdapter.getCount() - 2) {
//同理如果item位置大于倒数第二个view的位置,也就是滑动到最后一个item的位置时,则直接跳转到第二个view处,并关闭跳转动画
mViewPager.setCurrentItem(1, false);
}
}
@Override
public void onPageScrollStateChanged(int state) {
}
});
在ViewPagerAdapter的方法中:
实现起来较为简单。需要注意的是,我们需要设置 ViewPager 的初始 position
@Override
public int getItemCount() {
return Integer.MAX_VALUE;
}
在第一次显示的时候, 就可以左滑
这个简单只需要在一开始的时候,产生一定的偏移量就可以左滑了
/**这里需要将setOffscreenPageLimit的值设置成数据源的总个数,设置ViewPager缓存页面数量,最小可设置成屏幕可见的个数**/
mViewPager.setOffscreenPageLimit(mPagerAdapter.getCount());
/**设置ViewPager位置**/
mViewPager.setCurrentItem(1);
滑动的Item被放大
需在根节点设置android:clipChildren为false即可,默认为true
可以通过android:layout_gravity控制超出的部分如何显示。
android:clipChildren的意思:是否限制子View在其范围内
需要在父节点和ViewPager界面设置android:clipChildren属性
setPageTransformer(boolean reverseDrawingOrder, PageTransformer transformer))方法
通过创建一个类实现ViewPager.PageTransformer然后重写transformPage方法来实现切换效果
/**
* 核心就是实现transformPage(View page, float position)这个方法
**/
@Override
public void transformPage(View page, float position) {
//以圆心进行缩放
page.setPivotX(page.getWidth() / 2.0f);
page.setPivotY(page.getHeight() / 2.0f);
float scale = 1 - 0.433f * Math.abs(position);
page.setScaleX(scale);
page.setScaleY(scale);
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) {
page.getParent().requestLayout();
}
}
}
android gallery滑动监听,利用RecyclerView和ViewPager实现GalleryView可无限左滑右滑相关推荐
- RecyclerView跳转到指定位置,RecyclerView上下滑动监听,RecyclerView滑动速度
1.RecyclerView跳转到指定位置 只需调用recycleview的置顶方法: recyclerView.scrollToPosition(15); 如果你需要让第15item在屏幕居中,只需 ...
- android触摸滑动监听,Android 滑动监听的实例详解
Android 滑动监听的实例详解 摘要: ScollBy,ScollTo是对内容的移动,view.ScollyBy是对view的内容的移动 view,ScollTo是对内容的移动(移动到指定位置), ...
- android gridview滑动监听,Android GridView 滑动条设置一直显示状态(推荐)
Android GridView 滑动条设置一直显示状态(推荐) 模拟GridView控件: android:id="@+id/picture_grid" android:layo ...
- Android RecyclerView(九)滑动监听综述
Android RecyclerView(九)滑动监听 1 RecyclerView 的滑动监听 1.1 RecyclerView 设置滑动监听 mRecyclerView.setOnScrollLi ...
- Android监听左右滑删除通知,Android 滑动监听RecyclerView线性流+左右划删除+上下移动...
废话不多说了,直接给大家贴代码了.具体代码如下所示: xmlns:tools="http://schemas.android.com/tools" android:layout_w ...
- Android——滑动监听SwipeRefreshLayout+瀑布流Recycl+Butter自动生成
Android--滑动监听SwipeRefreshLayout+瀑布流Recycl+Butter自动生成 package c.example.jreduch09;import android.os.A ...
- Android开发之解决NestedScrollView滑动监听兼容低版本的方法
NestedScrollView的滑动监听目前仅限api23及以上,为了兼容低版本如下自定义方法 可以自定义NestedScrollView即可如下: package cn.net.gfan.worl ...
- android 标题栏颜色渐变和阴影,ScrollView上下滑动监听,及判断scrollView是否滚动到底部
1.创建 ScrollListener 接口监听滑动距离 public interface ScrollListener {void onScrollChanged(ScrollListenerVi ...
- android模拟点击滑动,模拟Android的view点击和滑动监听
一,简单形式的 /*模拟Android中的view 点击和滑动监听 * */ public class View { private OnClickListener onClickListener; ...
- Android中手势滑动监听简单实现
文章目录 背景 实现 手势监听器的声明和创建 对重写的相关方法 onScroll() 说明 手势监听器接管View的触屏事件 验证结果 背景 项目中要实现控件的滑动监听其实还是挺常见的,这里就简单的做 ...
最新文章
- 创业3年!猎头加价50%!一半中层骨干被挖走,研发就剩2个应届生!绝户套餐真够狠的!...
- 爬虫python编程与cvi编程_与爬虫无关,简单的用python进行科学运算
- Python元组介绍
- json模拟数据怎么用_在使用axios获取自己模拟的json数据是踩到的坑
- 程序员搞笑对联_程序员春节对联集锦
- ios程序后台运行设置(不是太懂)
- 什么是CMMI认证?有什么好处?
- Visual Studio 2019 c#的winform开发,基本操作
- java xsd解析_java dom4j解析XSD文件
- layui 勾选不联动父项 树形控件,treetable-lay
- 自媒体全套教程+全套工具(带教程)+原创实操教程
- 区块链开发基础知识学习
- GMM-HMM 详解
- 计算机科学与技术高校毕业生要求,计算机科学与技术 毕业要求(2020)
- 微信强制加入群软件!易语言协议版,公开源码
- NRF24L01+模块实现双向通信(带ACK payload)
- Vue 中 props 传值,父组件向子组件传递对象/数组可以直接修改的问题
- Marvolo Gaunt's Ring CodeForces - 855B+线段树+维护区间最大值和最小值
- cxf 实名认证---全国公民身份信息系统
- T560和为k的子数组
热门文章
- 计算机专业的八字,生辰八字自动计算器软件 生辰八字在线计算器
- java面试题框架知识点总结
- 用于Linux系统/网络管理的nmap命令的实例
- WPS中的公式编辑器如何打空格
- 程序员代码面试指南:IT 名企算法与数据结构题目最优解
- 华为NP课程笔记5-中间系统到中间系统实验
- 使用Python上传文件至服务器(不通过表单)
- ISO27001:2013体系认证
- 2021年计算机网络工程师真题,2021年计算机四级网络工程师题库完整版完整答案.doc...
- Design System Application - Chapter 2 字体 Typography