2011-05-31 67 views
0

我使用以下代碼作爲一組可滾動條的一部分,以便在拖動時相對於另一個條來更改每個條。它的工作原理,直到用戶儘可能快地滑動欄,然後數字出錯...我敢肯定,這是功能無法像鼠標一樣快速處理,但任何人都知道解決方法?AS2:鼠標移動得太快會弄亂函數

onClipEvent (load) { 
    Symptoms_sliders = new Array(this._parent.slider1.slider, this._parent.slider2.slider, this._parent.slider3.slider, this._parent.slider4.slider, this._parent.slider5.slider); 
    Food_sliders = new Array(this._parent.slider6.slider, this._parent.slider7.slider, this._parent.slider8.slider, this._parent.slider9.slider); 
    for (i=0; i<Food_sliders.length; i++) { 
     Food_sliders[i]._y = 75; 
    } 
    is_scrolling = 0; 
    function Food_scroll_ratio() { 
     init_scroll_diff = init_scroll_num-init_scroll._y; 
     Slider_ratio = new Array(); 
     totalLeft = init_scroll_num; 
     while (_global.init_moved != init_scroll._y) { 
      for (i=0; i<Food_sliders.length; i++) { 
       if (Food_sliders[i] != init_scroll) { 
        slider_pos = Food_sliders[i]._y; 
        percentageOf = ((100-init_slider_pos[i])/totalLeft)*100; 
        percentageMultiplier = 100/percentageOf; 
        trace(percentageMultiplier); 
        if (init_scroll_num == 0) { 
         scroll_change = Math.round(Math.abs(init_scroll_diff/3)); 
        } else { 
         scroll_change = Math.round(Math.abs(init_scroll_diff)/percentageMultiplier); 
        } 
        if (percentageOf == Infinity) { 
         Food_sliders[i]._y = 100; 
        } else if (init_scroll_diff>0) { 
         Food_sliders[i]._y = init_slider_pos[i]+scroll_change; 
        } else if (init_scroll_diff<0) { 
         Food_sliders[i]._y = init_slider_pos[i]-scroll_change; 
        } 

       } 
      } 
      _global.init_moved = init_scroll._y; 

     } 
    } 
} 
onClipEvent (mouseMove) { 
    for (i=0; i<Food_sliders.length; i++) { 
     Food_sliders[i].onPress = function() { 
      startDrag(this, false, 0, 100, 0, 0); 
      init_scroll_num = this._y; 
      init_scroll = this; 
      is_scrolling = 1; 
      init_slider_pos = new Array(); 
      init_slider_pos.push(Food_sliders[0]._y); 
      init_slider_pos.push(Food_sliders[1]._y); 
      init_slider_pos.push(Food_sliders[2]._y); 
      init_slider_pos.push(Food_sliders[3]._y); 
     }; 
     Food_sliders[i].onRelease = Food_sliders[i].onReleaseOutside=function() { 
      stopDrag(); 
      is_scrolling = 0; 
     }; 
    } 
    if (is_scrolling == 1) { 
     Food_scroll_ratio(); 
    } 
} 
+0

的mouseMove被分派比enterFrame事件多了不少,所以嘗試。此外,您不需要每次鼠標移動時初始化數組並分配偵聽器,您只需設置一次,然後更新mouseMove/enterFrame – 2011-05-31 14:46:09

+0

它位於mouseMove = /上,我需要設置這些數組,因爲它們必須清晰下一次它被點擊/移動,因爲它們必須每次更新。 – 2011-05-31 14:49:58

+0

我建議你應該嘗試onClipEvent(enterFrame)而不是onClipEvent(mouseMove),看看是否稍微好一點。所有this._parent.slider6.slider和類似的引用看起來都像重複代碼。這可以用更清晰/更清晰的方式書寫。儘量保持它[幹](http://en.wikipedia.org/wiki/Don%27t_repeat_yourself)。你能簡單地描述你想要達到的目標嗎?我不明白你的滑塊應該如何工作。 – 2011-05-31 15:02:55

回答

0

此問題仍然存在,我不認爲這是可以避免的,但我用另一個函數(Slider_checker)鼠標後運行一次20ms的空閒每次鼠標滾動滾動條(20毫秒它允許確保Food_Scroll_ratio的所有循環都已完成,因此沒有任何干擾,並節省了一些cpu週期)。

這是我的最終代碼:

onClipEvent (load) { 
    Symptoms_sliders = new Array(this._parent.slider1.slider, this._parent.slider2.slider, this._parent.slider3.slider, this._parent.slider4.slider, this._parent.slider5.slider); 
    Food_sliders = new Array(this._parent.slider6.slider, this._parent.slider7.slider, this._parent.slider8.slider, this._parent.slider9.slider); 
    for (i=0; i<Food_sliders.length; i++) { 
     Food_sliders[i]._y = 75; 
    } 
    is_scrolling = 0; 
    Slider_check_interval = 0; 
    var mouseTimerID:Number; 
    var delay:Number = 50; 
    var mouseMoveListener = new Object(); 
    mouseMoveListener.onMouseMove = function() { 
     clearInterval(mouseTimerID); 
     mouseTimerID = setInterval(Slider_checker, delay); 
    }; 
    Slider_checker = function() { 
     while (Slider_check_interval == 1) { 
      count = 0; 
      for (i=0; i<Food_sliders.length; i++) { 
       count += 100-Food_sliders[i]._y; 
      } 
      if (count != 100 && count != 0) { 
       mxm = Food_sliders[0]; 
       for (i=0; i<Food_sliders.length; i++) { 
        if (Food_sliders[i]._y<mxm._y) { 
         mxm = Food_sliders[i]; 
        } 
       } 
       if (count>100) { 
        mxm._y += count-100; 
       } 
       if (count<100) { 
        mxm._y -= 100-count; 
       } 
      } 
      Slider_check_interval = 0; 
     } 
    }; 


    Mouse.addListener(mouseMoveListener); 
    function Food_scroll_ratio() { 
     init_scroll_diff = init_scroll_num-init_scroll._y; 
     totalLeft = init_scroll_num; 
     Slider_check = new Array(); 
     for (i=0; i<Food_sliders.length; i++) { 
      if (Food_sliders[i] != init_scroll) { 
       slider_pos = Food_sliders[i]._y; 
       percentageOf = ((100-init_slider_pos[i])/totalLeft)*100; 
       percentageMultiplier = 100/percentageOf; 
       if (init_scroll_num == 0) { 
        scroll_change = Math.round(Math.abs(init_scroll_diff/3)); 
       } else { 
        scroll_change = Math.round(Math.abs(init_scroll_diff)/percentageMultiplier); 
       } 
       if (percentageOf == Infinity) { 
        Food_sliders[i]._y = 100; 
       } else if (init_scroll_diff>0) { 
        Food_sliders[i]._y = init_slider_pos[i]+scroll_change; 
       } else if (init_scroll_diff<0) { 
        Food_sliders[i]._y = init_slider_pos[i]-scroll_change; 
       } 
      } 
     } 
     Slider_check_interval = 1; 
    } 
} 
onClipEvent (mouseMove) { 
    for (i=0; i<Food_sliders.length; i++) { 
     Food_sliders[i].onPress = function() { 
      startDrag(this, false, 0, 100, 0, 0); 
      init_scroll_num = this._y; 
      init_scroll = this; 
      is_scrolling = 1; 
      init_slider_pos = new Array(); 
      init_slider_pos.push(Food_sliders[0]._y); 
      init_slider_pos.push(Food_sliders[1]._y); 
      init_slider_pos.push(Food_sliders[2]._y); 
      init_slider_pos.push(Food_sliders[3]._y); 
     }; 
     Food_sliders[i].onRelease = Food_sliders[i].onReleaseOutside=function() { 
      stopDrag(); 
      is_scrolling = 0; 
     }; 

    } 
    if (is_scrolling == 1) { 
     Food_scroll_ratio(); 
    } 
}