Unity ScrollView左右拖拽翻页

2023-11-06

ScrollView来实现左右拖拽的翻页。类似于微信,左右拖拽时候上下无法拖拽,上下拖拽的时候左右无法拖拽。并且左右拖拽的是时候 会有弹力进行对对齐


using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.EventSystems;
public class ScrollPagaUtil : MonoBehaviour, IBeginDragHandler, IEndDragHandler, IDragHandler
{
    bool isPressing;
    public ScrollRect sr;
    Vector2 deltaPos;
    public void OnBeginDrag(PointerEventData eventData)
    {
        //throw new System.NotImplementedException();

        if (moving != null) StopCoroutine(moving);
    }

    public void OnEndDrag(PointerEventData eventData)
    {
        //throw new System.NotImplementedException();
        isPressing = false;
        if (moving != null) StopCoroutine(moving);
        Move();
    }

    private void OnApplicationFocus(bool focus)
    {
        if (!focus)
        {
            isPressing = false;
            MoveNow();
        }
    }


    public void OnDrag(PointerEventData eventData)
    {
       Vector2 drag =  eventData.delta;
        if(Mathf.Abs(drag.y) > 1f && !isPressing)
        {
            sr.vertical = true;
            sr.horizontal = false;
            sr.movementType = ScrollRect.MovementType.Elastic;
            sr.inertia = true;
            isPressing = true;
        }
        else if (Mathf.Abs(drag.x) > 1f && !isPressing)
        {
            sr.horizontal = true;
            sr.vertical = false;
            sr.movementType = ScrollRect.MovementType.Clamped;
            sr.inertia = false;
            isPressing = true;
        }

    }



    //-------------------------------------------------------------
    public GameObject[] activeObject;
    public GameObject[] disActiveObject;
    public Transform[]  contants;
    public Transform center;
    public Transform target;
    Coroutine moving;

    //获取最近的一个
    Transform GetNearContant()
    {
        float min = 9999;
        Transform near = null;
        foreach (Transform trans in contants)
        {
            float x = trans.position.x - center.transform.position.x;
            if (Mathf.Abs(x) < min)
            {
                min = Mathf.Abs(x);
                near = trans;
            }
        }
        return near;
    }

    //设置按钮显示与否
    void SetButtonActive(int index)
    {
        for(int i =0;i< activeObject.Length; i++)
        {
            activeObject[i].SetActive(i == index);
            disActiveObject[i].SetActive(i != index);
        }
    }

    //设置按钮显示与否
    void SetButtonActive(Transform obj)
    {
       for(int i = 0;i< contants.Length; i++)
        {
            if(contants[i] == obj)
            {
                SetButtonActive(i);
                return;
            }
        }
    }

    
    //移动到第一个
    public void MoveToFirst()
    {
        if (moving != null) StopCoroutine(moving);
        Transform near = contants[0];
        SetButtonActive(0);
        Vector3 pos = target.transform.localPosition;
        pos.x = -near.localPosition.x;
        target.transform.localPosition = pos;
        
    }

    //移动到
    public void MoveTo(int index)
    {
        if (moving != null) StopCoroutine(moving);
        Transform near = contants[index];
        SetButtonActive(index);
        Vector3 pos = target.transform.localPosition;
        pos.x = -near.localPosition.x;
        target.transform.localPosition = pos;
    }

    //移动
    void Move()
    {
        if (moving != null) StopCoroutine(moving);
        Transform near = GetNearContant();
        float xPos = -near.localPosition.x;
        SetButtonActive(near);
        moving = StartCoroutine(_MoveTo(xPos));
    }
    
    //立即移动到
    void MoveNow()
    {
        if (moving != null) StopCoroutine(moving);
        Transform near = GetNearContant();
        Vector3 pos = target.transform.localPosition;
        pos.x = -near.localPosition.x;
        SetButtonActive(near);
        target.transform.localPosition = pos;
    }

    //移动到
    IEnumerator _MoveTo(float x)
    {

        float from = target.localPosition.x;
        float to = x;

        float timer = 0;
        float time = 0.25f; 

        while (timer < time)
        {
            timer += Time.deltaTime;
            float t = timer / time;
            float curX = Mathf.Lerp(from, to, t);
            Vector3 pos = target.localPosition;
            pos.x = curX;
            target.localPosition = pos;

            yield return null;
        }

        moving = null;
    }

}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Unity ScrollView左右拖拽翻页 的相关文章

  • 无法在 OSX 上使用 eclipse for android 链接到 cocos2dx

    我以前从来没有花这么多时间来初始设置开发环境 这有点荒谬 我正在尝试运行cocos2dx附带的演示代码 我在用着 ADK 附带的 eclipse 风格 cocos2d 2 1beta3 x 2 1 0 ndk r8c 我尝试使用 creat
  • Android:在对话框中使用日期选择器和时间选择器

    我面临一个我不知道如何解决的问题 我有一个活动 当我单击链接到该活动的菜单的特定项目时 会显示一个对话框 用于添加项目 该项目有日期和时间 但我无法获得DatePicker and TimePicker在此对话框中 我还尝试将活动传递给对话
  • IllegalStateException:预期配置 ':module:debugFeatureCompileClasspath' 仅包含一个文件,但是,它包含 2 个文件

    我正在使用带有即时应用程序和穿戴应用程序的多功能Android应用程序 在这里我能够成功运行我的应用程序但在期间出现以下错误构建 APK 或重建项目 java lang IllegalStateException Expected conf
  • 如何更改Android应用程序的页面?

    我是安卓新手 我已经设计了由许多页面组成的应用程序 任何人都有源代码或任何可以让我知道如何构建它的东西 例如 当我单击按钮时 我希望它将页面更改为下一页 谢谢你卡 运行通过第一个应用程序教程 https developer android
  • Kotlin 中使用 Retrofit @PartMap 的多部分请求错误 (Android)

    如果我在 Java 中使用这段代码 那么它工作得很好 当我在 kotlin 中转换该代码时 出现错误 Logcat 08 20 23 46 51 003 3782 3782 com qkangaroo app W System err ja
  • Android 多个 SurfaceView

    我正在尝试在一个屏幕上使用 3 个 SurfaceView 一个在上半部分 BoardView 一个在下半部分 StatusView 最后一个作为上半部分 TileView 上方的额外层 请参阅 main xml 我创建了一个类MySurf
  • 从滚动视图返回子视图

    我有一个父母ScrollView带有儿童视图 当用户按下后退按钮时 我希望子视图处理该事件 我尝试了一些方法 但似乎都不起作用 按后退按钮会终止活动 public class GameScrollView extends ScrollVie
  • 使用 sdk 3.0 在 Facebook 墙上发布

    我试图在由其 ID 定义的用户墙上发布一条消息 但作为响应 我收到错误 未知方法 我的代码是 final Bundle params new Bundle params putByteArray message Test getBytes
  • Android 中的弹出消息

    我正在开发一个应用程序 我想创建一条弹出消息 在我们不关闭时该消息将保持稳定 我想要一些教程来帮助我制作警报对话框 提前致谢 我认为您正在搜索 对话框 框 从而可以向用户显示警报消息 确认消息等 欲了解更多信息 请参阅此 http deve
  • 在 Java/Android 中查找 UTF-8 字符串中的字符数

    我试图找出字符串以 UTF 8 存储时的长度 我尝试了以下方法 String str Charset UTF8 CHARSET Charset forName UTF 8 byte abc str getBytes UTF8 CHARSET
  • Android 拍摄后画质低

    我有一个触发图像捕获的按钮 private void capturePicture if ActivityCompat checkSelfPermission getContext Manifest permission CAMERA Pa
  • Android-如何在指定时间后台下载数据

    我提前很抱歉没有发布任何代码 主要是因为我一生都无法弄清楚我需要如何做我需要做的事情 基本上 在一天中的指定时间间隔 例如下午 5 点 我希望我的应用程序从我的服务器下载一些数据并将其存储在设备上 这是为了减少每次运行应用程序时下载数据对我
  • 为并行的小型已知冻结进程创建匿名 AsyncTask 是一个好习惯吗? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 例如 您要做一些需要几秒钟的事情 并且不想冻结您的 UI 线程 对吗 您可以使用 AsyncTask 但您不想创建外部 或内部 类来解决小冻结问
  • 如何从代码中检测 Android 设备上的双核 cpu?

    我遇到了一个似乎仅影响双核的问题Android设备运行Android 2 3 姜饼 或更大 我想就这个问题进行一次对话 但仅限于符合该标准的用户 我知道如何检查OS级别 但还没有找到任何可以明确告诉我该设备正在使用多核的信息 有任何想法吗
  • 在 Repository 类中观察 Forever 是一个好习惯吗?数据库+网络分页列表

    我正在按照架构指南构建应用程序 实现了房间数据库缓存 网络 需要从单独的实体获取最新页码 我的型号 Entity tableName top rated movie page public class Top Rated Movies Pa
  • 注意通知持续时间

    是否可以将抬头通知的持续时间设置为无限 现在它只显示 5 秒 已经尝试过不同的事情 例如更改类别 但持续时间始终为 5 秒 这是我的代码 Notification notification notificationBuilder setCa
  • android中使用xml的新自定义字体方法

    随着 android 发布 O 预览版 添加了一个新功能 称为xml 中的字体 它很容易实现 但我没有什么疑问 让我首先添加最好的方法1 右键单击资源文件夹并前往新建 gt Android 资源目录 新的出现资源目录窗口 2 在资源类型列表
  • 在Android中创建自定义按钮类

    我正在尝试为我的 Android 应用程序创建自定义按钮类 public class TicTacButton extends Button 我已经在里面设置了所有构造函数TicTacButton并创建了自定义方法和属性 在我的主要活动中
  • 当从 Firebase 控制台删除 Firebase 用户(用户登录后)时,它不会反映在应用程序中 [重复]

    这个问题在这里已经有答案了 The user uid仍然会来 在这个的帮助下uid null 我假设用户已登录 我也尝试过addAuthStateListener mAuthListener 但我仍然获取之前删除的用户的 UID 如果不使用
  • 如何解决“布局有超过 80 个视图,对性能不利”?

    我正在做一个有点复杂的布局 只是我无法修复 LINT 指示的错误 黑莓浏览次数超过 80 对性能不利 这是布局

随机推荐

  • 解决Rosbridge自定义action信息问题

    前言 利用rosbridge开发一个网页版的action客户端 一 rosbridge原理 rosbridge协议 该协议的基本思想是将节点间的分布式通信 改成 client节点 与一个代理节点进行C S通信 然后代理节点再将请求转发给se
  • 多服务环境下定时任务重复执行问题解决方案

    当一个服务部署在多台服务器上时 定时任务可能出现多次执行的情况 就是每个服务上执行一次 有以下两种思路 一是固定死只有某服务器执行定时任务 二是随机暂停几秒 某一服务执行了 其他就不再执行 1 固定某一个服务器作为执行定时任务的机器 通过配
  • 基于混沌映射与差分进化的自适应教与学优化算法

    文章目录 一 理论基础 1 标准TLBO算法 2 混沌映射与差分进化的自适应TLBO算法 1 改进的Logistic混沌映射 2 惯性权重自适应调节函数 3 教改阶段 二 仿真实验与分析 三 参考文献 一 理论基础 1 标准TLBO算法 请
  • 在Power BI中用DAX新建列的方式进行累计求和

    在Power BI中用DAX新建列的方式进行累计求和 DAX 新建列来累计求和 累计求和 DAX 新建列 DAX函数 Filter DAX函数 EARLIER DAX函数 SUMX DAX 新建列来累计求和 Power BI有两种方式进行累
  • 没有node-sass Windows 64-bit with Node.js 16.x

    throw new Error errors missingBinary OS X 64 bit with Node js 16 x Windows 64 bit with Node js 16 x 1 下载node sass 对应的版本
  • 数据分析理论【5】之 下采样策略和上采样策略

    合辑传送门 gt gt 数据分析 合辑 在分类问题的数据中 很容易出现正反数据集数量存在极大的差距 这类数据直接用于训练不利于模型的构架 所以我们需要对数据进行些许处理 很容易想到 合理的数据集应该是正反数据集数量应接近 那就存在两种策略
  • python的艰难学习之路-综合练习--名片管理系统

    名片管理系统需求 1 显示欢迎界面 提示操作码 按照操作码执行程序 2 操作码功能包括 查询 查找 新增 3 查询出来后 可继续操作 gt 修改 删除 4 名片需要记录的信息 gt 编号 姓名 电话 邮箱 QQ 5 编号自动生成 6 如果在
  • 通过高德地图API取得两点坐标间的距离

    高德地图在取两点间的距离比百度地图更详细 可以分为几种类型的API 提供的步行 公交 驾车查询 今天咱们使用驾车的API来计算两点的距离 其它的API大同小异 参考高德地图的API地址 路径规划 API文档 开发指南 Web服务 API 高
  • RunBlocking CoroutineScope SupervisorScope Launch Async CoroutineStart协程启动模式 Job对象和生命周期

    协程的作用域构建器 RunBlocking runBlocking是常规函数 会把当前主线程包装成一个主协程 其会阻塞当前线程 只有当等待其主协程体以及里面的所有子协程执行结束以后 才会让当前线程执行 CoroutineScope coro
  • QT foreach

    如果只想按顺序迭代容器中的所有项 可以使用Qt的foreach关键字 该关键字是对C 语言的Qt特定添加 并使用预处理器实现 与任何其他C 循环构造一样 您可以在foreach循环的主体周围使用大括号 并且可以使用Break来离开循环 其语
  • 华为OD机试 - 数组连续和(Java)

    题目描述 给定一个含有N个正整数的数组 求出有多少个连续区间 包括单个正整数 它们的和大于等于x 输入描述 第一行两个整数N x 0 lt N lt 100000 0 lt x lt 10000000 第二行有N个正整数 每个正整数小于等于
  • 锐捷交换机密码破解

    资料来源 https search ruijie com cn 8447 rqs preview html ie utf 8 wd eHAiOjE1NDU4NzUxNDcsIm5iZiI6MTU0NTYxNTk0N3020180920150
  • 虚拟机-扩充硬盘

    扩充硬盘 https www cnblogs com wy20110919 p 9150914 html https cloud tencent com developer article 1563508 from 14588
  • next_permutation(a,a+n)

    早就听说了了next permutation 产生全排列的强大 一直到昨晚遇到一个对字符串产生全排列的问题才知道这个函数的强大 我们队是按照dfs去搞全排列 然后在进行字符串的匹配 结果写的很长 过程中还各种debug 于是决定今天学一下
  • 认知-想象力:想象力

    ylbtech 认知 想象力 想象力 想象力 是人在已有形象的基础上 在头脑中创造出新形象的能力 比如当你说起汽车 我马上就想像出各种各样的汽车形象来就是这个 道理 因此 想象一般是在掌握一定的知识面的基础上完成的 想象力 是在你头脑中创造
  • Spring学习笔记(一)【BeanUtils.copyProperties方法】

    Spring下的BeanUtils copyProperties方法是深拷贝还是浅拷贝 一 浅拷贝深拷贝的理解 简单地说 拷贝就是将一个类中的属性拷贝到另一个中 对于BeanUtils copyProperties来说 必须保证属性名和类型
  • 【不忘初心】Win11_21H2_22000.100_X64_四合一[纯净精简版][2.9G](2021.8.5)

    此版更新补丁未知 WIN11全新的UI界面出炉 可以说这一次Windows 11全新升级 无论是从Logo上还是UI界面设计 都有很大的变化 不过WIN11目前还不够稳定 小问题比较多 母版来自MSDN WIN11 21H2 22000 1
  • 大学概率论与数理统计知识点详细整理

    目录 概率论学习自述 概率论的一些基本概念 随机变量的分布 一维随机变量的分布 二维随机变量 抽样分布 数学期望 矩 方差 协方差 常见分布的数学期望与方差 一些重要的定理公式 参数估计 1 点估计 2 区间估计 假设检验 独立性 概率论学
  • 蒙皮流程1

    选中要调整权重的点 打开这个窗口 可以调整他的权重值 蒙皮里面的导出导入权重贴图可以在要对模型做修改的情况下 对已弄好的权重进行保留 或者直接用下面的替换几何体用新的替换旧的 给人物下巴绘制权重时 下巴骨骼与躯干骨骼连接处插入一个小骨骼 给
  • Unity ScrollView左右拖拽翻页

    ScrollView来实现左右拖拽的翻页 类似于微信 左右拖拽时候上下无法拖拽 上下拖拽的时候左右无法拖拽 并且左右拖拽的是时候 会有弹力进行对对齐 using System Collections using System Collect