Слои прозрачности

Слой прозрачности состоит из двух или больше объектов, объединенных для получения составной диаграммы. Получающийся составной объект обрабатывается как отдельный объект. Слои прозрачности полезны, когда Вы хотите применить эффект к группе объектов, таких как тень применился к этим трем кругам на рисунке 9-1.

Рисунок 9-1  Три круга как составной объект в слое прозрачности
Three circles as a composite in a transparency layer

При применении тени к этим трем кругам на рисунке 9-1 без первого рендеринга их к слою прозрачности Вы показали результат на рисунке 9-2.

Рисунок 9-2  Три круга, нарисованные как отдельные объекты
Three circles painted as separate entities

Как работают слои прозрачности

Кварцевые слои прозрачности подобны уровням, доступным во многих популярных графических приложениях. Уровни являются независимой сущностью. Кварц поддерживает штабель слоя прозрачности для каждого контекста, и слои прозрачности могут быть вложены. Но потому что уровни всегда являются частью штабеля, Вы не можете управлять ими независимо.

Вы сигнализируете запуск слоя прозрачности путем вызывания функции CGContextBeginTransparencyLayer, который берет в качестве параметров графический контекст и объект CFDictionary. Словарь позволяет Вам предоставить возможности указывать дополнительную информацию об уровне, но потому что словарь еще не используется Кварцем 2D API, Вы передаете NULL. После этого вызова параметры состояния графики остаются неизменными за исключением альфы (который установлен в 1), тень (который выключен), режим смешивания (который установлен в нормальный), и другие параметры, влияющие на заключительный составной объект.

После начала слоя прозрачности Вы выполняете любое получение, Вы хотите появиться в том уровне. Операции рисования в указанном контексте нарисованы как составной объект в полностью прозрачный фон. Этот фон обрабатывается как отдельный целевой буфер от контекста.

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

Рисование к слою прозрачности

Рисование к слою прозрачности требует трех шагов:

  1. Вызовите функцию CGContextBeginTransparencyLayer.

  2. Нарисуйте элементы, которые Вы хотите составить в слое прозрачности.

  3. Вызовите функцию CGContextEndTransparencyLayer.

Эти три прямоугольника на рисунке 9-3 красятся к слою прозрачности. Кварц представляет тень, как будто прямоугольники являются единым блоком.

Рисунок 9-3  Три прямоугольника, нарисованные к слою прозрачности
Three rectangles painted to a transparency layer

Функция в Перечислении 9-1 показывает, как использовать слой прозрачности для генерации прямоугольников на рисунке 9-3. Подробное объяснение каждой пронумерованной строки кода следует за перечислением.

  Рисование перечисления 9-1 к слою прозрачности

void MyDrawTransparencyLayer (CGContext myContext, // 1
                                CGFloat wd,
                                CGFloat ht)
{
    CGSize          myShadowOffset = CGSizeMake (10, -20);// 2
 
    CGContextSetShadow (myContext, myShadowOffset, 10);   // 3
    CGContextBeginTransparencyLayer (myContext, NULL);// 4
    // Your drawing code here// 5
    CGContextSetRGBFillColor (myContext, 0, 1, 0, 1);
    CGContextFillRect (myContext, CGRectMake (wd/3+ 50,ht/2 ,wd/4,ht/4));
    CGContextSetRGBFillColor (myContext, 0, 0, 1, 1);
    CGContextFillRect (myContext, CGRectMake (wd/3-50,ht/2-100,wd/4,ht/4));
    CGContextSetRGBFillColor (myContext, 1, 0, 0, 1);
    CGContextFillRect (myContext, CGRectMake (wd/3,ht/2-50,wd/4,ht/4));
    CGContextEndTransparencyLayer (myContext);// 6
}

Вот то, что делает код:

  1. Берет три параметра — графический контекст и ширина и высота для использования при построении прямоугольников.

  2. Устанавливает a CGSize структура данных, содержащая значения смещения x и y для тени. Эта тень смещается 10 модулями в горизонтальном направлении и –20 модулями в вертикальном направлении.

  3. Устанавливает тень, указывая значение 10 как значение размытости. (Значение 0 указывает твердую граничную тень без размытости.)

  4. Сигнализирует запуск слоя прозрачности. С этого момента получение происходит с этим уровнем.

  5. Следующие шесть строк цветов заливки кодового набора и заливки эти три прямоугольника, показанные на рисунке 9-3. Вы заменяете эти строки своим собственным кодом для прорисовки.

  6. Сигнализирует конец слоя прозрачности и сигнализирует, что Кварц должен составить результат в контекст.