2011-09-05 59 views

回答

1

的BitmapData有scroll()方法,你可以使用的最好的方法 - http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/display/BitmapData.html#scroll()

基本上每一帧,你只画像素的价值的数据的一列(你的BitmapData将是查看你的声音,并且每列像素是一次捕获的数据) - 大多数情况下,你可能只会使用setPixel()来设置音量值。

继续前进,一帧数据的一列像素,然后当你达到你的阈值(BitmapData的右侧)时,使用scroll()将数据移动一个像素(你会丢失最左侧的像素列),然后继续在像素的最后一列(右侧)绘图。您将创建一个不断更新的音量显示。

最后使用lock()unlock()之前和之后绘制停止更新屏幕Flash的同时。

我建议却有着某种限制 - 即成长无限=大问题后

编辑

下面是一些代码项目。这花了我0ms(在调试播放器上使用getTimer())来渲染。你最终会遇到问题,因为卷矢量增长无限,这从来都不是好事。如果你只需要保留最后的x帧,那么这段代码更容易。

package 
{ 
    import flash.display.Bitmap; 
    import flash.display.BitmapData; 
    import flash.display.Sprite; 
    import flash.events.Event; 
    import flash.utils.getTimer; 

    public class Main extends Sprite 
    { 
     private var m_bmd:BitmapData = null; 
     private var m_vol:Vector.<int> = null; 
     private var m_currVol:int  = 0; 

     public function Main():void 
     { 
      // create our bmd 
      this.m_bmd = new BitmapData(400.0, 200.0, false, 0); 

      // add it to the stage 
      var b:Bitmap = new Bitmap(this.m_bmd); 
      this.addChild(b); 

      // create our volume array 
      this.m_vol = new Vector.<int>(); 

      // set our current volume 
      this.m_currVol = this.m_bmd.height/2; 

      // start our volume listener 
      this.addEventListener(Event.ENTER_FRAME, this._onEnterFrame); 
     } 

     private function _onEnterFrame(e:Event):void 
     { 
      var start:int = getTimer(); 

      // update our volume and add it to our array 
      this.m_currVol += int((Math.random() * 10.0) - 5.0); // adds a random int between -5 and 5 
      this.m_currVol = (this.m_currVol < 0) ? 0 : (this.m_currVol > this.m_bmd.height) ? this.m_bmd.height : this.m_currVol; // clamp it to the bitmap data height 
      this.m_vol[this.m_vol.length] = this.m_currVol; 

      // lock our bitmap 
      this.m_bmd.lock(); 

      // clear the bitmap 
      this.m_bmd.fillRect(this.m_bmd.rect, 0); 

      // go through and draw our volumes (for max the size of the bmd) 
      var len:int  = (this.m_vol.length < this.m_bmd.width) ? this.m_vol.length : this.m_bmd.width; 
      var startX:int = (this.m_vol.length < this.m_bmd.width) ? 0 : this.m_vol.length - this.m_bmd.width; 
      for (var i:int = 0; i < len; i++) 
       this.m_bmd.setPixel(i, this.m_vol[startX + i], 0xffff00); 

      // unlock our bitmap 
      this.m_bmd.unlock(); 

      trace("This took " + (getTimer() - start) + "ms to render"); 
     }  

    } 

} 

添加一个滚动条来改变startX变量(默认情况下,它会始终显示数据的最后量),以及你在那里

+0

Divilly嗨, 感谢您抽出宝贵的时间来解释,但我需要的是一个可滚动的数据,即我不想丢失左侧的数据,而是想要将其屏蔽掉,并且一旦滚动条越过指定的宽度就会看到滚动条,所以在任何点时间,人们可以滚动到左侧,看到整个图表。至少这对我来说是一个挑战。 – mobdev999

+0

在这种情况下,只需保留一个卷的数字矢量。从矢量的末尾绘制数据vis的(end - numItems),并使用滚动条(不连接任何东西 - 只需要该值)以确定该起点(如果需要)。 – divillysausages

+0

命中cpu ... – mobdev999