2015-10-14 3 views
2

Я использую Superpowered SDK, чтобы воспроизвести звук. У него есть функция, которая возвращает unsigned char ** под названием peakWaveForm. Я написал пользовательский uiview и попытаюсь нарисовать эти значения, и мой взгляд не имеет хорошего взгляда. Мой вопрос, каким образом должны быть значения для рисования моей формы волны ?. И какая переменная. Массив?. Каким должен быть нормальный размер сигнала ?. SDK возвращает unsigned char **, как я могу продолжить?Как нарисовать форму волны?

- (void)drawRect:(CGRect)updateRect 
{ 
    unsigned i, maxIndex; 

    maxIndex = floor(CGRectGetMaxX(updateRect)); 
    i = floor(CGRectGetMinX(updateRect)); 
    float firstPoint = (float)mPeakWaveForm[0][i]; 

    UIBezierPath *path = [UIBezierPath bezierPath]; 
    path.lineWidth = 2; 
    [[UIColor blackColor] setFill]; 
    [path moveToPoint:CGPointMake(i,firstPoint)]; 

    for(i; i <= maxIndex; i++) 
    { 
     float nextPoint = (float)mPeakWaveForm[0][i]; 
     [path addLineToPoint:CGPointMake(i, nextPoint)]; 
    } 
    [path fill]; 
} 

ответ

0

Я был в той же ситуации, что и вы, и решил это так. Во-первых, сигнал, который вы получаете только в 1-мерном массиве данных, и мы хотим, чтобы он 2d имел его на обеих осях. Так что я сделал, был создать точку массива вместо рисования пути прямо, а затем рисовать путь один раз и в другой раз зеркально Arround оси х, как это:

var points = Array<CGPoint>() 
    for(i; i <= maxIndex; i++) 
    { 
     float nextPoint = (float)mPeakWaveForm[0][i]; 
     points.append(CGPoint(x: CGFloat(i), y: CGFloat(nextPoint))) 
    } 
    //Move to the center of the view 
    var xf = CGAffineTransformIdentity; 
    xf = CGAffineTransformTranslate(xf, 0, halfHeight) 
    //Scale it as needed (you can avoid it) 
    xf = CGAffineTransformScale(xf, xscale, yscale) 

    let path = CGPathCreateMutable() 
    //Draw the lines 
    CGPathAddLines(path, &xf, points, points.count) 

    //Mirror the drawing and draw them again 
    xf = CGAffineTransformScale(xf, 1.0, -1.0); 
    CGPathAddLines(path, &xf, points, points.count); 

    CGPathCloseSubpath(path) 
    //Draw the path 
    let ctx = UIGraphicsGetCurrentContext(); 
    CGContextAddPath(ctx, path); 
    CGContextSetStrokeColorWithColor(ctx,UIColor.whiteColor().CGColor); 
    CGContextFillPath(ctx); 

К сожалению о коде, находящейся в быстры, но функции те же, что и в Objective-C

Смежные вопросы