void UpdateStateMomentum() { MoveScrollerPivot(m_DragInput.ScrollDelta); bool switchToAnim = !m_DragInput.HasMomentum() || AdjustScrollToLimits(); if (switchToAnim) { m_ScrollMode = E_ScrollMode.Anim; int stopItemIndex = GetNearestItem(m_DragInput.ScrollDelta.x); m_CurrentItemIndex = Mathf.Clamp(stopItemIndex, 0, m_Items.Count - 1); //Debug.Log("m_CurrentItemIndex is set to: " + m_CurrentItemIndex); //z aktualni rychlosti a vzdalenosti vypocitej cas za jaky tam dorazime float distToItem = Mathf.Abs(m_ScrollPivot.transform.localPosition.x + m_CurrentItemIndex * ItemOffset); float curSpeed = Mathf.Max(m_DragInput.MoveSpeed, m_DragInput.MinSpeed); float timeToScroll = distToItem / curSpeed; //Debug.Log("Finishing anim - timeToScroll: " + timeToScroll + " dist: " + distToItem + " move speed: " + curSpeed); //create transition anim m_Transition = new Transition(m_ScrollPivot.transform.localPosition.x, -(m_CurrentItemIndex * ItemOffset), timeToScroll, Tween.Easing.Quad.EaseOut); } }
void UpdateState() { //mode changes //faze: 1) tahneme scroller -> touch begin // 2) pustime ho ale jeste ma setrvacnost -> touch end // 3) setrvacnost klesne pod urcitou hodnotu, doscroloujeme na nejblizsi item -> momentum klesne pod limit // 4) ukonceni scrollu, dal jsme v klidu dokud znova nezacne opet 1) -> ukonceni transition if (m_DragInput.IsDragging && Mathf.Abs(m_DragInput.ScrollDelta.x) > 0.0f /*&& !AdjustScrollToLimits()*/) { m_ScrollMode = E_ScrollMode.Drag; m_Transition = null; UpdateStateDrag(); } else { switch (m_ScrollMode) { case E_ScrollMode.Idle: UpdateStateIdle(); break; case E_ScrollMode.Drag: UpdateStateDrag(); break; case E_ScrollMode.Momentum: UpdateStateMomentum(); break; case E_ScrollMode.Anim: UpdateStateAnim(); break; } } }
void UpdateStateIdle() { if (m_DragInput.IsDragging && Mathf.Abs(m_DragInput.ScrollDelta.x) > 0.0f) { m_ScrollMode = E_ScrollMode.Drag; MoveScrollerPivot(m_DragInput.ScrollDelta); } }
void UpdateStateAnim() { Vector2 curPos = m_ScrollPivot.transform.localPosition; curPos.x = m_Transition.GetTransition(); m_ScrollPivot.transform.localPosition = curPos; m_ScrollPivot.SetModify(true); if (m_Transition.IsDone()) { m_Transition = null; m_ScrollMode = E_ScrollMode.Idle; if (m_OnSelectionChange != null) { m_OnSelectionChange(GetSelectedItem()); } } }
//Doscroluje k itemu na pozici index. void SetSelectedItem(int index) { //reset scroll mode and remove transition m_Transition = null; m_ScrollMode = E_ScrollMode.Idle; //Debug.Log("SetSelectedItem: " + index); m_ScrollPivot.transform.localPosition = new Vector2(-index * ItemOffset, m_ScrollPivot.transform.localPosition.y); //changed y value because value 0 broke layout in ResearchScroller_Layout m_ScrollPivot.SetModify(true); //store index of selected item m_CurrentItemIndex = index; //notify user if (m_OnSelectionChange != null) { m_OnSelectionChange(GetSelectedItem()); } }
void UpdateStateDrag() { if (m_DragInput.IsDragging && Mathf.Abs(m_DragInput.ScrollDelta.x) > 0.0f) { MoveScrollerPivot(m_DragInput.ScrollDelta); if (AdjustScrollToLimits()) { m_ScrollMode = E_ScrollMode.Anim; int stopItemIndex = GetNearestItem(m_DragInput.ScrollDelta.x); m_CurrentItemIndex = Mathf.Clamp(stopItemIndex, 0, m_Items.Count - 1); m_Transition = new Transition(m_ScrollPivot.transform.localPosition.x, -(m_CurrentItemIndex * ItemOffset), 0.35f, Tween.Easing.Linear.EaseNone); } } else { m_ScrollMode = E_ScrollMode.Momentum; } }
//Doscroluje k itemu na pozici index. void ScrollToItem(int index) { if (m_CurrentItemIndex == index) { return; } //Debug.Log("ScrollToItem: " + index); m_ScrollMode = E_ScrollMode.Anim; //float distToItem = Mathf.Abs(m_ScrollPivot.transform.localPosition.x + index*ItemOffset); int scrCnt = Mathf.Abs(m_CurrentItemIndex - index); float scrollTime = 0.5f + (scrCnt - 1) * 0.15f; //create transition anim m_Transition = new Transition(m_ScrollPivot.transform.localPosition.x, -(index * ItemOffset), scrollTime, Tween.Easing.Sine.EaseInOut); //store index of selected item m_CurrentItemIndex = index; //notify user by nemel byt potreba, k notifikaci by melo dojit na konci transition. //if(m_OnSelectionChange != null) // m_OnSelectionChange( GetSelectedItem() ); }