2011-10-31 106 views
2

我需要在NSView中繪製波形。 (我有一個數組中的所有樣本)。繪圖必須高效且真正快速,無需剪裁,閃爍等,它必須平滑。波形將根據歌曲位置「移動」,樣本的某些更改(DSP處理)將作爲視覺表示在NSView上實時顯示。在NSView中繪製波形

我熟悉的畫線,弧線等在畫布上的對象,我有開發的應用程序在做這樣的事情,但不能在Mac OS X ...

我想問如果有人能指導我從哪裏開始畫畫!核心動畫,OpenGL,簡單的重寫繪圖方法等??這將是最佳實踐 - 使用API​​?

回答

3

我會保持簡單,並創建一個NSView子類與audioData財產,使用可可繪圖。您可以撥打​​,然後撥打[self setNeedsDisplay:YES]

在您的drawRect:方法中,您可以遍歷樣本並相應地使用NSRectFill()。這裏samplevalue爲0

和1之間

- (void)drawRect:(NSRect)dirtyRect { 
    [[NSColor blueColor]set]; 
    for (id sample in self.waveArray) { 
     NSRect drawingRect = NSZeroRect; 
     drawingRect.origin.x = [self bounds].origin.x; 
     drawingRect.origin.y = [self bounds].origin.y + ([self.waveArray indexOfObject:sample]/([self.waveArray count] - 1.0)); 
     drawingRect.size.width = [self bounds].size.width/[self.waveArray count]; 
     drawingRect.size.height = [self bounds].size.height * [sample value]; 
     NSRectFill(drawingRect); 
    } 
} 
此代碼是不準確的,你應該確保只收集樣品,使其內部 dirtyRect比較有效。

+0

你說 - (void)drawRect:(NSRect)rect被部分調用控件的特定矩陣嗎?任何方式...因爲[view setAudioData]將強制整個控件被重新繪製,(由於新的波形數據),也許這並不重要!還是呢? – Vassilis

+0

' - (void)drawRect:(NSRect)rect'由Cocoa隨意調用(並且不應該直接調用),並且可能只有部分視圖需要重繪(如果它在滾動視圖中, 例如)。爲了提高效率,您只應重​​繪需要重繪的內容,而不是整個視圖。 'setNeedsDisplay:YES'(應該在'setAudioData:'內調用)告訴視圖完全重畫。 [Cocoa View編程指南](http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/CocoaViewsGuide/)會是一些很好的閱讀。 – spudwaffle

+0

告訴我,如果你需要我來搭建一個Xcode項目的例子。 – spudwaffle

0

我將從一個非常長而薄的圖像開始,代表波形的單個條形/列。

我的計劃是讓NSTimer每0.01秒向左移動一個波浪的酒吧。

所以像這樣的循環。

for (int x; x < [WaveArray count] ; x++) 
{ 
    UIImageView * Bar = [WaveArray ObjectAtIndex: x]; 
    [Bar setCenter:CGPointMake(Bar.center.x-1,Bar.center.y)]; 
} 

現在,所有你需要做的就是在正確的HIGHT創建對象,將它們添加到WaveArray,他們都將被移動到左邊。

+0

感謝您的回答。我的問題是,是否重寫NSView的繪圖方法來完成所有提到的事情,或者使用OpenGL,Quartz,AppKit等等。我很熟悉使用哪種API技術,但根本沒有使用哪種API。 – Vassilis

+0

我實際上是從視圖控制器做到這一切哈哈。 – Necro

+0

我甚至沒有自定義視圖 – Necro