一、 点击滑动页面

新建了一个带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之实现各种滑动效果的更多相关文章

  1. a 锚点跳转滑动效果

    点击a链接时,跳转到相应id的位置处,有一个滑动效果. <a href="#my">我是跳转到div</a><div id="my" ...

  2. Android Scroll分析——滑动效果产生

    相对于在Android2.x版本上出现的长按.点击事件的效果,不得不说,滑动操作具有更好的用户体验.因此,从Android 4.X版本开始,出现了更多滑动操作的效果.越来越多第三方应用模仿这样的效果, ...

  3. jquery左右滑动效果的实现

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  4. bootstrap实现 手机端滑动效果,滑动到下一页,jgestures.js插件

    bootstrap能否实现 手机端滑动效果,滑动到下一页 jgestures.js插件可以解决,只需要引入一个JS文件<script src="js/jgestures.min.js& ...

  5. Android实现多页左右滑动效果,支持子view动态创建和cache

    要实现多页滑动效果,主要是需要处理onTouchEvent和onInterceptTouchEvent,要处理好touch事件的子控件和父控件的传递问题. 滚动控制可以利用android的Scroll ...

  6. 【Android 界面效果27】利用ViewPager、Fragment、PagerTabStrip实现多页面滑动效果

    本文主要介绍如何利用ViewPager.Fragment.PagerTabStrip实现多页面滑动效果.即google play首页.新浪微博消息(at.评论.私信.广播)页面的效果.ViewPage ...

  7. 十六、Android 滑动效果汇总

    Android 滑动效果入门篇(一)—— ViewFlipper Android 滑动效果入门篇(二)—— Gallery Android 滑动效果基础篇(三)—— Gallery仿图像集浏览 And ...

  8. Android 滑动效果进阶篇(六)—— 倒影效果

    上篇介绍了使用Animation实现3D动画旋转翻页效果,现在介绍图片倒影实现,先看效果图 本示例主要通过自定义Gallery和ImageAdapter(继承自BaseAdapter)实现 1.倒影绘 ...

  9. Android 滑动效果入门篇(二)—— Gallery

    Gallery 是Android官方提供的一个View容器类,继承于AbsSpinner类,用于实现页面滑动效果. 从上面的继承关系可以看出,AbsSpinner类继承自AdapterView,因此我 ...

随机推荐

  1. SPOJ 3267 DQUERY(离线+树状数组)

    传送门 话说这好像HH的项链啊…… 然后就说一说上次看到的一位大佬很厉害的办法吧 对于所有$r$相等的询问,需要统计有多少个不同的数,那么对于同一个数字,我们只需要关心它最右边的那一个 比如$1,2, ...

  2. loj #6570. 毛毛虫计数

    $ \color{#0066ff}{ 题目描述 }$ hsezoi 巨佬 olinr 喜欢 van 毛毛虫,他定义毛毛虫是一棵树,满足树上存在一条树链,使得树上所有点到这条树链的距离最多为 1. 给定 ...

  3. python高级(一)—— python数据模型(特殊方法)

    本文主要内容 collections.namedtuple __getitem__ 和 __len__ __repr__和__str__ __abs__.__add__和__mul__ __bool_ ...

  4. 简述Dubbo

    目前处于实习期间,白天工作,网上自主学习.最近没事逛了一下当前招聘网上的招聘要求,其中dubbo这个关键字出现的比较多,因此花了点时间学习了一番,在这写写自己的理解. 说起Dubbo,得先聊聊RPC, ...

  5. HNOI2018 退役记

    HNOI2018 退役记 \(day0\): 除了切水题以外没有什么很重要的事. \(day1\): 进考场发现前面是\(yyb\)?\(orzyyb\) 试题解压密码终于没有奇怪的字符了,一遍打对. ...

  6. nginx(四)-负载均衡

    负载均衡,我认为是nginx最重要的功能了.那什么是负载均衡呢. 比如有一个服务,它访问量很大,一台机器吃不消了,怎么办,我们准备两台.分一部分的请求出来.现在有两台服务器提供这个服务.我们访问其中一 ...

  7. A: Absolutely Simple---巴什博弈

    A: Absolutely Simple 时间限制: 1 s      内存限制: 128 MB        题目描述 Ocean暑假去海边玩,海边有许多好看的贝壳.并且Ocean捡了好多回来. 回 ...

  8. form表单提交到Controller之后空值变成逗号

    首先这个错误不是我遇到的,是别人遇到来找我给帮忙调试的(我不会犯这种错误!!!) 错误非常神奇,前端页面的form表单是空的啥都没填,提交到后台之后(后台用@ModelAttribute实体类接受的) ...

  9. es put mapping

    fd dg public Map<String, Map<String, String>> javaBeanToMapping(Object instance, List< ...

  10. A problem has been detected and windows has been shut down to prevent damage

    问题描述 问题解决 参考百度经验, 未解决,重装系统,U盘启动解决.过程可以参考上一篇博文.