2011-05-31 70 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(); 
    } 
}