当前位置: 首页 > news >正文

unity双层滑动实现

实现功能:
当滑动列表中内容处于顶端的时候,向上滑动优先滑动整个滑动列表,当滑动列表移动到设置位置,即设定的最高处时,继续移动列表内内容。向下移动亦然,当内容处于滑动列表顶端时,移动整个滑动列表。

eventtriggerlistener脚本可在这篇查看unity防止ui点击事件被子物体拦截

using UnityEngine;
using UnityEngine.UI;
using DG.Tweening;public class ScrollViewMove : MonoBehaviour
{public ScrollRect m_scorllView;public RectTransform m_rectView;private void Start(){//添加滑动事件Graphic horizontalGraphic = m_scorllView.GetComponent<Graphic>();if (horizontalGraphic != null && horizontalGraphic.raycastTarget){EventTriggerListener.Get(m_scorllView.gameObject).onBeginDrag = OnScrollBeginDrag;EventTriggerListener.Get(m_scorllView.gameObject).onDrag = OnScrollDrag;EventTriggerListener.Get(m_scorllView.gameObject).onEndDrag = OnScrollEndDrag;}//设置最高高度,和出现滑动时的阈值m_minHeight = m_scorllView.GetComponent<RectTransform>().localPosition.y;m_LimitY = (m_maxHeight - m_minHeight) * MOVE_DISTANCE_SCALE;}#region 滑动条事件//起始滑动位置private float m_startScrollHeight = 0f;//结束滑动位置private float m_endScrollHeight = 0f;//限制切换动画的最小判断private float m_LimitY;private readonly float MOVE_DISTANCE_SCALE = 0.2f;//起始鼠标位置private float m_startMouseHeight = 0f;//中途鼠标位置private float m_partMouseHeight = 0f;//最大高度private float m_maxHeight = 0f;//最小高度private float m_minHeight = 0f;//是否为展开状态private bool m_isOpen = false;/// <summary>/// 滑动列表开始拖拽事件/// </summary>/// <param name="obj"></param>private void OnScrollBeginDrag(GameObject obj){m_startScrollHeight = m_scorllView.GetComponent<RectTransform>().localPosition.y;m_startMouseHeight = Input.mousePosition.y;}/// <summary>/// 滑动列表拖拽事件/// 先判断走拖拽事件还是滑动列表滑动事件/// </summary>/// <param name="obj"></param>private void OnScrollDrag(GameObject obj){m_partMouseHeight = Input.mousePosition.y;float m_offsetHeight = m_partMouseHeight - m_startMouseHeight;m_startMouseHeight = m_partMouseHeight;float scrollPosY = m_scorllView.GetComponent<RectTransform>().localPosition.y;if (scrollPosY >= m_maxHeight){if (m_offsetHeight >= 0){m_scorllView.vertical = true;return;}else{if (m_scorllView.verticalNormalizedPosition < 1){m_scorllView.vertical = true;return;}}}else if (scrollPosY <= m_minHeight){if (m_offsetHeight <= 0){m_scorllView.vertical = true;return;}else{if (m_scorllView.verticalNormalizedPosition > 1){m_scorllView.vertical = true;return;}}}m_scorllView.verticalNormalizedPosition = 1;m_scorllView.vertical = false;OnPosDrag(m_offsetHeight);}/// <summary>/// 设置滑动位置/// </summary>/// <param name="offset"></param>private void OnPosDrag(float offset){//设置滑动列表位置Vector3 scrollPos = m_scorllView.GetComponent<RectTransform>().localPosition;float endPosY = scrollPos.y + offset;if (endPosY > m_maxHeight){offset = m_maxHeight - scrollPos.y;}else if (endPosY < m_minHeight){offset = m_minHeight - scrollPos.y;}scrollPos = new Vector3(scrollPos.x, scrollPos.y + offset, scrollPos.z);m_scorllView.GetComponent<RectTransform>().localPosition = scrollPos;//设置滑动列表遮罩大小Vector2 viewPos = m_rectView.offsetMin;viewPos = new Vector2(viewPos.x, viewPos.y - offset);m_rectView.offsetMin = viewPos;}/// <summary>/// 滑动列表结束拖拽事件/// </summary>/// <param name="obj"></param>private void OnScrollEndDrag(GameObject obj){m_endScrollHeight = m_scorllView.GetComponent<RectTransform>().localPosition.y;float offset = m_endScrollHeight - m_startScrollHeight;if (Mathf.Abs(offset) >= m_LimitY){m_isOpen = (offset > 0);}ScrollDragAni(m_isOpen);}//动画播放时间private readonly float TWEEN_POS_TIME = 0.2f;/// <summary>/// 滑动条动画/// </summary>/// <param name="isOpen"></param>private void ScrollDragAni(bool isOpen){Vector3 scrollPos = m_scorllView.GetComponent<RectTransform>().localPosition;if (isOpen){DOTween.To(() => scrollPos.y,(v) =>{Vector3 tmpVec = m_scorllView.GetComponent<RectTransform>().localPosition;float offset = v - tmpVec.y;OnPosDrag(offset);}, m_maxHeight, TWEEN_POS_TIME).OnComplete(() => { m_isOpen = true; });}else{DOTween.To(() => scrollPos.y,(v) =>{Vector3 tmpVec = m_scorllView.GetComponent<RectTransform>().localPosition;float offset = v - tmpVec.y;OnPosDrag(offset);},  m_minHeight, TWEEN_POS_TIME).OnComplete(() => { m_isOpen = false; });}}#endregion
}

设置,在滑动列表中,将ViewPort设置成顶端锚点
在这里插入图片描述

相关文章:

unity双层滑动实现

实现功能&#xff1a; 当滑动列表中内容处于顶端的时候&#xff0c;向上滑动优先滑动整个滑动列表&#xff0c;当滑动列表移动到设置位置&#xff0c;即设定的最高处时&#xff0c;继续移动列表内内容。向下移动亦然&#xff0c;当内容处于滑动列表顶端时&#xff0c;移动整个滑…...

浅谈AI技术创业有哪些机会?

一、AI技术创业概念简介 AI技术创业指的是利用人工智能&#xff08;Artificial Intelligence&#xff0c;AI&#xff09;技术进行创业活动。人工智能是指计算机系统能够模拟和展现出人类智能的一种技术。在AI技术创业中&#xff0c;创业者利用AI技术来解决现实生活中的问题&…...

大数据-TXT文本重复行计数工具

支持系统类型&#xff1a;Windows 64位系统 Linux 64位系统 苹果64位系统 硬盘要求&#xff1a;固态硬盘&#xff08;有效剩余磁盘空间大小最低3倍于大数据文件的大小&#xff09; 内存要求&#xff1a;最低8G&#xff08;例如只有几百G数据&#xff09; 如果处理TB级大数据文…...

【无标题】331

2024年3月31日19:26:09 和一个好感度为40的女生完成了一次基础的对话 2024年3月31日19:26:26 在群里完成了一个毫无所谓的对话 2024年3月31日19:40:04开始准备写论文了 2024年3月31日19:40:11好感度为40的女生回复了我本质上是回复率只有40的人回复了我那应该感到高兴才对 …...

MIT最新研究成果 机器人能够从错误中纠偏 无需编程介入和重复演示

目前科学家们正在努力让机器人变得更加智能&#xff0c;教会他们完成诸如擦拭桌面&#xff0c;端盘子等复杂技能。以往机器人要在非结构化环境执行这样的任务&#xff0c;需要依靠固定编程进行&#xff0c;缺乏场景通用性&#xff0c;而现在机器人的学习过程主要在于模仿&#…...

C语言—指针数组

从键盘任意输入一个整型表示的月份值&#xff0c;用指针数组编程输出该月份的英文表示&#xff0c;若输入的月份值不在1&#xff5e;12之间&#xff0c;则输出“Illegal month”。 **输入格式要求&#xff1a;"%d" 提示信息&#xff1a;"Input month number:&q…...

OpenCV图像二值化

1.二值图像 灰度图像 0 - 255二值图像 0&#xff08;黑&#xff09; / 255&#xff08;白&#xff09; 2.二值分割 五种阈值分割方法&#xff08;阈值T&#xff09;&#xff1a; 大于T为255&#xff0c;小于T为0 大于T为0&#xff0c;小于T为255 小于T为原值 else T 小于…...

java中的抽象类

抽象类是指包含了抽象方法的类。在java中&#xff0c;抽象方法指的是用abstract关键字进行修饰的方法&#xff0c;抽象方法与普通的方法的最大区别就是抽象方法没有方法体&#xff0c;也就是说抽象方法是没有具体的实现的。这也就意味着在抽象类的子类中调用抽象方法时&#xf…...

代码随想录算法训练营第二十天| 654.最大二叉树、617.合并二叉树、700.二叉搜索树中的搜索、98.验证二叉搜索树

系列文章目录 目录 系列文章目录654.最大二叉树递归法[左闭右开)[左闭右闭] 617.合并二叉树递归法&#xff08;前中后序都可&#xff0c;以前序为例&#xff09;迭代法&#xff08;类似 101. 对称二叉树 写法&#xff0c;可用双端队列/单端队列<栈>&#xff0c;以单端队列…...

2014年认证杯SPSSPRO杯数学建模A题(第二阶段)轮胎的花纹全过程文档及程序

2014年认证杯SPSSPRO杯数学建模 A题 轮胎的花纹 原题再现&#xff1a; 轮胎被广泛使用在多种陆地交通工具上。根据性能的需要&#xff0c;轮胎表面常会加工出不同形状的花纹。在设计轮胎时&#xff0c;往往要针对其使用环境&#xff0c;设计出相应的花纹形状。   第二阶段问…...

C#全新一代医院手术麻醉系统围术期全流程源码

目录 一、麻醉学科的起源 二、麻醉前访视与评估记录单 患者基本信息 临床诊断 患者重要器官功能及疾病情况 病人体格情况分级 手术麻醉风险评估 拟施麻醉方法及辅助措施 其他需要说明的情况 访视麻醉医师签名 访视时间 与麻醉相关的检查结果 三、手术麻醉信息系统…...

Python 神器:一键下载 M3U8 并转换为 MP4

在这个数字时代&#xff0c;我们经常在网页上遇到各种精彩的视频&#xff0c;但往往只能观看而无法下载。今天&#xff0c;我将向大家介绍如何使用 Python 自动下载网页中的 M3U8 链接&#xff0c;并将其转换为 MP4 格式&#xff0c;让你轻松保存喜欢的视频&#xff01; 一、准…...

vue3全局控制Element plus所有组件的文字大小

项目框架vue-右上角有控制全文的文字大小 实现&#xff1a; 只能控制element组件的文字及输入框等大小变化&#xff0c;如果是自行添加div,text, span之类的控制不了。 配置流程 APP.vue 使用element的provide&#xff0c;包含app <el-config-provider :locale"loca…...

区间预测 | Matlab实现带有置信区间的BP神经网络时间序列未来趋势预测

区间预测 | Matlab实现带有置信区间的BP神经网络时间序列未来趋势预测 目录 区间预测 | Matlab实现带有置信区间的BP神经网络时间序列未来趋势预测预测效果基本介绍研究回顾程序设计参考资料预测效果 基本介绍 BP神经网络(Backpropagation neural network)是一种常用的人工神…...

Matlab中的脚本和函数

Matlab中的脚本和函数 文章目录 Matlab中的脚本和函数脚本创建脚本代码注释函数创建函数局部函数嵌套函数私有函数匿名函数补充知识函数句柄测试环境:Win11 + Matlab R2021a 脚本 ​ Matlab脚本是最简单的程序文件类型。它们可用于自动执行一系列 Matlab 命令,如命令行重复执…...

使用 nohup java - jar 不输出nohup日志

使用 nohup 命令来运行 Java 程序&#xff0c;并且不让输出写入 nohup.out 文件&#xff0c;可以使用重定向操作符 > 将标准输出重定向到 /dev/null 文件中。这样可以将输出丢弃&#xff0c;而不会写入日志文件。下面是具体的命令&#xff1a; nohup java -jar your_progra…...

Linux系统中安装一些常用的插件备用

Linux系统中安装一些常用的插件备用 1.安装wget yum -y install wget 2.安装vim yum -y install vim-enhanced 3.更换yum源为国内的阿里云源&#xff08;选择&#xff09; 1、备份CentOS-Base.repo mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.…...

笔记本电脑上部署LLaMA-2中文模型

尝试在macbook上部署LLaMA-2的中文模型的详细过程。 &#xff08;1&#xff09;环境准备 MacBook Pro(M2 Max/32G); VMware Fusion Player 版本 13.5.1 (23298085); Ubuntu 22.04.2 LTS; 给linux虚拟机分配8*core CPU 16G RAM。 我这里用的是16bit的量化模型&#xff0c;…...

百度云加速方法「Cheat Engine」

加速网盘下载 相信经常玩游戏的小伙伴都知道「Cheat Engine」这款游戏内存修改器&#xff0c;它除了能对游戏进行内存扫描、调试、反汇编 之外&#xff0c;还能像变速齿轮那样进行本地加速。 这款专注游戏的修改器&#xff0c;被大神发现竟然还能加速百度网盘资源下载&#xf…...

SOC内部集成网络MAC外设+ PHY网络芯片方案:PHY芯片基础知识

一. 简介 本文简单了解一下 "SOC内部集成网络MAC外设 PHY网络芯片方案" 这个网络硬件方案中涉及的 PHY网络芯片的基础知识。 二. PHY芯片基础知识 PHY 是 IEEE 802.3 规定的一个标准模块。 1. IEEE规定了PHY芯片的前 16个寄存器功能是一样的 前面说了&#xf…...

【Linux】shell脚本忽略错误继续执行

在 shell 脚本中&#xff0c;可以使用 set -e 命令来设置脚本在遇到错误时退出执行。如果你希望脚本忽略错误并继续执行&#xff0c;可以在脚本开头添加 set e 命令来取消该设置。 举例1 #!/bin/bash# 取消 set -e 的设置 set e# 执行命令&#xff0c;并忽略错误 rm somefile…...

MongoDB学习和应用(高效的非关系型数据库)

一丶 MongoDB简介 对于社交类软件的功能&#xff0c;我们需要对它的功能特点进行分析&#xff1a; 数据量会随着用户数增大而增大读多写少价值较低非好友看不到其动态信息地理位置的查询… 针对以上特点进行分析各大存储工具&#xff1a; mysql&#xff1a;关系型数据库&am…...

oracle与MySQL数据库之间数据同步的技术要点

Oracle与MySQL数据库之间的数据同步是一个涉及多个技术要点的复杂任务。由于Oracle和MySQL的架构差异&#xff0c;它们的数据同步要求既要保持数据的准确性和一致性&#xff0c;又要处理好性能问题。以下是一些主要的技术要点&#xff1a; 数据结构差异 数据类型差异&#xff…...

苍穹外卖--缓存菜品

1.问题说明 用户端小程序展示的菜品数据都是通过查询数据库获得&#xff0c;如果用户端访问量比较大&#xff0c;数据库访问压力随之增大 2.实现思路 通过Redis来缓存菜品数据&#xff0c;减少数据库查询操作。 缓存逻辑分析&#xff1a; ①每个分类下的菜品保持一份缓存数据…...

CocosCreator 之 JavaScript/TypeScript和Java的相互交互

引擎版本&#xff1a; 3.8.1 语言&#xff1a; JavaScript/TypeScript、C、Java 环境&#xff1a;Window 参考&#xff1a;Java原生反射机制 您好&#xff0c;我是鹤九日&#xff01; 回顾 在上篇文章中&#xff1a;CocosCreator Android项目接入UnityAds 广告SDK。 我们简单讲…...

Android Bitmap治理全解析:从加载优化到泄漏防控的全生命周期管理

引言 Bitmap&#xff08;位图&#xff09;是Android应用内存占用的“头号杀手”。一张1080P&#xff08;1920x1080&#xff09;的图片以ARGB_8888格式加载时&#xff0c;内存占用高达8MB&#xff08;192010804字节&#xff09;。据统计&#xff0c;超过60%的应用OOM崩溃与Bitm…...

rnn判断string中第一次出现a的下标

# coding:utf8 import torch import torch.nn as nn import numpy as np import random import json""" 基于pytorch的网络编写 实现一个RNN网络完成多分类任务 判断字符 a 第一次出现在字符串中的位置 """class TorchModel(nn.Module):def __in…...

Docker 本地安装 mysql 数据库

Docker: Accelerated Container Application Development 下载对应操作系统版本的 docker &#xff1b;并安装。 基础操作不再赘述。 打开 macOS 终端&#xff0c;开始 docker 安装mysql之旅 第一步 docker search mysql 》〉docker search mysql NAME DE…...

QT3D学习笔记——圆台、圆锥

类名作用Qt3DWindow3D渲染窗口容器QEntity场景中的实体&#xff08;对象或容器&#xff09;QCamera控制观察视角QPointLight点光源QConeMesh圆锥几何网格QTransform控制实体的位置/旋转/缩放QPhongMaterialPhong光照材质&#xff08;定义颜色、反光等&#xff09;QFirstPersonC…...

【笔记】WSL 中 Rust 安装与测试完整记录

#工作记录 WSL 中 Rust 安装与测试完整记录 1. 运行环境 系统&#xff1a;Ubuntu 24.04 LTS (WSL2)架构&#xff1a;x86_64 (GNU/Linux)Rust 版本&#xff1a;rustc 1.87.0 (2025-05-09)Cargo 版本&#xff1a;cargo 1.87.0 (2025-05-06) 2. 安装 Rust 2.1 使用 Rust 官方安…...