无限循环拖动的UI

作者: 你的头好大 | 来源:发表于2017-11-24 18:01 被阅读28次
效果如图 循环拖动.gif

缺点是,在Unity中,自己要手动设置一下图片的位置。图片间的间隔固定。在Update中判断超出距离,就重新设置位置

代码如下


 public class DragColorPar : Singleton<DragColorPar>,IBeginDragHandler, IDragHandler, IEndDragHandler, IPointerDownHandler
        {
            public RectTransform[] ChildItem;
            public Camera UICamera;

            public float StarY = 0;
            public float EndY = 0;

            public RectTransform UpBoundary;
            public RectTransform DownBoundary;

            public Vector3[] FitLocalPos;

            public bool isAutoMove = false;//自动拖动

            public float InPosX;
            public float OutPosX;

            private bool drag = false;

            public void OnPointerDown(PointerEventData eventData)
            {
                SetPauseAutoMove();
            }
            public void OnBeginDrag(PointerEventData eventData)
            {
                //CancelInvoke("BeginAutoMove");
                //PauseAutoMove();

                StarY = UICamera.ScreenToWorldPoint(new Vector3(eventData.position.x, eventData.position.y, 0)).y;
                if (Input.touchCount <= 1)
                    drag = true;
            }

            public void OnDrag(PointerEventData eventData)
            {
                if (!drag)
                    return;
                EndY = UICamera.ScreenToWorldPoint(new Vector3(eventData.position.x, eventData.position.y, 0)).y;
                for (int i = 0; i < ChildItem.Length; i++)
                {
                    var pos = ChildItem[i].position;
                    pos.y += (EndY - StarY);
                    ChildItem[i].position = pos;
                }
                StarY = EndY;
            }


            public void OnEndDrag(PointerEventData eventData)
            {
                if (!drag)
                    return;
                drag = false;
            //    DebugBuild.Log(this.transform.GetChild(0).GetChild(2).localPosition + "LLLLLLLLLLLLLL");
                EndFit();
            }
            /// <summary>
            /// 结束滑动的时候,子物体对准自己的位置,始终只显示3个
            /// </summary>
            public void EndFit()
            {
                for (int i = 0; i < FitLocalPos.Length; i++)
                {
                    this.transform.GetChild(0).GetChild(i).DOLocalMove(FitLocalPos[i], 0.25f);
                }
                //CancelInvoke("BeginAutoMove");
                //Invoke("BeginAutoMove", 1f);//1秒之后,自动拖动
            }

            // Use this for initialization
            void Start()
            {
                FitLocalPos = new Vector3[this.transform.GetChild(0).childCount];
                for (int i = 0; i < FitLocalPos.Length; i++)
                {
                    FitLocalPos[i] = this.transform.GetChild(0).GetChild(i).localPosition;
                }

                OutPosX = 160f;
                InPosX = -120f;
            }
            void SetLoopPos()
            {
                for (int i = 0; i < ChildItem.Length; i++)
                {
                    if (ChildItem[i].transform.position.y > UpBoundary.position.y)
                    {
                        ChildItem[i].localPosition = this.transform.GetChild(0).GetChild(this.transform.GetChild(0).childCount - 1).localPosition + new Vector3(0, -130f, 0);//这里的130.是你摆放的图片和图片的间隔

                        ChildItem[i].transform.SetAsLastSibling();
                    }
                    else if (ChildItem[i].transform.position.y < DownBoundary.position.y)
                    {
                        ChildItem[i].transform.localPosition = this.transform.GetChild(0).GetChild(0).localPosition + new Vector3(0, 130f, 0);
                        ChildItem[i].transform.SetAsFirstSibling();
                    }
                }

            }


            public void AutoRotate(DMoveDirection dmd, float speed = 50f)
            {
                for (int i = 0; i < ChildItem.Length; i++)
                {
                    var pos = ChildItem[i].localPosition;
                    pos.y += Time.deltaTime * speed * (int)dmd;
                    ChildItem[i].localPosition = pos;
                }
            }

            public void SetAutoMove()
            {
                CancelInvoke("BeginAutoMove");
                Invoke("BeginAutoMove", 1f);
            }

            public void SetPauseAutoMove()
            {
                CancelInvoke("BeginAutoMove");
                PauseAutoMove();
            }
            private void BeginAutoMove()
            {
                isAutoMove = true;
            }

            private void PauseAutoMove()
            {
                isAutoMove = false;
            }
            // Update is called once per frame
            void Update()
            {
                if (isAutoMove)
                {
                    AutoRotate(DMoveDirection.上);
                }

                SetLoopPos();
            }
        }
[图片上传中...(无限拖动.png-22d4c5-1511517591189-0)] 无限拖动.png

相关文章

  • 无限循环拖动的UI

    缺点是,在Unity中,自己要手动设置一下图片的位置。图片间的间隔固定。在Update中判断超出距离,就重新设置位...

  • iOS Scrollview轮播图无限循环

    如果只需要使用定时器时无限循环,因为是顺序轮播,只需要在最后面放上第一张图片就可以,但是如果想要手动拖动无限循环,...

  • unity 拖动UI

    主要思想: 我在canvas 模拟一个点,并从这个点发射射线,这个模拟点根据鼠标的位置进行移动,射线检测到UI并返...

  • 拖动手势UIPanGestureRecognizer

    1.拖动手势简介拖动手势(UIPanGestureRecognizer)可以修改一个UI控件的位置,在有些游戏类A...

  • 会变化的无限循环ScrollView

    贴代码不如贴思路. 我记录一下, 我在编写这个UI时的处理思路. 横向无限循环, 是UIScrollView实现的...

  • UGUI 简单实现拖拽UI

    首先新建脚本DragUI,挂在要拖动的UI上, DragUI实现IPointerDownHandler,IDrag...

  • 使用OJ平台时数据的几种输入方式

    无限循环:使用EOF作为退出条件 无限循环:使用特定条件作为退出条件 进行延伸,有无限循环中嵌套有限循环 有限循环...

  • scrollImage,拖动循环图片

    /*** 图片滑动 新建Image重命名为ScrollPanel+ScrollRect组件,+Mask组件,Scr...

  • Nifi流程配置: CSV >> Hive

    1. 通过Ambari QuickLink打开Nifi UI 2. 创建ProcessorGroup a. 拖动页...

  • 无限的循环

    人生就如这张动图一样,每天都在重复着同样几件事情

网友评论

    本文标题:无限循环拖动的UI

    本文链接:https://www.haomeiwen.com/subject/gfmfbxtx.html