Android Recyclerview 实现画廊功能
你有你的各种需(借)求(鉴),我有我的各种措施,不是很强,但是很酷! 安排~(听说这句话最近很火)
最近啊,公司有个需求,想实现一个画廊效果,我找了两个App去给他看,问他是要类似于viewpager的有翻页的效果,还是想要跟列表似的,手滑动到哪里就停留在哪里。 然后产品回复我说:就跟它的一样(某个app),按照他的做就行,我的心里有些波澜,甚至想****;好了不说了。写效果吧。
不知道为什么是反着的,啊,凑合看吧。就是这种卡片轮播。
其他的不说了,直接上代码。
//recyclerview滑动监听 hignHeadRecycler.addOnScrollListener(new RecyclerView.OnScrollListener() { @Override public void onScrolled(RecyclerView recyclerView, int dx, int dy) { super.onScrolled(recyclerView, dx, dy); int childCount = recyclerView.getChildCount();//总item的数量 int width = recyclerView.getChildAt(0).getWidth();//第一个item的宽度 int padding = (recyclerView.getWidth() - width) / 2;//这个padding是 recycler的宽度减去第一个item的宽度然后除以2,作为padding for (int j = 0; j < childCount; j++) { View v = recyclerView.getChildAt(j);//获取每一个child float rate = 0;//是一个缩放比例 if (v.getLeft() <= padding) {//如果view距离左边的宽度 小于等于 左侧剩余空间(padding) (意味着这个view开始往左边滑动了,并且有遮挡) if (v.getLeft() >= padding - v.getWidth()) {//如果view距离左边的距离 小于等于滑进去的距离 (其实就是说滑动到一半的时候) rate = (padding - v.getLeft()) * 1f / v.getWidth();//(这个比例的计算结果一般都会大于1,这样一来,根据下面的 1- rate * 0.1 得出,这个比例最多不会到达1,也就是 1- 0.1, 也就是 0.9, 所以这个view的宽度最大不会小于他本身的90%) } else { rate = 1; } v.setScaleY(1 - rate * 0.1f); } else { if (v.getLeft() <= recyclerView.getWidth() - padding) {//这个过程大概是指这个view 从最后侧刚刚出现的时候开始滑动过padding的距离 rate = (recyclerView.getWidth() - padding - v.getLeft()) * 1f / v.getWidth(); } v.setScaleY(0.9f + rate * 0.1f); } } } }); //加载完成后的监听 hignHeadRecycler.addOnLayoutChangeListener(new View.OnLayoutChangeListener() { @Override public void onLayoutChange(View v, int left, int top, int right, int bottom, int oldLeft, int oldTop, int oldRight, int oldBottom) { if (hignHeadRecycler.getChildCount() < 3) { if (hignHeadRecycler.getChildAt(1) != null) { View v1 = hignHeadRecycler.getChildAt(1); v1.setScaleY(0.9f); } } else { if (hignHeadRecycler.getChildAt(0) != null) { View v0 = hignHeadRecycler.getChildAt(0); v0.setScaleY(0.9f); } if (hignHeadRecycler.getChildAt(2) != null) { View v2 = hignHeadRecycler.getChildAt(2); v2.setScaleY(0.9f); } } } });
在监听里写出了我自己的理解,想理解的就结合注释和代码看看,想直接拿去用当然也方便你,哈哈。
还有要注意一点,写Holder的时候,记得不要用match,这里我在Adapter里手动设置了一下。可以借鉴。
view.setLayoutParams(new LinearLayout.LayoutParams((int) (UiSizeHelper.getScreenWidth() * 0.9), LinearLayoutCompat.LayoutParams.WRAP_CONTENT)); //这里 (UiSizeHelper.getScreenWidth() * 0.9)指的是屏幕宽度的90%,这样一来左右两边就都能展示出一点了。
ok,到这里。下课。

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
Android端使用阿里OSS上传
最近一直没更新博客,因为都写到了公司的wiki上,我觉得博客是有必要的,记录一下自己成长过程中的一点一滴吧。 这节课,说一下阿里的OSS,可能会有一点坑。 还有我自己封装的一个比较low的工具类。 我们选择了将文件直接上传到OSS,然后拿到文件的url,将url交给服务器保存。这样一来就大大减少了服务器的压力。 直接上自己封装的工具类代码吧。(直接拿去就可以用) 1.配置依赖: compile'com.aliyun.[dpa:oss-android-sdk:+](http://dpaoss-android-sdk+/)'//这里用sdk+ 是为了随时跟随oss的版本更新,oss也会随时修复bug。 compile'com.squareup.[okhttp3:okhttp:3.4.1](http://okhttp3okhttp:3.4.1/)'// 由于OSS底层封装是ok,所以ok的依赖也得有 compile'com.squareup.[okio:okio:1.9.0](http://okiookio:1.9.0/)' 2.********这里权限就不贴代码了,什么网络权限,文件读取权...
- 下一篇
从源码看 Android 事件分发
Android 事件分发是安卓中一个很精妙的地方,很多开发人员有些不解,为什么呢?因为不知道怎么去运用,其实这个地方理解起来比较简单,我写这么一篇文章就是为了串一串这个知识点。 脱离源码浅谈分发 事件分发是在最上层 View 一直往下层传递事件,并通过 onTouchEvent(MotionEvent ev) 这个方法来分发的,如果某个 View 想处理这个事件就需要重写这个 onTouchEvent() 并且返回 True ,然后写自己的逻辑处理事件。 如果是 ViewGroup 想处理这个事件呢,那么他就要重写 onInterceptTouchEvent(MotionEvent ev) 方法并返回 True ,来拦截这个事件并交给 ViewGroup 的 onTouchEvent() 来处理这个事件。 如果 ViewGroup 里面的子 View 想处理这个事件怎么办,不要担心 Android 给我们提供了 requestDisallowInterceptTouchEvent(boolean b) 方法然后传入 True 就会阻止上一级 ViewGroup 拦截事件,然后子 Vie...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- SpringBoot2整合Redis,开启缓存,提高访问速度
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- CentOS7编译安装Gcc9.2.0,解决mysql等软件编译问题
- Mario游戏-低调大师作品
- CentOS7,8上快速安装Gitea,搭建Git服务器
- CentOS6,7,8上安装Nginx,支持https2.0的开启
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- Linux系统CentOS6、CentOS7手动修改IP地址
- CentOS关闭SELinux安全模块