在NSView中绘制波形

时间:2011-10-31 23:00:01

标签: objective-c cocoa opengl animation nsview

我需要在NSView中绘制波形。 (我将所有样本放在一个数组中)。绘图必须高效且快速,无需剪裁,闪烁等,必须平滑。波形将根据歌曲位置“移动”,并且样本的一些变化(DSP处理)将在NSView上实时显示为可视化表示。

我很熟悉在画布对象上绘制线条,弧线等,我开发的应用程序正在做这些事情,但不是在Mac OS X上...

我想问一下是否有人可以指导我从哪里开始画画!核心动画,OpenGL,简单的覆盖绘图方法,??等。这将是最佳实践 - 使用API​​?

2 个答案:

答案 0 :(得分:3)

我会保持简单并创建一个NSView子类,其中audioData属性使用Cocoa绘图。您可以拨打[view setAudioData:waveArray],然后拨打[self setNeedsDisplay:YES]

drawRect:方法中,您可以遍历示例并相应地使用NSRectFill()sample value的{​​{1}}介于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内绘制样本,即可确保更高效。

答案 1 :(得分: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)];
}

现在你所要做的就是在正确的高度创建对象并将它们添加到WaveArray中,它们都将被移动到左侧。