unity3d之实现各种滑动效果
一、 点击滑动页面
新建了一个带mask的prefab,加上代码只需要将图片prefab、按钮prefab和所想添加的图片
拖进去会自动生成按钮,滑动速度可以随意调time,滑动效果用itween实现的,所以需要加上itween插件
效果如下:(图片是我最爱的马路小天使(¯﹃¯))
附上代码
- using UnityEngine;
- using System.Collections.Generic;
- using UnityEngine.UI;
- public class Mask : MonoBehaviour {
- public List<Sprite> sprite = new List<Sprite>();
- List<GameObject> image=new List<GameObject >();
- public GameObject pic;
- public Button but;
- public float time;
- float width, height;
- int num;
- void Start ()
- {
- num = sprite.Count;
- width = this.gameObject.GetComponent<RectTransform>().rect.width;
- height = this.gameObject.GetComponent<RectTransform>().rect.height;
- pic.transform.GetComponent<RectTransform>().sizeDelta=new Vector2(width,height);
- for (int i = ; i < num; i++)
- {
- GameObject p = Instantiate(pic,new Vector3(transform.position.x+i*width,transform.position.y,),transform.rotation)as GameObject;
- p.transform.parent = this.gameObject.transform;
- image.Add (p) ;
- p.GetComponent<Image>().sprite = sprite[i];
- Button b = Instantiate(but, new Vector3(transform.position.x- ( * num - ) / +*i, transform.position.y - height/ + , ), transform.rotation) as Button;
- b.transform.parent = GameObject.FindWithTag("Button").transform;
- System.Object obj = (System.Object)i;
- b.onClick.AddListener(delegate(){this.MoveToPic((int)obj);});
- }
- }
- void OnGUI()
- {
- if (GUI.Button(new Rect(transform.position.x + + width / , Screen.height - transform.position.y - , , ), ">"))
- {
- if (image[].transform.position.x < transform.position.x-)
- {
- Move();
- }
- }
- if (GUI.Button(new Rect(transform.position.x -width/-,Screen.height- transform.position.y- , , ), "<"))
- {
- if (image[num - ].transform.position.x > transform.position.x+)
- {
- Move(-);
- }
- }
- }
- public void Move(int dir)
- {
- for (int i = ; i <num; i++)
- {
- iTween.MoveAdd(image[i], iTween.Hash("x", width * dir, "time", time));
- }
- }
- public void MoveToPic(int i)
- {
- float offset = transform.position.x - image[i].transform.position.x;
- for (int j = ; j < num; j++)
- {
- iTween.MoveAdd(image[j], iTween.Hash("x", offset, "time", time));
- }
- }
- }
二、间隔时间自动滑动,也可点击滑动
- using UnityEngine;
- using System.Collections.Generic;
- using UnityEngine.EventSystems;
- using UnityEngine.UI;
- using System;
- public class ScrollPage : MonoBehaviour, IBeginDragHandler, IEndDragHandler
- {
- ScrollRect rect;
- //页面:0,1,2,3 索引从0开始
- //每页占的比列:0/3=0 1/3=0.333 2/3=0.6666 3/3=1
- //float[] pages = { 0f, 0.333f, 0.6666f, 1f };
- List<float> pages = new List<float>();
- int currentPageIndex = -;
- //滑动速度
- public float smooting = ;
- //滑动的起始坐标
- float targethorizontal = ;
- //是否拖拽结束 0 -结束 1-拖拽中 2-结束超过5s
- int isDrag = ;
- int curindex = ;
- int dir = ;
- float timecount = ;
- /// <summary>
- /// 用于返回一个页码,-1说明page的数据为0
- /// </summary>
- public System.Action<int,int> OnPageChanged;
- float startime = 0f;
- float delay = 0.1f;
- // Use this for initialization
- void Start()
- {
- rect = transform.GetComponent<ScrollRect>();
- //rect.horizontalNormalizedPosition = 0;
- //UpdatePages();
- startime = Time.time;
- }
- void Update()
- {
- if (Time.time < startime + delay) return;
- UpdatePages();
- //如果不判断。当在拖拽的时候要也会执行插值,所以会出现闪烁的效果
- //这里只要在拖动结束的时候。在进行插值
- if (isDrag == && pages.Count > )
- {
- rect.horizontalNormalizedPosition = Mathf.Lerp(rect.horizontalNormalizedPosition, targethorizontal, Time.deltaTime * smooting);
- if (Mathf.Abs(rect.horizontalNormalizedPosition - targethorizontal) <= 0.001)
- { isDrag = ; timecount = ; }
- }
- if (isDrag == )
- {
- timecount += Time.deltaTime;
- if (timecount > )
- {
- AutoMove();
- rect.horizontalNormalizedPosition = Mathf.Lerp(rect.horizontalNormalizedPosition, pages[curindex + dir * ], Time.deltaTime * smooting);
- if (pages == null || OnPageChanged == null)
- print("Error" + "," + (pages==null) + "," + (OnPageChanged == null));
- OnPageChanged(pages.Count, curindex + dir * );
- if (Mathf.Abs(rect.horizontalNormalizedPosition - pages[curindex + dir * ]) < 0.001)
- {
- timecount = ;
- }
- }
- }
- }
- public void AutoMove()
- {
- for (int i = ; i < pages.Count; i++)
- {
- if (Mathf.Abs(pages[i] - rect.horizontalNormalizedPosition) < 0.001)
- {
- curindex = i;
- }
- }
- if (curindex == pages.Count - ) { dir = -; }
- if (curindex == ) { dir = ; }
- }
- public void OnBeginDrag(PointerEventData eventData)
- {
- isDrag = ;
- }
- public void MoveToPage(int target)
- {
- isDrag = ;
- targethorizontal = pages [target];
- if(target!=currentPageIndex)
- {
- currentPageIndex = target;
- OnPageChanged(pages.Count, currentPageIndex);
- }
- }
- public void OnEndDrag(PointerEventData eventData)
- {
- isDrag = ;
- float posX = rect.horizontalNormalizedPosition;
- int index = ;
- //假设离第一位最近
- float offset = Mathf.Abs(pages[index] - posX);
- for (int i = ; i < pages.Count; i++)
- {
- float temp = Mathf.Abs(pages[i] - posX);
- if (temp < offset)
- {
- index = i;
- //保存当前的偏移量
- //如果到最后一页。反翻页。所以要保存该值,
- offset = temp;
- }
- }
- if(index!=currentPageIndex)
- {
- currentPageIndex = index;
- OnPageChanged(pages.Count, currentPageIndex);
- }
- targethorizontal = pages[index];
- }
- void UpdatePages()
- {
- // 获取子对象的数量
- int count = this.rect.content.childCount;
- int temp = ;
- for(int i=; i<count; i++)
- {
- if(this.rect.content.GetChild(i).gameObject.activeSelf)
- {
- temp++;
- }
- }
- count = temp;
- if (pages.Count!=count)
- {
- if (count != )
- {
- pages.Clear();
- for (int i = ; i < count; i++)
- {
- float page = ;
- if(count!=)
- page = i / ((float)(count - ));
- pages.Add(page);
- }
- }
- OnEndDrag(null);
- }
- }
- }
unity3d之实现各种滑动效果的更多相关文章
- a 锚点跳转滑动效果
点击a链接时,跳转到相应id的位置处,有一个滑动效果. <a href="#my">我是跳转到div</a><div id="my" ...
- Android Scroll分析——滑动效果产生
相对于在Android2.x版本上出现的长按.点击事件的效果,不得不说,滑动操作具有更好的用户体验.因此,从Android 4.X版本开始,出现了更多滑动操作的效果.越来越多第三方应用模仿这样的效果, ...
- jquery左右滑动效果的实现
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- bootstrap实现 手机端滑动效果,滑动到下一页,jgestures.js插件
bootstrap能否实现 手机端滑动效果,滑动到下一页 jgestures.js插件可以解决,只需要引入一个JS文件<script src="js/jgestures.min.js& ...
- Android实现多页左右滑动效果,支持子view动态创建和cache
要实现多页滑动效果,主要是需要处理onTouchEvent和onInterceptTouchEvent,要处理好touch事件的子控件和父控件的传递问题. 滚动控制可以利用android的Scroll ...
- 【Android 界面效果27】利用ViewPager、Fragment、PagerTabStrip实现多页面滑动效果
本文主要介绍如何利用ViewPager.Fragment.PagerTabStrip实现多页面滑动效果.即google play首页.新浪微博消息(at.评论.私信.广播)页面的效果.ViewPage ...
- 十六、Android 滑动效果汇总
Android 滑动效果入门篇(一)—— ViewFlipper Android 滑动效果入门篇(二)—— Gallery Android 滑动效果基础篇(三)—— Gallery仿图像集浏览 And ...
- Android 滑动效果进阶篇(六)—— 倒影效果
上篇介绍了使用Animation实现3D动画旋转翻页效果,现在介绍图片倒影实现,先看效果图 本示例主要通过自定义Gallery和ImageAdapter(继承自BaseAdapter)实现 1.倒影绘 ...
- Android 滑动效果入门篇(二)—— Gallery
Gallery 是Android官方提供的一个View容器类,继承于AbsSpinner类,用于实现页面滑动效果. 从上面的继承关系可以看出,AbsSpinner类继承自AdapterView,因此我 ...
随机推荐
- js计算器案例
<!DOCTYPE html><html> <head> <meta charset="UTF-8"> <title>j ...
- POJ1330 Nearest Common Ancestors (JAVA)
经典LCA操作.. 贴AC代码 import java.lang.reflect.Array; import java.util.*; public class POJ1330 { // 并查集部分 ...
- php 返回数组中指定多列的方法
php array_column 方法可以返回数组中指定的一列,但不能返回多列,本文将介绍array_column方法的使用,并用代码演示返回数组中指定多列的方法. 1.array_column说明 ...
- java中锁
s锁的作用是就是保证线程安全,但是从另外成都讲影响了效率: 1 synchronized关键字 这个是虚拟机底层实现的, java中的关键字,内部实现为监视器锁,主要是通过对象监视器在对象头中的字段来 ...
- Codeforces Round #556 题解
Codeforces Round #556 题解 Div.2 A Stock Arbitraging 傻逼题 Div.2 B Tiling Challenge 傻逼题 Div.1 A Prefix S ...
- python全栈开发学习_day1_计算机五大组成部分及操作系统
一.计算机五大组成部分: 1)五大组成: 1.控制器(指挥系统,用于控制其他计算机硬件的工作) 2.运算器(用于数学运算及逻辑运算) 3.存储器(寄存器,高速缓存,内存,磁盘(机械,固态),磁带) 4 ...
- Bowen
Advertise Window大小 注册表键值位于:regedit->HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Pa ...
- 论文阅读 | FPN:Feature Pyramid Networks for Object Detection
论文地址:https://arxiv.org/pdf/1612.03144v2.pdf 代码地址:https://github.com/unsky/FPN 概述 FPN是FAIR发表在CVPR 201 ...
- hive Data Types
在文章最开始,就先强调一下,hive不是仅仅支持string类型,hive不是仅仅支持string类型,hive不是仅仅支持string类型. Numeric Types tinyint,-128到1 ...
- Android Watchdog
http://androidxref.com/6.0.1_r10/xref/frameworks/base/services/core/java/com/android/server/Watchdog ...