Рисование формы волны в NSView - PullRequest
2 голосов
/ 01 ноября 2011

Мне нужно нарисовать форму волны в NSView.(У меня есть все образцы в массиве).Рисунок должен быть эффективным и действительно быстрым, без обрезки, мерцания и т. Д., Он должен быть плавным.Форма волны будет «двигаться» в соответствии с положением песни, а некоторые изменения в сэмплах (обработка DSP) будут отображаться в виде визуального представления в NSView в режиме реального времени.

Я знаком с рисованием линий, дуг и т.объекты Canvas и я разработали приложения, которые делают такие вещи, но не в Mac OS X ...

Я хочу спросить, может ли кто-нибудь подсказать мне, с чего начать рисовать!Базовая анимация, OpenGL, простые методы рисования с переопределением, ?? и т. Д. Что было бы лучше всего - использовать API?

Ответы [ 2 ]

3 голосов
/ 01 ноября 2011

Я бы оставил это простым и создал бы подкласс NSView со свойством audioData, которое использует рисунок Какао.Вы можете вызвать [view setAudioData:waveArray], что, в свою очередь, вызовет [self setNeedsDisplay:YES].

. В вашем методе drawRect: вы можете затем выполнить итерации по сэмплам и использовать NSRectFill() соответственно.Здесь sample s 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.

0 голосов
/ 01 ноября 2011

Я бы начал с очень длинного и тонкого изображения, представляющего один столбец / столбец для формы волны.

Мой план состоял бы в том, чтобы иметь 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, и все они будутпереместиться влево.

...