我需要在NSView中繪製波形。 (我有一個數組中的所有樣本)。繪圖必須高效且真正快速,無需剪裁,閃爍等,它必須平滑。波形將根據歌曲位置「移動」,樣本的某些更改(DSP處理)將作爲視覺表示在NSView上實時顯示。在NSView中繪製波形
我熟悉的畫線,弧線等在畫布上的對象,我有開發的應用程序在做這樣的事情,但不能在Mac OS X ...
我想問如果有人能指導我從哪裏開始畫畫!核心動畫,OpenGL,簡單的重寫繪圖方法等??這將是最佳實踐 - 使用API?
我需要在NSView中繪製波形。 (我有一個數組中的所有樣本)。繪圖必須高效且真正快速,無需剪裁,閃爍等,它必須平滑。波形將根據歌曲位置「移動」,樣本的某些更改(DSP處理)將作爲視覺表示在NSView上實時顯示。在NSView中繪製波形
我熟悉的畫線,弧線等在畫布上的對象,我有開發的應用程序在做這樣的事情,但不能在Mac OS X ...
我想問如果有人能指導我從哪裏開始畫畫!核心動畫,OpenGL,簡單的重寫繪圖方法等??這將是最佳實踐 - 使用API?
我會保持簡單,並創建一個NSView
子類與audioData
財產,使用可可繪圖。您可以撥打,然後撥打[self setNeedsDisplay:YES]
。
在您的drawRect:
方法中,您可以遍歷樣本並相應地使用NSRectFill()
。這裏sample
的value
爲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
比較有效。
我將從一個非常長而薄的圖像開始,代表波形的單個條形/列。
我的計劃是讓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,他們都將被移動到左邊。
你說 - (void)drawRect:(NSRect)rect被部分調用控件的特定矩陣嗎?任何方式...因爲[view setAudioData]將強制整個控件被重新繪製,(由於新的波形數據),也許這並不重要!還是呢? – Vassilis
' - (void)drawRect:(NSRect)rect'由Cocoa隨意調用(並且不應該直接調用),並且可能只有部分視圖需要重繪(如果它在滾動視圖中, 例如)。爲了提高效率,您只應重繪需要重繪的內容,而不是整個視圖。 'setNeedsDisplay:YES'(應該在'setAudioData:'內調用)告訴視圖完全重畫。 [Cocoa View編程指南](http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/CocoaViewsGuide/)會是一些很好的閱讀。 – spudwaffle
告訴我,如果你需要我來搭建一個Xcode項目的例子。 – spudwaffle