Разное

Как сделать тень: box-shadow | htmlbook.ru

07.09.2023

Содержание

Как добавить тень объекту на видео в бесплатном редакторе VSDC

Если вы планируете добавлять на сцену графические объекты, эффект падающей тени поможет достичь максимально реалистичного результата. Смысл данного эффекта в том, чтобы создать иллюзию принадлежности объекта на сцене, и в этой инструкции мы расскажем как это сделать.

Эффект тени на видео позволяет добавить объем любому плоскому 2D объекту, и производит впечатление профессионально смонтированного ролика. Посмотрите, какая огромная разница между этими двумя заголовками:

Если вы хотите научиться добавлять тень объектам на видео, ниже мы расскажем как это сделать с помощью бесплатного видеоредактора VSDC для Windows. В последней части статьи мы также покажем, как добавить тень движущемуся объекту на видео с помощью продвинутой версии редактора VSDC Pro.

VSDC позволяет добиться максимально реалистичного эффекта благодаря гибкому набору настроек. В этой программе вы сможете отрегулировать:

  • размер падающей тени,
  • расстояние между объектом и тенью,
  • цвет тени и его насыщенность,
  • угол, под которым свет падает на объект.

Ваша задача – создать тень таким образом, чтобы добавленный объект выглядел максимально естественно на сцене. В качестве примера мы будем использовать текст, однако вы сможете использовать этот приём на любом другом графическом объекте, включая изображения и иконки.

Перед началом работы скачайте бесплатный видеоредактор VSDC на компьютер.

Как создать эффект падающей тени на видео

Запустите VSDC на компьютере и импортируйте видео в программу. Затем создайте текстовый объект, используя меню слева или зелёную кнопку «Вставить объект», расположенную сверху.

Чтобы добавить падающую тень текстовому заголовку, выполните следующие действия:

  1. Щёлкните мышью по текстовому объекту на таймлайне, чтобы выделить его.
  2. Перейдите в меню «Видеоэффекты», найдите «Специальные эффекты» и выберите «Тень».
  3. Во всплывшем окне «Настройки позиции объекта» вы можете откорректировать расположение эффекта тени на таймлайне. По умолчанию программа использует положение, в котором находится курсор. Если вас это устраивает, просто нажмите «Ok».

Совет. Обратите внимание, что в окне «Настройки позиции объекта» есть возможность «Связать позицию эффекта с позицией родителя». Это означает, что вы можете автоматически выровнять появление или исчезновение эффекта тени по позиции созданного текстового объекта.

Как настроить тень объекта на видео так, чтобы она выглядела реалистично

Первый этап пройден – тень от текстового объекта добавлена на сцену. Теперь мы рассмотрим настройки, которые позволят достичь нужного вам эффекта.

Чтобы открыть меню настроек эффекта «Тень», сделайте двойной щелчок по слою текста на таймлайне. Затем сделайте щелчок правой кнопкой мыши по слою эффекта «Тень» и из контекстного меню выберите опцию «Свойства».

В «Окне свойств», появившемся справа вы найдёте три раздела настроек:

  • Общие параметры.
  • Параметры корректировки эффекта.
  • Параметры эффекта «Тень».

В разделе «Общие параметры» вы можете дать название слою эффекта для удобства, а также отрегулировать момент появления и продолжительность эффекта на сцене.

Раздел «Параметры корректировки эффекта» позволяет настроить уровень прозрачности тени. Более того, используя строку «Начальное значение» и «Конечное значение», вы можете задать разные уровни прозрачности для начала и конца отображения эффекта. Если данные в этих строках будут отличаться, по мере проигрывания видео, тень будет становиться более насыщенной или более прозрачной – в зависимости от выбранных вами значений.

В качестве примера зададим следующие параметры прозрачности:

  • Начальное значение – 100%. Это означает, что появившись на сцене, тень будет абсолютно непрозрачной.
  • Конечное значение – 20%. На момент конца отображения уровень прозрачности будет составлять только 20%.

В результате тень будет постепенно исчезать по мере проигрывания:

Наконец, раздел «Параметры эффекта Тень» – это ключевой раздел меню, позволяющий настроить вид тени с максимальной точностью.

Например, вы сможете откорректировать угол падения света, расстояние между объектом и тенью, насыщенность цвета, наличие «шума» – а также динамическое изменение этих параметров по мере проигрывания видео. Ниже мы рассмотрим каждый параметр в отдельности, а также покажем, какой результат можно получить, изменяя значения в конкретных строках меню.

1. Угол падения света

Если по видео понятно, где находится источник света, вы сможете без труда настроить и угол, под которым будет падать тень. Кроме того, если по мере проигрывания видео угол падения света меняется, вы также сможете отразить это, задав разные значения для начала и конца отображения эффекта.

На иллюстрации ниже тень плавно перемещается вокруг объекта из изначальной позиции (45 градусов) в конечную позицию (225 градусов).

2. Расстояние до тени

Изменяя этот параметр, вы можете настроить расстояние между объектом и тенью. Расстояние также может быть как постоянным, так и переменным параметром, если вы зададите разные значения в строках «Начальное значение» и «Конечное значение».

Например, если источник света на видео перемещается по мере проигрывания – логично, что и тень будет двигаться в соответствующем направлении.

Совет. Для настройки угла и расстояния вы можете вручную перемещать тень на сцене, захватив её мышью в центре. Если вы не можете найти центр, используйте кнопку «Показать/скрыть центр» в окне свойств.

3. Максимальный размер тени

Если по вашей задумке тень должна быть более размыта, увеличьте параметр под названием «Максимальный размер тени». Чем выше значение в этой строке, тем менее чёткими будут очертания тени, и тем больше будет её размер. Обратите внимание, что при значении «Максимальный размер тени» равном нулю, падающая тень полностью исчезнет.

4. Интенсивность

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

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

Как добавить эффект падающей тени для движущегося объекта на видео

Теперь, когда вы знаете как создать идеальную падающую тень на видео, вы сможете использовать этот эффект не только для статичных, но и для движущихся объектов. Другими словами, созданная тень будет перемещаться в кадре вместе с выбранным объектом благодаря модулю отслеживания движения в VSDC Pro (подробнее о модуле и о том, как с ним работать, вы можете прочитать здесь).

Например, если вы работаете с текстовым объектом, результат будет выглядеть так:

Прежде чем начинать, мы советуем подробно ознакомиться с инструкцией по ссылке выше, чтобы понимать принцип работы модуля отслеживания движения. Здесь же мы приведём лишь краткий список шагов, которые необходимо сделать после того, как вы добавили тень:

  1. Левой кнопкой мыши щёлкните по слою видео на таймлайне и выберите опцию «Создать карту движений».
  2. Затем разместите рамку для отслеживания движений поверх объекта, траекторию которого вы хотите записать.
  3. После того, как карта будет сформирована, сохраните её на вашем ПК.
  4. Сделайте двойной щелчок на слое с текстом на таймлайне, чтобы зайти в него.
  5. Обратите внимание, что слой с эффектом тени уже добавлен на шкалу времени и применён к тексту. Всё что осталось сделать – это добавить эффект движения.
  6. Используйте кнопку «Вставить объект» в верхней части меню программы. Выберите «Движение» >> «Карта движений».
  7. Выберите карту, которую вы создали, и используйте предпросмотр, чтобы убедиться, что всё выглядит так как должно.

В конечном итоге создание эффекта тени для движущегося объекта на видео выглядит примерно так же, как и добавление тени для статичного объекта.

Оба эффекта – движение и тень – располагаются внутри слоя с текстом, и вы можете вручную настроить момент их появления и продолжительность непосредственно на этом уровне таймлайна.

Готовы применить знания на практике?

Мы поделились очередным приёмом профессионального монтажа и надеемся, что вы сможете использовать его в своих проектах. Если вас заинтересовал инструмент отслеживания движения объекта на видео, посмотрите список идей по его применению, а также скачайте последнюю версию видеоредактора VSDC с официального сайта разработчика.

как добавить тень на Android / Хабр

Когда заходит речь про тени на Android, возникает сразу несколько вопросов. Первый: зачем они нужны? Второй: почему нельзя использовать системные тени и жить счастливо? Третий: если нельзя использовать системные тени, как реализовать кастомные?

Это Сергей Петров, Android-разработчик в команде Design System inDrive, и вместе мы поговорим о тенях на Android.

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

Искренне надеюсь, что ваша стойкость и убедительность позволит вам и дальше использовать elevation для отрисовки теней. Если нет — придется искать ответ на третий вопрос.

Оговорюсь, что изначально я пробовал подобрать нужные значения параметров для системных теней. В Android, начиная с API 21, доступны атрибуты темы ambientShadowAlpha и spotShadowAlpha. С помощью них можно регулировать глобальные настройки прозрачности теней.

А позже в API 28 добавили возможность настраивать цвета теней через атрибуты темы outlineAmbientShadowColor и outlineSpotShadowColor, а также свойства View — outlineAmbientShadowColor и outlineSpotShadowColor.

Elevation

Попробуем подобрать подходящий elevation и прозрачность тени, и посмотрим, что из этого получится.

У нас в дизайне есть три разновидности теней (представлены на картинке ниже):

  • S — размер 12dp.

  • M — размер 20dp.

  • L — размер 32dp.

У каждой тени свои настройки прозрачности и смещения по оси Y. На смещение мы влиять не можем, но хотя бы попробуем подобрать значения прозрачности. Сложность в том, что до API 28 эти значения глобальны в рамках темы. Задать разным по стилю теням разные прозрачности, как в дизайне, возможности нет. К тому же, цвет тени в дизайне не черный, как в дефолтном Android. Что ж, попробуем добиться хотя бы примерного сходства.

Долго и усердно подбираем значения, примерно подходящие всем трем теням сразу.

// тема
<item name="android:ambientShadowAlpha">0.01</item>
<item name="android:spotShadowAlpha">0.08</item>
// настройки elevatiom
<dimen name="elevation_s">12dp</dimen>
<dimen name="elevation_m">24dp</dimen>
<dimen name="elevation_l">30dp</dimen>
Тень S — дизайнТень S — elevation 8dpТень M — дизайн Тень M — elevation 24dp Тень L — дизайнТень L — elevation 30dp

Кажется, получается довольно неплохо. Тень S слегка отличается, но две другие выглядят сносно. Настроить точнее при помощи общих настроек прозрачности вряд ли получится, но, начиная с API 28, можно получить совсем точное совпадение.

Получается, задача решена, и можно убеждать дизайнера, что тень S будет слегка отличаться от дизайна. В конце концов, пользователь вряд ли это заметит, да и кто вообще из пользователей Android обращает внимание на такие мелочи.

Но оказалось, что не все так просто. В Android два источника света: ambient light, который светит во все стороны, и key light — светит направленно. Кому интересно, в этой статье очень хорошо и с картинками раскрыта эта тема.

Источники света в Android

Тот, что светит сверху под углом, и есть key light. Он дает ярко выраженную тень в нижней части объекта. И вот, что происходит с тенью, особенно при больших elevation, по мере отдаления от верхней части экрана.

Тень L — элемент в верхней части экрана Тень L — элемент в нижней части экрана

Как в жизни: чем дальше от источника света, тем длиннее тень. Можно ли на это повлиять? В данной статье в разделе Don’t try this at home утверждается, что да, но у меня не получилось. Но даже если бы и получилось, и на код-ревью закрыли глаза на этот очевидный хак, это не решило проблемы полностью. Где бы не размещался источник света, тени в любом случае были бы неравномерными. Причина тому — большой elevation, необходимый для достижения нужного эффекта.

Изрядно расстроившись, переходим к плану Б — рисовать тень самостоятельно.

MaterialShapeDrawable

Раз не получилось с elevation, попробуем другой бесплатный метод. Вспоминаем, что в Material библиотека имеет поддержку теней и на античных устройствах. Давайте посмотрим на реализацию.

Заглядываем внутрь MaterialShapeDrawable и видим, что они на пару с неким ShadowRenderer занимаются интересными вещами. По заданным параметрам формы тень отрисовывается при помощи шейдеров LinearGradient и RadialGradient. То есть, тень — это градиент вокруг формы.

Идея интересная, попробуем ее в действии. Для этого сделаем простую кастомную вьюшку и посмотрим, что получится.

val shape = ShapeAppearanceModel.builder()
  .setAllCornerSizes(16.toPx())
  .build()
val drawable = MaterialShapeDrawable(shape)
drawable.fillColor = ColorStateList.valueOf(Color.WHITE)
drawable.shadowVerticalOffset = 8.toPx()
drawable.shadowRadius = 32.toPx()
drawable.shadowCompatibilityMode = MaterialShapeDrawable.SHADOW_COMPAT_MODE_ALWAYS
background = drawable
Тень MaterialShapeDrawable

Кажется, работает, но есть пару негативных моментов. Во-первых, настройки прозрачности градиента зашиты в ShadowRenderer. Чтобы сделать тень по своим параметрам, придется собирать код, разбросанный по нескольким классам, и копировать в проект.

Во-вторых, производительность решения оставляет желать лучшего. Ради интереса решено было повесить на вьюшку аниматор, который менял ее размер, и посмотреть, как будет работать отрисовка. Лаги, даже на релизной сборке, были заметны невооруженным глазом, что подтвердил и systrace.

Время отрисовки кадра — 18 миллисекунд

Время отрисовки одного кадра — 18 миллисекунд. Это только draw одной вьюшки на экране. А draw — довольно частая операция 🙂

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

Как еще нарисовать тень

В процессе поиска ответа на этот вопрос нашлись еще 3 способа, помимо указанных выше.

  1. Paint.setShadowLayer — самый простой и понятный. Минимум кода, отлично работает при наличии аппаратного ускорения (что для современных устройств — стандарт).

  2. BlurMaskFilter — второй по простоте, чуть больше кода, работает также отлично.

  3. ScriptIntrinsicBlur — пожалуй, еще сложнее, также смущает статус Deprecated и рекомендации по миграции.

Есть еще экзотический способ, у меня он не завелся, и я так до конца и не понял, как это работает. Если заведете и разберетесь, напишите в комментариях.

Раскрывать эти пункты не вижу смысла. Есть масса статей с примерами, в частности, вот эта. Для себя решил взять самый простой способ. Если что-то пойдет не так, можно попробовать следующий.

Анализ требований

Допустим, со способом определились. Теперь сформулируем, что в итоге хотим получить. В идеальном мире это должно быть также удобно, как указать elevation.

Размер тени не должен влиять на размер и позицию View на экране. Представляете, каково подбирать отступы или центрировать View, на размеры которой влияет отбрасываемая ей тень? Наличие тени не должно влиять на верстку существующих экранов.

Кроме того, должна быть возможность указать параметры тени в XML (в верстке или в стиле) и, что немаловажно, увидеть результат в превью Android Studio.

Еще нужно уметь отрисовать тень у любых View, вне зависимости от того, есть ли у них фон или elevation. И совсем хорошо, если время отрисовки не будет занимать весь фрейм.

Также определимся, что тень у нас отбрасывает только простая форма: прямоугольник (со скругленными углами или без), овал, и возможно модный squircle, если не удастся отговорить дизайнеров.

Суммарно все это звучит, как необходимость наследоваться от нужных View и расширять их функционал. При этом логику построения и отрисовки тени можно вынести в общий вспомогательный класс. Так реализация тени в компонентах превратится в тривиальную задачу.

План решения:

  • Создадим Drawable, умеющий рисовать тень определенной формы.

  • Напишем View, использующий этот Drawable.

  • Измерим производительность решения.

NinePatchDrawable

В одной замечательной статье про тени на Android от этой идеи отказались. Статья действительно замечательная, но почему-то не попалась мне на глаза в тот момент, когда я искал решение.

Итак, что такое 9-patch и зачем он нужен? Тут мне, как старому разработчику игр на Marcomedia Flash (да упокой Господь его душу вместе с душой Стива), нужно смахнуть ностальгическую слезу. Эту технику я впервые повстречал там, а «Википедия» утверждает, что именно там она впервые и была придумана.

Суть данного метода заключается в том, чтобы поделить растровое изображение на 9 частей, и при изменении размеров растягивать все области, кроме углов. Так совсем небольшое исходное изображение можно растягивать до произвольных размера без искажений и потери качества.

Таким образом, экономится и память (размер Bitmap минимален), и процессорное время (отдать Bitmap на отрисовку почти ничего не стоит). Ну а GPU только дай Bitmap порисовать.

К счастью, Android дает возможность разработчикам создавать NinePatchDrawable программно. А поскольку и форма фигуры и параметры тени известны — задача тривиальная.

Реализация

Определим параметры и форму тени:

data class ShadowSpec(
  @ColorInt val shadowColor: Int = Color.TRANSPARENT,
  @Px val shadowOffsetX: Float = 0f,
  @Px val shadowOffsetY: Float = 0f,
  @Px val shadowSize: Float = 0f,
  val cornerSize: CornerSize? = null,
  val cornerSizeTopLeft: CornerSize? = null,
  val cornerSizeTopRight: CornerSize? = null,
  val cornerSizeBottomLeft: CornerSize? = null,
  val cornerSizeBottomRight: CornerSize? = null
)

Для построения формы было решено использовать ShapeAppearanceModel, а также ShapeAppearancePathProvider, который на основе этой модели построит Path, используемый для конечной отрисовки.

В коде это выглядит так:

// строим форму - спасибо исходникам Material
val path = Path()
val provider = ShapeAppearancePathProvider()
val model = ShapeAppearanceModel.Builder()
  .setTopLeftCorner(CornerFamily.ROUNDED, topLeftCornerSize)
  .setTopRightCorner(CornerFamily.ROUNDED, topRightCornerSize)
  .setBottomLeftCorner(CornerFamily.ROUNDED, bottomLeftCornerSize)
  .setBottomRightCorner(CornerFamily.ROUNDED, bottomRightCornerSize)
  .build()
provider.calculatePath(model, 1f, RectF(0f, 0f, width, height), path)

Форма есть, теперь посчитаем, сколько займет тень — радиус тени плюс смещение. Есть еще параметр SHADOW_SPREAD_MULTIPLIER, чуть увеличивающий область для того, чтобы все непрозрачные пиксели поместились в итоговый Bitmap.

// на глаз подбираем размер тени при размытии так,
// чтобы все непрозрачные пиксели отрисовывались в итоговой области.
with(spec) {
  val spreadOffset = shadowSize * SHADOW_SPREAD_MULTIPLIER
  spreadBounds. set(
    (spreadOffset - shadowOffsetX).coerceAtLeast(0f),
    (spreadOffset - shadowOffsetY).coerceAtLeast(0f),
    (spreadOffset + shadowOffsetX).coerceAtLeast(0f),
    (spreadOffset + shadowOffsetY).coerceAtLeast(0f)
  )
}

Минимально необходимый же размер Bitmap считается как радиусы скругления углов формы плюс размер самой тени. Границы 9.patch тоже считаются тривиально.

// определяем границы углов
val left = max(topLeftCornerSize, bottomLeftCornerSize)
val top = max(topLeftCornerSize, topRightCornerSize)
val right = max(topRightCornerSize, bottomRightCornerSize)
val bottom = max(bottomLeftCornerSize, bottomRightCornerSize)
// минимальный размер исходя из формы, с некоторым запасом
val width = max(left + right, dp20) + 2 * dp1
val height = max(top + bottom, dp20) + 2 * dp1
// размер Bitmap
val bitmapWidth = width + spreadBounds.left + spreadBounds.right
val bitmapHeight = height + spreadBounds.top + spreadBounds.bottom
// области для 9.patch
val leftChunk = left + spreadBounds. left
val topChunk = top + spreadBounds.top
val rightChunk = bitmapWidth - right - spreadBounds.right
val bottomChunk = bitmapHeight - bottom - spreadBounds.bottom

Приступим к отрисовке. Мы используем Paint.setShadowLayer и после вырезаем форму, оставляя земле лишь тень на случай, если элемент с тенью решит стать полупрозрачным.

// готовим инструменты для отрисовки
val paint = Paint(Paint.ANTI_ALIAS_FLAG).apply {
  color = spec.shadowColor
  setShadowLayer(spec.shadowSize, spec.shadowOffsetX, spec.shadowOffsetY, spec.shadowColor)
}
val clearPaint = Paint(Paint.ANTI_ALIAS_FLAG).apply {
  xfermode = PorterDuffXfermode(PorterDuff.Mode.CLEAR)
}
val matrix = Matrix()
matrix.postTranslate(spreadBounds.left, spreadBounds.top)
path.transform(matrix)
// отрисовываем форму с тенью и вырезаем саму форму
canvas.drawPath(path, paint)
canvas.drawPath(path, clearPaint)

На выходе получаем такую аккуратную картинку. Зелеными линиями на ней показана сетка, в соответствии с которой будет происходить растяжение. C помощью этой Bitmap можно отрисовать форму любого размера с тенью S и углами 16dp.

Bitmap для NinePatchDrawable

Остается лишь «запечатать» ее в NinePatchDrawable. API не самый простой, но StackOverflow не бросит в трудную минуту.

// строим drawable
drawable = NinePatchDrawable(
  context.resources,
  NinePatchUtils.getNinePatch(
    bitmap = bitmap,
    left = leftChunk.roundToInt(),
    top = topChunk.roundToInt(),
    right = rightChink.roundToInt(),
    bottom = bottomChunk.roundToInt()
  )
)

Использование

Поместив всю реализацию в класс ShadowRenderer на 200 строк, можем создать ShadowView и попробовать его в действии. Тут нужно обратить внимание на три момента.

Во-первых, придется отключить outlineProvider для того, чтобы убрать нативную тень, которую дает elevation. Сам elevation мы хотим сохранить по понятным причинам. К тому же, outlineProvider не позволит нам нарисовать тень за пределами собственных границ ShadowView, если вдруг включить clipToOutline.

Во-вторых, нужно отключить clipChildren у родительского контейнера — тень мы хотим снаружи, а не внутри границ View.

Тень обрезается границами View

Третий момент обнаружился, когда я попробовал применить к ShadowView полупрозрачность (для наглядности сделаю тень красной).

Оказалось, что при alpha меньше единицы клиппинг у View включается автоматически, обрезая тень. Но тут я отделался легким испугом. Достаточно было прочитать документацию к методу View.setAlpha и опять обрести душевный покой.

Starting with Build.VERSION_CODES.M, setting a translucent alpha value will clip a View to its bounds, unless the View returns false fromhasOverlappingRendering().

Посмотрим на наш ShadowView. За минусом конфигурации получаем 3 метода.

override fun hasOverlappingRendering(): Boolean {
  // по умолчанию View не отрисовывает за своими границами,
  // если alpha < 1 (см setAlpha)
  // переопределяем это поведение, если есть видимая тень
  return !shadowSpec. isShadowVisible
}
override fun onSizeChanged(w: Int, h: Int, oldw: Int, oldh: Int) {
  super.onSizeChanged(w, h, oldw, oldh)
  shadowRenderer.setSize(w, h)
}
override fun draw(canvas: Canvas) {
  shadowRenderer.draw(canvas)
  super.draw(canvas)
}

Конечно, методов там чуть больше. Есть еще автоматическое отключение chipChildren у контейнера, отключение outlineProvider, установка параметров тени из стиля/программно — все то, что мы с вами так любим писать в кастомных вьюшках. Но в действительности процесс создания компонента с тенью выглядит просто.

Производительность

Я был практически уверен, что в этом отношении проблем не возникнет по причинам, описанным выше. Так и произошло.

Время отрисовки кадра — 1 миллисекунда

Сценарий тот же самый, что и с MaterialShapeDrawable: один ShadowView на экране и аниматор, меняющий его размеры.

Естественно, процесс создания Bitmap тоже не бесплатен, но визуально в трейсе найти его не удалось — все фреймы коротенькие и ровненькие, как на подбор. Ставить в код метку для трейса и выяснять точное количество миллисекунд было уже лень.

Но есть и ложка дегтя. Поскольку у объектов круглой формы скругления углов зависят от ширины или высоты, то изменение размера влечет за собой пересоздание Bitmap и NinePatchDrawable. Тогда картина заметно ухудшается, в районе 20мс на фрейм.

Вариантов решения два. Первый — пропускать генерацию Bitmap и рисовать тень на канвасе с помощью Paint напрямую в каждом вызове draw. Второй — указать большие значения радиуса углов, достаточные для отрисовки овала. Так получим большую исходную Bitmap, но зато отрисовка останется мгновенной.

Можно еще улучшить производительность, использовав LruCache. Разновидностей тени у нас всего 3, форм тоже немного. Поэтому хранение и использование уже сгенерированных Bitmap повторно реализовать достаточно просто. Но до этого еще не дошли руки, да и пока не было необходимости.

Заключение

Стоила ли игра свеч? Определенно да. Тени стали выглядеть гораздо лучше, чем стандартный elevation.

Можно ли использовать стандартный elevation? Тоже да, но лучше избегать больших значений. Настройки прозрачности могут дать неплохие результаты.

Нужно ли писать свое собственное решение, когда есть много библиотек? Думаю, тоже да. Так вы получите именно то, что нужно вам. Тем более, Android почти все дает из коробки, поэтому решение получится компактным.

Что с Compose? С Compose все будет хорошо, скоро, скоро.

Руководство для начинающих по свету и тени

Сезанн, Холст, масло, натюрморт с семью яблоками, 1878

Вы когда-нибудь чувствовали разочарование, так усердно работая над рисунком, но обнаруживали, что он все еще выглядит «плоским» ‘?

Это пропорции? Перспектива? Может состав?

Хотя все это играет неотъемлемую роль, самый эффективный способ сделать ваши рисунки трехмерными — это понять, как работает логика света.

Если рисование линий создает пропорции, обработка тона создает форму.

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

Самое интересное в этом то, что как только вы «получите» освещение, принципы никогда не изменятся.

В части 1 этой серии из 3 частей ( Часть 2 – Демонстрация затенения на чертеже ) мы смотрим на теорию, рисунок, а затем рисуем простую форму, фокусируясь на тени, свете и краях.

Вы можете обнаружить, что дело не в вашей технике рисования, а в вашем освещении…

Как ведет себя свет, попадая на форму?

Как и ожидалось.

Если мы используем один источник света.

Проблема в том, что большую часть времени дома у вас нет единственного источника света, есть удобное кресло, чашка чая и 10 минут, чтобы нарисовать собаку. Сверху льется множество огней, свет в окнах и, может быть, свет от телевизора или лампы для чтения.

Просто из-за особенностей освещения в наших домах очень сложно добиться драматического рисунка.

Чтобы что-то выглядело трехмерным, вам нужен свет, который сделает всю работу за вас, а не ваш карандаш.

Теперь я первый, кого тянет к блокноту, когда я наслаждаюсь пивом в гостиной, но обратите внимание на слово «набросок».

Наброски действительно помогают тренировать зрение и развивать творческий потенциал, и я делаю это каждый день.

Но когда я хочу превратить один из своих эскизов в более проработанный рисунок, я бы более осознанно подходил к настройке освещения, композиции и дизайну произведения.

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

Итак, я обнаружил, что самый простой способ узнать о свете и тени — это использовать один жесткий источник света. Это может быть солнце, свет из окна или искусственный свет.

Жесткий свет четко демонстрирует каждую отдельную область, на которую следует обращать внимание, преувеличивая широчайший тональный диапазон, и для новичков это самый простой способ увидеть разницу между тонами.

Итак, в этой серии из трех частей мы рассмотрим отдельные осветительные установки, демонстрирующие теорию формы на сфере.

Изучение простых принципов форм позволит вам увидеть основные формы, из которых состоит вся природа. Конус, куб, цилиндр и сфера.

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

Логика света с использованием одного источника света

 

Свет всегда распространяется прямолинейно.

Тени, созданные светом, всегда являются прямым ответом на то, куда падает свет, под каким бы углом он ни шел и какова интенсивность источника света.

Итак, если яркий солнечный свет падает на дерево прямо сверху, он образует короткую тень, что не обязательно поможет вам как художнику описать предмет.

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

Если одиночный свет падает на куб, он принимает форму квадрата, а если одиночный свет падает на сферу, то он приобретает форму эллипса.

Это называется «логикой света», а создаваемая тень называется отбрасываемой тенью.

Отбрасываемая тень

Характеристики отбрасываемой тени зависят от интенсивности источника света. Жесткий свет создаст тень с резким краем, мягкий свет создаст тень с более размытым краем.

Чем длиннее тень от объекта, тем мягче становится край тени. Обратите внимание, что отбрасываемая тень самая темная прямо под сферой, а затем становится все светлее и светлее по мере удаления от источника света.

Также отбрасываемая тень ведет себя предсказуемо на плоской поверхности, но когда на пути тени есть другие уровни или поверхности, форма может быть изменена в зависимости от поверхности, на которую она падает.

Это одна из первых вещей, которую нужно проверить на своих рисунках и картинах. Логично ли формы теней сочетаются с объектом и освещением?

Все дело в том, чтобы знать, откуда исходит свет, и соответствует ли он вашему изображению.

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

3 области формы:

Когда вы только начинаете, вам просто нужно подумать о трех простых областях формы:

1. Светлая сторона – Сюда входят Highlight и Halftones .

Изюминка — самая светлая часть, где свет падает прямо на объект.

Полутона всегда будут светлее любого значения на теневой стороне и сливаются с теневой стороной (иногда их можно разделить на светлые полутона и темные полутона)

2. Теневая сторона – Эта включает в себя Form Shadow, Form Shadow Core и Reflected light.

Form Shadow Core — самая темная часть тени, остальные Form Shadow состоит из темных тонов, которые переходят от основной тени к отраженному свету, если таковой имеется.

Отраженный свет — это свет, отраженный на предмет, от поверхности, на которой он сидит, или окружающий свет вокруг предмета.

3. Отбрасываемая тень — состоит из 3 частей.

самая темная часть которая находится непосредственно под объектом, средний тон который составляет большую часть формы отбрасываемой тени и самый светлый, самый мягкий хвост отбрасываемой тени

Создание линии тени

Линия тени это переход между светлой стороной и теневой стороной.

У этого может быть много названий, линия постельных клопов, линия тени, терминатор, линия тени формы и многие другие. Главное помнить, что каждая область должна быть четко определена.

Сохранение светлых тонов на светлой стороне и темных в тенях при сохранении мягкого перехода между ними — вот чего мы пытаемся достичь.

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

Что может случиться, если вы аккуратно осветлите свои карандашные пометки и попытаетесь создать красивую смесь.

Проблема в том, что тёмная сторона расплывается, она расползается, ты работаешь всё усерднее и усерднее, а потом думаешь, что твой ластик всё исправит.

Нет.

Теперь у темноты слишком резкий край, и вы начали терять прекрасную форму, которая была у вас изначально. Ваша теневая линия сместилась на север, ваша светлая логика теперь стала нелогичной, а ваша светлая сторона стала темнее со всем этим шквалом смешения!

Это сложно, но требует практики и нескольких приемов, которые мы рассмотрим более подробно на следующей неделе.

Светлая сторона

Изюминка — самая светлая часть. Это место, где свет падает прямо на объект, поэтому это лучший индикатор, когда вы смотрите на объект, чтобы определить, откуда и под каким углом исходит свет.

Блики оживляют рисунок.

Полутона сливаются с теневой стороной и делают блик белым. Они всегда светлее по значению, чем самое светлое значение на теневой стороне.

Теневая сторона

Если отбрасываемая тень всегда жесткая (хотя иногда с размытыми краями), то формальная тень мягкая.

Темная сторона объекта, не обращенная к свету, раскрывает форму и массу формы.

Самая темная точка в тени формы называется ядром тени формы.

Он находится под Линией Тени (или Терминатором) на темной стороне и там, где свет не падает на поверхность.

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

Очарование отраженного света

Отраженный свет — это когда свет отражается на объекте от поверхности, на которой он находится. Белые или блестящие поверхности отражают больше всего света, темные или черные поверхности отражают наименьшее количество света.

Сфера наверху сидит на матовом белом листе бумаги.

Когда вы только начинаете рисовать, легко стать одержимым отражающим светом, он кажется сложным и тонким.

Чаще всего случается так, что вы слишком много «заглядываете в свою тьму» и преувеличиваете, насколько светлая эта область на самом деле.

Затем вы теряете ту первоначальную простую концепцию света, которую мы впервые установили при «составлении карты» со стороны света и тени.

Вы можете распечатать это руководство и потренироваться в подборе тонов с помощью карандашей.

Когда вы поворачиваете форму от света, использование полоски значений тона выше будет бесценным.

Поскольку у вас может возникнуть искушение попробовать использовать более светлый тон, чем вам нужно, возможность проверить свои значения позволит вам сохранить постоянство иллюзии света.

Если с отраженным светом правильно обращаться, он может вызвать у ваших рисунков реакцию «Как вы это сделали?», поэтому стоит потратить на это время.

На следующей неделе мы будем применять эти теории на практике в моей студии, где я поставлю и нарисую яблоко.

При работе с трехмерными чертежами я сосредотачиваюсь на двух вещах: форме и краях. Мы также создадим несколько быстрых набросков для отображения теней и рассмотрим методы рисования при повороте формы.

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

Вам также может понравиться:

1.  Руководство для начинающих по свету и теням: Часть 2. Практическое руководство по рисованию 

【Для начинающих】Давайте воспользуемся тенями для более объемного вида. | MediBang Paint

У вас возникли проблемы с рисованием теней для ваших персонажей, потому что вы не знаете, с чего начать?
В этой статье я покажу вам, как создавать простые тени для таких людей, как вы!

1.

Что такое Тень?

Тень в переводе с японского означает «отбрасывать тень».
Программное обеспечение, такое как Illustrator и Photoshop, имеет функцию, называемую «тень», которая автоматически создает тень, подобную той, что показана на рисунке выше.

MediBang Paint не имеет функции тени, но вы можете легко создать аналогичный эффект тени за 3 шага.
А теперь давайте посмотрим, как это сделать!

2. Как создать тень

ШАГ 1: Создайте тень

Во-первых, давайте создадим часть, которая будет тенью.

・Простая фигура
・Имеет базовый слой
・Слои объединены только для части фигуры/символа

Если ваша иллюстрация удовлетворяет любому из вышеперечисленных условий,

(1) Дублируйте слой, на котором вы хотите создать тень .
(2) Выберите «Защитить альфа-канал».
(3) Залейте его цветом тени.

Нарисуйте тени в эти три шага.

【Если вы хотите разделить слои…】

Если у вас нет базового слоя, но вы не хотите объединять слои персонажей, поместите эти слои персонажей в одну папку.
Также можно комбинировать только окрашенные.

С помощью этого метода вы сможете легко комбинировать слои на последующих шагах
▶︎ Как поместить несколько слоев в папку слоев одновременно

)» из «Подборки».

Наконец, создайте новый слой для тени и заполните выделение с помощью Pen Brush.

ШАГ 2: Сдвиньте тени

Поместите слой теней, созданный в ШАГЕ 1, ниже персонажа.
Используйте инструмент «Перемещение», чтобы сместить тень по диагонали вниз, чтобы создать простейшую тень.

Главное, чтобы тень находилась в направлении, противоположном источнику света.
Если тень находится в том же направлении, что и источник света, она будет несовместима с тенью персонажа.

Этот тип тени можно использовать, когда прямо за персонажем находится стена, или как часть дизайна, делая цвет тени более ярким.

ШАГ 3:Расположите тени

Если необходимо, настройте форму тени.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *