Android Recyclerview 实现画廊功能

简介: 你有你的各种需(借)求(鉴),我有我的各种措施,不是很强,但是很酷! 安排~(听说这句话最近很火)最近啊,公司有个需求,想实现一个画廊效果,我找了两个App去给他看,问他是要类似于viewpager的有翻页的效果,还是想要跟列表似的,手滑动到哪里就停留在哪里。

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

最近啊,公司有个需求,想实现一个画廊效果,我找了两个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,到这里。下课。

相关文章
|
1月前
|
XML 缓存 Android开发
Android开发,使用kotlin学习多媒体功能(详细)
Android开发,使用kotlin学习多媒体功能(详细)
103 0
|
3月前
|
API Android开发 开发者
Android UI设计: 什么是RecyclerView?为什么它比ListView更好?
Android UI设计: 什么是RecyclerView?为什么它比ListView更好?
31 2
|
3月前
|
安全 Linux Android开发
Android 安全功能
Android 安全功能
37 0
|
4天前
|
Java Android开发
Android Mediatek 应用层重置USB设备功能
Android Mediatek 应用层重置USB设备功能
11 0
|
4月前
|
XML 前端开发 Java
Android App实战项目之实现手写签名APP功能(附源码,简单易懂 可直接实用)
Android App实战项目之实现手写签名APP功能(附源码,简单易懂 可直接实用)
50 0
|
4月前
|
Android开发 Kotlin
android开发,使用kotlin学习滚动控件RecyclerView
android开发,使用kotlin学习滚动控件RecyclerView
39 0
|
4月前
|
传感器 物联网 Android开发
【Android App】物联网中查看手机支持的传感器及实现摇一摇功能-加速度传感器(附源码和演示 超详细)
【Android App】物联网中查看手机支持的传感器及实现摇一摇功能-加速度传感器(附源码和演示 超详细)
69 1
|
4月前
|
XML Java 定位技术
【Android App】定位导航GPS中开启手机定位功能讲解及实战(附源码和演示 超详细)
【Android App】定位导航GPS中开启手机定位功能讲解及实战(附源码和演示 超详细)
118 0
|
4月前
|
XML 前端开发 Java
【Android App】三维处理中三维投影OpenGL功能的讲解及实战(附源码和演示 超详细必看)
【Android App】三维处理中三维投影OpenGL功能的讲解及实战(附源码和演示 超详细必看)
34 1
|
4月前
|
JSON 语音技术 Android开发
【Android App】在线语音识别功能实现(使用云知声平台与WebSocket 超详细 附源码)
【Android App】在线语音识别功能实现(使用云知声平台与WebSocket 超详细 附源码)
35 0