2016-05-03 9 views
0

Ich verwende einen Schieberegler, um historische Daten in meine Visualisierungsanwendung zu laden. Der Schieberegler repräsentiert eine Zeitperiode relativ zu jetzt. So können Sie zeitlich rückwärts gleiten und Daten laden.Funktionsaufruf bei Slider Release?

Derzeit werden die Daten immer geladen, wenn sich der Wert des Sliders ändert, was bedeutet, wenn ich vor 5 Stunden sehen möchte? Ich habe alles laden zwischendurch ...

Der Code verwende ich unten aufgeführt ist:

history = LoadData.Historical(); 

    data = GameObject.Find("DataManager").GetComponent<LoadData>(); 

    slider.maxValue = history.Length - 1; 
    slider.value = slider.maxValue; 
    slider.onValueChanged.AddListener(delegate { ValueChange(); }); 

wo Valuechange() etwa wie folgt enthält:

LoadData.Candles(data.bounds, history[(int)slider.value]); 

Gibt es eine Möglichkeit dass ich die Daten nur laden kann, wenn der Wert geändert wurde UND wenn ich den Schieber nicht halte?

Hinweis: Ich habe eine Coroutine-Methode versucht, um dies zu erreichen, aber es endete nur in Tränen und Endlosschleifen. :/

Edit:

ich diese Lösung ausgearbeitet, aber es scheint OnMouseUp nicht direkt auf Sliders funktioniert ... Irgendwelche Ideen?

void Start() 
{ 

    slider = gameObject.GetComponent<Slider>(); 

    history = LoadData.Historical(); 

    data = GameObject.Find("DataManager").GetComponent<LoadData>(); 

    slider.maxValue = history.Length - 1; 
    slider.value = slider.maxValue; 
    slider.onValueChanged.AddListener(delegate { ValueChange(); }); 

    LoadData.Candles(data.bounds, history[(int)slider.maxValue]); 

    valueChanged = false; 
} 

void OnMouseUp() 
{ 
    Debug.Log("UP"); 
    if (valueChanged) 
    { 
     LoadData.DestroyCandles(); 
     LoadData.Candles(data.bounds, history[(int)slider.value]); 
    } 
    valueChanged = false; 
} 

void ValueChange() 
{ 
    valueChanged = true; 
    Debug.Log(valueChanged); 
} 

Edit2:

enter image description here

+0

Sie wollen nur Sachen passieren, wenn Sie den Schieberegler bewegen und dann loslassen? Nicht nur wenn du es bewegst? – Programmer

+0

BTW warum verwenden Sie einen komplizierten "AddListener" Anruf? Ziehe einfach ** die Funktion auf den Schieberegler im Editor **. – Fattie

+0

Nun, das Freigeben des Schiebers bedeutet das Loslassen der Maustaste ............ – yes

Antwort

0

Sie könnten das Ereignissystem verwenden, um das MouseUp Ereignis wie unten zu erfassen. Es sollte den Trick tun, aber Sie werden für, wenn der Wert geändert oder dich nicht (nur speichert den alten Wert und prüfen, ob es nicht gleich)

using UnityEngine; 
    using UnityEngine.UI; 
    using UnityEngine.EventSystems; 

    public class SliderOnPointerUpExample : MonoBehaviour, IPointerUpHandler { 

     Slider slider; 
     float oldValue; 

     void Start() { 
      slider = GetComponent<Slider>(); 
      oldValue = slider.value; 
     } 

     public void OnPointerUp(PointerEventData eventData) { 
      if(slider.value != oldValue) { 
       Debug.Log("Slider value changed from " + oldValue + " to " + slider.value); 
       oldValue = slider.value; 
      } 
     } 
    } 

IDK wenn sie die beste Lösung, eine Rechnung zu tragen müssen Lösung dennoch (aber wahrscheinlich auch nicht das Schlechteste): D

+0

Einheit hatte mich ((IPointerUpHandler) Schieberegler) .OnPointerUp (eventData); innerhalb von OnPointerUp(), aber ansonsten funktioniert das gut. Danke für Ihre Hilfe. –

+0

das sollte keine Anforderung sein. Wenn du willst, kann ich deinen neuen Code überlesen, wenn du ihn irgendwo einfügst ... sonst bist du willkommen, froh, dass ich dir helfen könnte :) – yes