Android 类似淘宝的吸顶特效解决方案

news2024/11/17 13:55:09

运行图

布局的设计

要实现上面的效果需要搞定NestedScrollView和RecycleView的滑动冲突。有人要问RecycleView为何要滑动自动撑大不就好了么?这个问题其实对于有限的资源加载来说是很好的解决方案,但是如果涉及到的是图文结合的并且有大批量的数据的时候就需要用到RecycleView的复用机制,这样就要求RecycleView固定高度。

这里面涉及到的几个参数:

1:整屏高度 screenHeight  (用此方法可以省掉Context的传入)

    /**
     * 获取屏幕高度 px
     * @return
     */
    public static int getScreenHeightPixels() {
        return Resources.getSystem().getDisplayMetrics().heightPixels;
    }

2:头部悬浮框高度 floatActionBarHeight

这里直接用View去getHeight()就行,这个方法在使用的时候调用就好,如果一开始就调用有可能拿不到数据,因为页面还没加载完成

3:底部导航高度 bottomBarHeight

这个可以是固定值,看自己的设计是多大的,我的设定是48dp,所以转化后的结果是。

  //将设置的db转为屏幕像素
    public static int dp2px(int dpVal) {
        return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,
                dpVal, Resources.getSystem().getDisplayMetrics());
    }

4:悬浮tab的高度 floatTabBarHeight

跟导航的高度一样处理。

在这里RecycleView的高度值我们有了方案。

scrollRecycleHeight=screenHeight-floatActionBarHeight-bottomBarHeight-floatTabBarHeight

设置高度在数据返回回来的时候或者一开始的时候设置都行。

接下来要处理的就是滑动冲突的问题

NestedScrollingChildHelper 提供了一个禁止view滑动的方法,这个类封装在了RecycleView内部,所以RecycleView也可以调用。
 public void setNestedScrollingEnabled(boolean enabled) {
        if (this.mIsNestedScrollingEnabled) {
            ViewCompat.stopNestedScroll(this.mView);
        }

        this.mIsNestedScrollingEnabled = enabled;
    }

说到这里小伙伴可能会说那就简单了,只要NestedScrollView没有滑动到浮层tab的位置的时候都禁止RecyceView的滑动就好了,超出的时候允许其滑动是不是就可以解决了?

事实的情况并不是这样。当我们测试的时候,当我们慢慢滑动NestedScrollView,当屏幕出现RecycleView的时候,这时候NestedScroolView的滑动惯性还在继续,我们此时触摸滑动RecycleView 是可以滑动的。具体原因大家可以查看源码去分析下,这里不做分析。

解决方案

重写NestedScrollView 实现拦截。

public class NestedInsScrollView extends NestedScrollView {
    private int limitHeight = 0;
    private float startX, startY;

    public void setLimitHeight(int limitHeight) {
        this.limitHeight = limitHeight;
    }
    public NestedInsScrollView(@NonNull Context context) {
        super(context);
    }

    public NestedInsScrollView(@NonNull Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
    }

    public NestedInsScrollView(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }
    @Override
    public boolean onInterceptTouchEvent(MotionEvent ev) {
        int scrollY = 0;
        switch (ev.getAction()) {
            case MotionEvent.ACTION_DOWN:
                startX = ev.getX();
                startY = ev.getY();
                break;
            case MotionEvent.ACTION_MOVE:
                scrollY = getScrollY();
                // 判断是否需要拦截子View的滑动事件
                float offsetX = Math.abs(ev.getX() - startX);
                float offsetY = Math.abs(ev.getY() - startY);
                if (offsetY > offsetX && ev.getY() - startY < 0) {//向上的垂直滑动
                    if (scrollY < limitHeight) {
                        return true;
                    }
                }
                break;
            case MotionEvent.ACTION_UP:
            case MotionEvent.ACTION_CANCEL:
                break;
        }
        return super.onInterceptTouchEvent(ev);
    }
}

这里面通过重写onInterceptTouchEvent 在ACTION_MOVE事件中判断是否可以滚动,如果不允许RecycleView滚动则事件不往下分发。

这里面需要注意的点:

1:要判断事件是垂直滚动 (因为内部的View还要处理左右滚动的事件)

2:要判断是向上滚动 (因为头部的RecycleView还要处理下拉刷新)

3:最后只有满足垂直向上并且滚动距离达到tab的浮动距离的时候才拦截

     homeScrollView.setOnScrollChangeListener(new 
            NestedScrollView.OnScrollChangeListener() {
            @Override
            public void onScrollChange(NestedScrollView v, int scrollX, int     
                                  scrollY, int oldScrollX, int oldScrollY) {
                int limitHeight = ((ViewGroup) 
                homeScrollView.getChildAt(0)).getChildAt(0).getHeight();
                int topHeight = homeHeadTopLayout.getHeight();
                homeScrollView.setLimitHeight(limitHeight - topHeight -             
                DisplayUtils.dp2px(5));
                // 例如:
                if (scrollY >= limitHeight - topHeight - DisplayUtils.dp2px(5)) {
                    main_home_services_tab_recycle.setNestedScrollingEnabled(true);
                } else {
                   main_home_services_tab_recycle.setNestedScrollingEnabled(false);
                }
            }
        });

这时候再设置  setNestedScrollingEnabled(true/false);

就可以解决问题了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1140046.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

AquilaChat2-34B 主观评测接近GPT3.5水平,最新版本Base和Chat权重已开源!

两周前&#xff0c;智源研究院发布了最强开源中英双语大模型AquilaChat2-34B 并在 22项评测基准中综合能力领先&#xff0c;广受好评。为了方便开发者在低资源上运行 34B 模型&#xff0c;智源团队发布了 Int4量化版本&#xff0c;AquilaChat2-34B 模型用7B量级模型相近的GPU资…

分享119个ASP.NET源码总有一个是你想要的

分享119个ASP.NET源码总有一个是你想要的 链接&#xff1a;https://pan.baidu.com/s/1Mp0RugMnIJbS8Hrja4sCOQ?pwd8888 提取码&#xff1a;8888 项目名称 asp.net core 微服务 项目 ASP.NET Core 项目日志解决方案 Serilog Log4net ASP.NET Core分布式项目实战 asp.n…

GMT中标注特殊字符:平方,%,±号,希腊字母

在gmt中文社区的官网&#xff0c;我们可以得到以下的特殊字符表&#xff0c;通过在cmd命令窗口输入以下命令 gmt get PS_CHAR_ENCODING 查到你所安装的GMT的默认字符编码方式。如下图所示&#xff0c;本人是默认的ISOLation1 编码。 下面是一些具体的特殊字符的代码与标注效果…

使用网络摄像头进行眼睛注视估计 Mediapipe Gaze track

让我们看看下面的情况,你坐在图书馆里,你刚刚看到最漂亮的女人坐在图书馆的另一边。哎呀,她发现你在盯着她看。她估计你的目光在盯着她,而你通过理解她的目光指向你,注意到被她抓个正着。 眼睛凝视:一个人的眼睛聚焦的点 就像我们惊人的大脑毫不费力地完成许多任务一样,…

stable-diffusion-ui 下载和安装

简介 Stable Diffusion Web UI是一款基于Stable Diffusion基础应用的交互程序&#xff0c;它利用gradio模块搭建而成。这个模块除了具有txt2img、img2img等基本功能外&#xff0c;还包含许多模型融合改进、图片质量修复等附加升级。所有这些功能都可以通过易于使用的Web应用程…

漏洞复现-SeaCMS_v10.1_远程命令执行(CNVD-2020-22721)

SeaCMS_v10.1_远程命令执行(CNVD-2020-22721) 漏洞信息 seacms_v10.1有效cnvd-2020-22721命令执行漏洞 描述 海洋CMS一套程序自适应电脑、手机、平板、APP多个终端入口。 SeaCMS v10.1存在命令执行漏洞&#xff0c;在w1aqhp/admin_ip.php下第五行使用set参数&#xff0c;对…

不黑箱,不抽卡,分分钟带你拿捏SD中的色彩控制 | 京东云技术团队

导言 颜色控制一直是AIGC的难点&#xff0c;prompt会污染、img2img太随机… 今天带来利用controlnet&#xff0c;实现对画面颜色的有效控制。都说AIGC是抽卡&#xff0c;但对把它作为工具而非玩具的设计师&#xff0c;必须掌握如何控制它&#xff0c;让我们一起开始可控AI生成…

系列三、Spring Bean

一、什么是Spring bean * 一句话&#xff0c;被Spring容器管理的bean就是Spring bean。 二、Java bean和Spring bean对象之间的区别 Java bean的实例化对象是自己创建出来的&#xff0c;Spring的bean是IOC容器创建出来的。 三、配置bean有哪几种方式 * 答&#xff1a;有四…

ssh连接失败,提示ssh: connect to host port 22: Connection refused

情况描述 如图&#xff0c;ssh连接失败&#xff0c;连接显示器输入sudo netstat -tuln | grep 22命令查看占用22端口的服务&#xff0c;无任何输出&#xff0c;说明也不是默认端口22被占用的问题。 无法启动&#xff0c;提示如下查看 SSH 服务是否正在运行&#xff0c; syste…

ChatGLM2-6B模型尝鲜

一、前言 ChatGLM2-6B 是开源中英双语对话模型 ChatGLM-6B 的第二代版本&#xff0c;在保留了初代模型对话流畅、部署门槛较低等众多优秀特性的基础之上&#xff0c;ChatGLM2-6B 引入了如下新特性&#xff1a; 更强大的性能&#xff1a;基于 ChatGLM 初代模型的开发经验&#…

如何在忘记手机密码或图案时重置 Android 手机?

忘记手机密码或图案是 Android 用户一生中不得不面对的最令人沮丧的事情之一。恢复 Android 设备的唯一方法是在 Android 设备上恢复出厂设置。但许多用户不使用此方法&#xff0c;因为此过程会擦除您设备上可用的所有个人数据。 但是&#xff0c;有一种方法可以在不丢失任何数…

串口转HID键鼠功能芯片CH9329应用指南

概述 CH9329是一款串口转USB HID设备功能芯片&#xff0c;根据不同的工作模式&#xff0c;HID设备可以识别为&#xff1a;USB键盘设备、USB鼠标设备或者自定义HID类设备。接收串口数据&#xff0c;并自动根据串口工作模式进行数据解析&#xff0c;解析完成后按照HID类设备规范…

使用DBSyncer实现增量Mysql到Mysql的数据同步_DBSyncer1.2.4版本---数据同步之DBSyncer工作笔记006

之前都是用来postgresql到mysql的同步,需要配置postgresql的复制槽,对于mysq来说,需要配置: mysql启用binlog: https://gitee.com/ghi/dbsyncer/wikis/%E6%93%8D%E4%BD%9C%E6%89%8B%E5%86%8C/%E6%97%A5%E5%BF%97%E9%85%8D%E7%BD%AE%EF%BC%88%E6%95%B0%E6%8D%AE%E6%BA%90%EF%B…

基于springboot实现网上书城平台管理系统项目【项目源码+论文说明】计算机毕业设计

基于springboot实现网上书城平台管理系统演示 摘要 在Internet高速发展的今天&#xff0c;我们生活的各个领域都涉及到计算机的应用&#xff0c;其中包括网上书城管理系统的网络应用&#xff0c;在国外网上书城管理系统已经是很普遍的方式&#xff0c;不过国内的书城管理系统可…

GT-Works3 软件和 三菱GX-works2 GXworks3 程序设计软件的联机仿真

下面这个链接的视频教程可以使用与GT-Works3 软件和 GX-works2 GXworks3 程序设计软件的联机仿真。 简单的仿真起来非常方便。 链接: 三菱GX-Developer与三菱GT-Designer3使用及联机仿真 仿真画面&#xff1a;

上门预约上门洗衣洗鞋店管理软件;

洗衣洗鞋店干洗店管理软件。闪站侠洗衣软件。是一款优秀的洗衣管理系统。支持拍照功能。支持各种会员管理。支持小票和报表打印。功能强大。操作简单。上手容易。有多个案例&#xff0c;可以来体验&#xff01;

移动端ViT新利器!苹果提出稀疏专家混合模型Mobile V-MoEs

文章链接&#xff1a;https://arxiv.org/abs/2309.04354 最近&#xff0c;专家混合模型MoE受到了学术界和工业界的广泛关注&#xff0c;其能够对任意输入来激活模型参数中的一小部分来将模型大小与推理效率分离&#xff0c;从而实现模型的轻量化设计。目前MoE已经在自然语言处理…

vivo自研AI大模型即将问世,智能手机行业加速迈向AI时代

当前&#xff0c;以大模型为代表的人工智能技术已发展为新一轮科技革命和产业变革的重要驱动力量&#xff0c;被视作推动经济社会发展的关键增长极。 AI大模型潮起&#xff0c;千行百业走向百舸争流的AI创新应用期&#xff0c;前沿信息技术向手机、PC、车机等消费级终端加速渗…

基于Java的电影院订票管理系统设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序&#xff08;小蔡coding&#xff09; 代码参考数据库参考源码获取 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作者&am…

麒麟KYLINOS通过命令行配置kysec的防火墙

原文链接&#xff1a;麒麟KYLINOS通过命令行配置kysec的防火墙 hello&#xff0c;大家好啊&#xff0c;今天给大家带来一篇使用命令行配置kysec的防火墙的文章&#xff0c;通过本篇文章的学习&#xff0c;大家可以了解到图形化界面中的防火墙信息是如何生成的&#xff0c;为后期…