UI页面切换按钮随页面切换缩放

2023-11-18

选中按钮放大其余按钮缩小的
效果:

在这里插入图片描述在这里插入图片描述
在这里插入图片描述

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class BottomBarBtn : MonoBehaviour
{
    public RectTransform rect;
    public GameObject[] active;
    public Transform icon;
    float maxWidth = 360f;
    float minWidth = 180f;
    float maxScale = 1.5f;

    Coroutine closing;
    Coroutine expanding;
    bool isClose;
    public bool isPlaying;
    float width
    {
        get
        {
            return rect.sizeDelta.x;
        }
        set
        {
            Vector2 size = rect.sizeDelta;
            size.x = value;
            rect.sizeDelta = size;
        }
    }
    

    public void SetOpen(bool open)
    {
        isPlaying = false;
        float to = open ? maxWidth : minWidth;
        Vector3 toScale = !open ? Vector3.one : Vector3.one * maxScale;
        width = to;
        isClose = !open;
        icon.transform.localScale = toScale;
        SetActiveImg(open);
    }

    public void OpenBtn()
    {
        if (closing != null)
        {
            isPlaying = false;
            StopCoroutine(closing);
            closing = null;
        }
        if (expanding != null || !isClose) return;
        expanding = StartCoroutine(ExpandBtn(true));
        SetActiveImg(true);
    }


    public void CloseBtn()
    {

        if (expanding != null)
        {
            isPlaying = false;
            StopCoroutine(expanding);
            expanding = null;
        }
        if (closing != null || isClose) return;
        expanding = StartCoroutine(ExpandBtn(false));
        SetActiveImg(false);
    }

    void SetActiveImg(bool boolean)
    {
        foreach (GameObject obj in active)
        {
            obj.gameObject.SetActive(boolean);
        }
    }

    IEnumerator ExpandBtn(bool toBig)
    {
        float timer = 0;
        float time = 0.2f;
        isPlaying = true;
        float to = !toBig ? minWidth : maxWidth;
        Vector3 toScale = Vector3.one * (toBig ? maxScale : 1);
        float wFrom = width;
        Vector3 fromScale = icon.transform.localScale;
        while (timer < time)
        {
            width = rect.sizeDelta.x;
            timer += Time.deltaTime;
            float t = timer / time;
            float wCur = Mathf.Lerp(width, to, t);
            Vector3 curScale = Vector3.Lerp(fromScale, toScale, t);

            icon.transform.localScale = curScale;
            width = wCur;
            yield return null;
        }
        isPlaying = false;
        closing = null;
        expanding = null;
        width = to;
        isClose = !toBig;
        icon.transform.localScale = toScale;
    }
}

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

UI页面切换按钮随页面切换缩放 的相关文章

随机推荐

  • StaggeredGridLayoutManager与GridLayoutManager小细节注意点

    一 StaggeredGridLayoutManager 1 当我们的设置为VERTICAL时 很容易发现当上一行的高度排放相等时它一行排放的先后顺序是从左到右 2 当我们的设置为HORIZONTAL时 它总是从上到下排放的 3 当我们的设
  • opencv的安装、配置及所遇问题(Ubuntu16.04 + OpenCV3.4.2 + Python3.6)

    安装opencv对好多首次安装的开发者来说都是一场勇气和运气的较量 同样也是我在安装Ubuntu下安装过的众多软件包中最为波折的一款 在此记录安装过程中出现的各种error 幸运女神眷顾的安装顺序 1 安装ubuntu下的依赖项 sudo
  • 《Ansible自动化工具篇:Centos操作系统基于ansible工具一键远程离线部署之K8S1.24.12二进制版集群》

    一 部署背景 由于业务系统的特殊性 我们需要针对不同的客户环境部署二进制版K8S集群 由于大都数用户都是专网环境 无法使用外网 为了更便捷 高效的部署 针对业务系统的特性 我这边编写了 基于ansible自动化工具一键远程离线部署进制版K8
  • 办公利器:用Python向钉钉发送消息

    钉钉作为目前最热门的办公软件 在工作中大多数时间都在与他打交道 今天和大家分享一下如何用Python向钉钉发送消息 最终达到每日自动向指定群中发送销售日报 新建群机器人 首先打开群设置 点击智能群助手 选择添加自定义机器人 然后根据提示添加
  • 构造函数分类以及调用

    构造函数语法 类名 1 gt 构造函数 没有返回值也不写void 2 gt 函数名称与类名相同 3 gt 构造函数可以有参数的 因此是可以发生函数重载 4 gt 程序在调用对象时 会自动调用构造函数 无须手动调用 而且只会调用一次 析构函数
  • Servlet开发环境搭建

    Servlet是属于JAVA EE的范畴 是以JAVA SE为基础的 所以我们首先要配置JAVA的环境 不熟悉如何配置JAVA环境的可以参考 JAVA环境变量配置 这里我们的开发工具选择Eclipse Web容器选择Tomcat eclip
  • CentOS 7 vs CentOS 6新特性

    1 CentOS7 简介 CentOS Community Enterprise Operating System 中文意思是 社区企业操作系统 是Linux发行版之一 它是来自于Red Hat Enterprise Linux依照开放源代
  • 修改IP 脚本

    echo off echo echo 1 地税外网 echo 2 地税内网 echo 3 公司 echo 4 自动获取 echo echo 选择你要设置的网络 set p x if x 1 goto a if x 2 goto b if x
  • css中align-self属性是什么

    css中align self属性是什么 1 align self属性定义flex子项单独在侧轴 纵轴 方向上的对齐方式 2 align self多了个auto 默认值 表示继承自flex容器的align items属性值 实例 CSS co
  • 深度学习(二十八)基于多尺度深度网络的单幅图像深度估计

    基于多尺度深度网络的单幅图像深度估计 原文地址 http blog csdn net hjimce article details 50569474 作者 hjimce 一 相关理论 本篇博文主要讲解来自2014年NIPS上的一篇paper
  • 微信收付通V3支付

  • Selenium3+Python3框架之生成测试报告并发送邮件

    coding utf 8 Time 2019 10 18 Author carl dj import os import unittest import time import HTMLTestRunner from email mime
  • 关于Linux重新安装java环境报错

    警告 jdk 8u181 linux x64 rpm 头V3 RSA SHA256 Signature 密钥 ID ec551f03 NOKEY 准备中 100 软件包 jdk1 8 2000 1 8 0 181 fcs x86 64 已经
  • SpringMVC:从入门到精通,7篇系列篇带你全面掌握--六.JSON处理和全局异常处理

    Welcome Huihui s Code World 接下来看看由辉辉所写的关于SpringMVC的相关操作吧 目录 Welcome Huihui s Code World 前言 一 SpringMVC中json数据的处理 1 导入相关依
  • Unity 性能优化总结

    影响性能的因素 造成游戏性能瓶颈的主要原因分成以下几个方面 1 CPU 1 过多的 draw call 2 复杂的脚本或者物理模拟 2 GPU 1 顶点处理 过多的顶点 过多的逐顶点计算 2 片元处理 过多的片元 既可能是由于分辨率造成的
  • bubbo调用Failed to invoke remote method异常解决

    bubbo调用服务异常 com alibaba dubbo rpc RpcException Failed to invoke remote method getPlanFlowInfo provider dubbo 10 20 30 16
  • Tez 简介

    目录 一 Tez简介 二 Tez UI界面 三 Tez 日志 一 Tez简介 1 1 Tez 是支持 DAG 作业的开源计算框架 它可以将多个有依赖的作业转换为一个作业从而大幅提升 DAG 作业的性能 从本质上讲 Tez 组成非常简单 数据
  • asm: 实现打印“Hello, world!“

    使用汇编打印 Hello world 实现打印 Hello world 的汇编代码 代码详细剖析 实现打印 Hello world 的汇编代码 我们来直接贴代码 section text global start start mov edx
  • 【华为OD机试真题 JAVA】可以组成网络的服务器

    JS版 华为OD机试真题 JS 可以组成网络的服务器 标题 可以组成网络的服务器 时间限制 1秒 内存限制 262144K 语言限制 不限 在一个机房中 服务器的位置标识在 n m 的整数矩阵网格中 1 表示单元格上有服务器 0 表示没有
  • UI页面切换按钮随页面切换缩放

    选中按钮放大其余按钮缩小的 效果 using System Collections using System Collections Generic using UnityEngine public class BottomBarBtn M