博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android Recyclerview 实现画廊功能
阅读量:6756 次
发布时间:2019-06-26

本文共 2695 字,大约阅读时间需要 8 分钟。

你有你的各种需(借)求(鉴),我有我的各种措施,不是很强,但是很酷! 安排~(听说这句话最近很火)

最近啊,公司有个需求,想实现一个画廊效果,我找了两个App去给他看,问他是要类似于viewpager的有翻页的效果,还是想要跟列表似的,手滑动到哪里就停留在哪里。 然后产品回复我说:就跟它的一样(某个app),按照他的做就行,我的心里有些波澜,甚至想****;好了不说了。写效果吧。

img_b58b17108a3c136817b0fd04d970d5f9.gif
gif.gif

不知道为什么是反着的,啊,凑合看吧。就是这种卡片轮播。

其他的不说了,直接上代码。

//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,到这里。下课。

转载地址:http://vdzeo.baihongyu.com/

你可能感兴趣的文章
读取Hive中所有表的表结构,并在新Hive库中创建表,索引等
查看>>
XenServer部署系列之02——系统安装及许可
查看>>
linux下FTP服务器搭建
查看>>
程序的查询 ps - 笔记1
查看>>
Conversion to Dalvik format failed with error 1的又一种情形
查看>>
nodejs抓取数据二(列表解析)
查看>>
TextView中实现可点击链接的显示
查看>>
HAOI 树上操作
查看>>
深刻理解Python中的元类(metaclass)以及元类实现单例模式
查看>>
java随机生成n个不相同的整数
查看>>
DIV+CSS基础
查看>>
使用JS完成首页定时弹出广告图片
查看>>
codeforces 500c New Year Book Reading 【思维】
查看>>
Auto reloading enabled
查看>>
GitHub的使用方法
查看>>
AT3576 Popping Balls
查看>>
springboot入门_多数据源
查看>>
如果一个游戏上面加一个透明层,js能不能实现 点击透明层的任意点 而正常玩游戏...
查看>>
图的m着色问题
查看>>
oracle 查询char类型的数据
查看>>