zoukankan      html  css  js  c++  java
  • NGUI例子Scroll View场景中item添加点击后自动滑到终点

    http://blog.csdn.net/luyuncsd123/article/details/22914497

    最近在做一个项目的UI,需求是1、拖动items后当永远有一个item保存在中间位置,2、点击当前item后当前item滑动到终点。 
    
    咱看了NGUI的Scroll View例子后发现第一个要求NGUI自带了,第二个要求没有,所以自己写了个包含这2个需求的脚本。 
    
    
    把相应的脚本替换成这几个就可以了。如果碰到变量保护之类的错误的话把父类中的方法改成protected就行了。 
    
    using UnityEngine; 
    using System.Collections; 
    
    [ExecuteInEditMode] 
    public class QRCUICenterOnChild : UICenterOnChild 
    { 
        private Transform moveTarget; 
    
        protected QRCUIDraggablePanel mQrcDrag; 
    
        void OnEnable() { Recenter(null); //Recenter(); 
        } 
    
        void OnDragFinished(GameObject obj) 
        { 
            if (enabled) 
            { 
                //if (obj != null) 
                    Recenter(obj); 
                //else 
                //    Recenter(); 
            } 
        } 
    
        /// <summary> 
        /// Recenter the draggable list on the center-most child. 
        /// </summary> 
    
        public void Recenter(GameObject obj) 
        { 
            if (mQrcDrag == null) 
            { 
                mQrcDrag = NGUITools.FindInParents<qrcuidraggablepanel>(gameObject); 
    
                if (mQrcDrag == null) 
                { 
                    Debug.LogWarning(GetType() + " requires " + typeof(QRCUIDraggablePanel) + " on a parent object in order to work", this); 
                    enabled = false; 
                    return; 
                } 
                else 
                { 
                    mQrcDrag.onDragFinished = OnDragFinished; 
    
                    //if (mDrag.horizontalScrollBar != null) 
                    //    mDrag.horizontalScrollBar.onDragFinished = OnDragFinished; 
    
                    //if (mDrag.verticalScrollBar != null) 
                    //    mDrag.verticalScrollBar.onDragFinished = OnDragFinished; 
                } 
            } 
            if (mQrcDrag.panel == null) return; 
    
            // Calculate the panel's center in world coordinates 
            Vector4 clip = mQrcDrag.panel.clipRange; 
            Transform dt = mQrcDrag.panel.cachedTransform; 
            Vector3 center = dt.localPosition; 
            center.x += clip.x; 
            center.y += clip.y; 
            center = dt.parent.TransformPoint(center); 
    
            // Offset this value by the momentum 
            Vector3 offsetCenter = center - mQrcDrag.currentMomentum * (mQrcDrag.momentumAmount * 0.1f); 
            mQrcDrag.currentMomentum = Vector3.zero; 
    
            float min = float.MaxValue; 
            Transform closest = null; 
            Transform trans = transform; 
    
            //Determine whether the user is to click on or drag 
            if (obj != null) 
            { 
                closest = obj.transform; 
            } 
            else { 
                closest = DetermineCloestChild(trans, offsetCenter, min, closest); 
            } 
    
            // Spring the panel to this calculated position 
            MoveTargetPosition(closest, dt, center); 
        } 
    
        /// <summary> 
        /// Determine the closest child 
        /// </summary> 
        public Transform DetermineCloestChild(Transform trans, Vector3 offsetCenter, float min, Transform closest) 
        { 
            for (int i = 0, imax = trans.childCount; i < imax; ++i) 
            { 
                Transform t = trans.GetChild(i); 
                float sqrDist = Vector3.SqrMagnitude(t.position - offsetCenter); 
    
                if (sqrDist < min) 
                { 
                    min = sqrDist; 
                    closest = t; 
                } 
            } 
            return closest; 
        } 
    
        /// <summary> 
        /// Spring the panel to this calculated position 
        /// </summary> 
        public void MoveTargetPosition(Transform closest, Transform dt, Vector3 center) 
        { 
            if (closest != null) 
            { 
                mCenteredObject = closest.gameObject; 
    
                // Figure out the difference between the chosen child and the panel's center in local coordinates 
                Vector3 cp = dt.InverseTransformPoint(closest.position); 
                Vector3 cc = dt.InverseTransformPoint(center); 
                Vector3 offset = cp - cc; 
    
                // Offset shouldn't occur if blocked by a zeroed-out scale 
                if (mQrcDrag.scale.x == 0f) offset.x = 0f; 
                if (mQrcDrag.scale.y == 0f) offset.y = 0f; 
                if (mQrcDrag.scale.z == 0f) offset.z = 0f; 
    
                // Spring the panel to this calculated position 
                SpringPanel.Begin(mQrcDrag.gameObject, dt.localPosition - offset, 8f).onFinished = OnQrcFisished; 
            } 
            else mCenteredObject = null; 
        } 
    
    
        public delegate void OnQrcMoveToTragetFisished(GameObject obj); 
        public event OnQrcMoveToTragetFisished OnQrcMoveToTragetFisishedHandler; 
        /// <summary> 
        /// After reaching the target this method will be used. 
        /// </summary> 
        public void OnQrcFisished() { 
            OnQrcMoveToTragetFisishedHandler(mCenteredObject); 
        } 
    
    } 
    
    
    
    
    
    ==================================================分割线================================================== 
    
    
    
    using UnityEngine;using System.Collections; 
    
    [ExecuteInEditMode] 
    [RequireComponent(typeof(UIPanel))]public class QRCUIDraggablePanel : UIDraggablePanel 
    { 
    
        public delegate void OnDragFinished(GameObject obj); 
    
        /// <summary>    /// Event callback to trigger when the drag process finished. Can be used for additional effects, such as centering on some object. 
        /// </summary> 
    
        public OnDragFinished onDragFinished; 
    
    
        public void Press(bool pressed, GameObject obj) 
        {        if (enabled && NGUITools.GetActive(gameObject)) 
            {            if (!pressed && mDragID == UICamera.currentTouchID) mDragID = -10; 
    
                mCalculatedBounds = false; 
                mShouldMove = shouldMove;            if (!mShouldMove) return; 
                mPressed = pressed; 
    
                if (pressed)            { 
                    // Remove all momentum on press                mMomentum = Vector3.zero; 
                    mScroll = 0f; 
    
                    // Disable the spring movement                DisableSpring(); 
    
                    // Remember the hit position 
                    mLastPos = UICamera.lastHit.point; 
    
                    // Create the plane to drag along                mPlane = new Plane(mTrans.rotation * Vector3.back, mLastPos); 
                }            else 
                {                if (restrictWithinPanel && mPanel.clipping != UIDrawCall.Clipping.None && dragEffect == DragEffect.MomentumAndSpring) 
                    {                    RestrictWithinBounds(false); 
                    }                if (onDragFinished != null) onDragFinished(obj); 
                }        } 
        }} 
    
    
    
    
    ===============================================分割线================================================ 
    
    
    
    using UnityEngine;using System.Collections; 
    
    [ExecuteInEditMode] 
    public class QRCUIDragPanelContents : UIDragPanelContents{ 
    
        private Vector3 previousTouch; 
    
        /// <summary> 
        /// Create a plane on which we will be performing the dragging.    /// </summary> 
        protected void OnPress(bool pressed)    { 
            bool isClick = false;        Vector3 currentPos = Vector3.zero; 
    
            //Judge runtime platform 
            if (Application.platform == RuntimePlatform.IPhonePlayer || Application.platform == RuntimePlatform.Android)        { 
                if (Input.touchCount > 0)            { 
                    currentPos = Input.GetTouch(0).position;            } 
            }        else { 
                currentPos = Input.mousePosition;        } 
    
            //Calculation is click ? 
            if (pressed)        { 
                previousTouch = currentPos;        } 
            else {            if (Vector3.Distance(previousTouch, currentPos) < 20.0f) { isClick = true; } 
            } 
    
            if (enabled && NGUITools.GetActive(gameObject) && draggablePanel != null)        { 
                QRCUIDraggablePanel qrcDraggablePanel = draggablePanel as QRCUIDraggablePanel;             
                if (isClick)            { 
                    qrcDraggablePanel.Press(false, gameObject);            } 
                else {                qrcDraggablePanel.Press(pressed, null); 
                }        } 
    
            isClick = false; 
        } 
    
        private bool IsClick() {        if (Application.platform == RuntimePlatform.IPhonePlayer || Application.platform == RuntimePlatform.Android) { 
                if (Input.touchCount > 0)            { 
                    previousTouch = Input.GetTouch(0).position;            } 
            }        return true; 
        } 
    
        //protected void OnClick()    //{ 
        //    if (enabled && NGUITools.GetActive(gameObject) && draggablePanel != null)    //    { 
        //        QRCUIDraggablePanel qrcDraggablePanel = draggablePanel as QRCUIDraggablePanel;    //        qrcDraggablePanel.Press(false, gameObject); 
        //    }    //} 
    
    }
  • 相关阅读:
    【计算机组成】运算器与运算方法
    【计算机组成】数据表示
    【计算机组成】概论
    【Python】基础总结
    Robot Framework(14)- Variables 表的详细使用和具体例子
    Robot Framework(13)- RF 循环的详细使用
    Robot Framework(12)- 详细解读 RF 的变量和常量
    Robot Framework(11)- 用户关键字的详解
    Robot Framework(10)- 使用资源文件
    Robot Framework(9)- 使用变量文件
  • 原文地址:https://www.cnblogs.com/123ing/p/4062680.html
Copyright © 2011-2022 走看看