Primary/Compose

Modifier로 블러 효과 구현하기

해스끼 2024. 5. 1. 21:32

Compose에서 블러 효과를 그리는 방법은 여러 가지 있지만, 이 글에서는 ``Modifier.drawBehind``를 사용하는 방법을 소개한다.

 

``Modifier.drawBehind { ... }``를 사용하면 Composable의 뒤에 무언가를 그릴 수 있다. 람다 내부에서는 ``DrawScope``를 통해 Compose Canvas에 접근할 수 있다.

디자인 확인

쿠링에서는 CTA 버튼 위에 블러를 보여주는 경우가 있다. 주로 리스트의 내용을 자연스럽게 보여줄 때 적용한다.

구현

Composable 위에 하얀색과 투명으로 이루어진 사각형을 그리면 된다. 사각형의 높이는 임의로 줄 수 있으나, 여기서는 Composable 높이의 30%로 지정했다. 사각형의 너비는 물론 Composable의 너비와 같다.

val gradientHeight = size.height * 0.3f

이제 Gradient 브러쉬를 만들자. 수직 방향 그라디언트를 그려야 하므로 ``Brush.verticalGradient``를 사용하며, 윗 부분이 투명하고, 아래 부분이 하얀색이어야 하므로 ``Color.Transparent``가 먼저 와야 한다.

 

캔버스에서는 위쪽이 Y축의 음의 방향이므로 ``startY``는 음수여야 한다.

val surfaceColor = KuringTheme.colors.background

val gradientBrush = Brush.verticalGradient(
    colors = listOf(Color.Transparent, surfaceColor),
    startY = -gradientHeight,
    endY = 0f,
)

참고로 ``drawBehind`` 람다 안에서는 Compose에 접근할 수 없으므로, 색깔을 변수로 받아야 한다.

 

이제 ``gradientBrush``를 배경으로 갖는 사각형을 그리면 된다. 다음과 같이 ``DrawScope.drawRect`` API를 사용하면 된다.

val surfaceColor = KuringTheme.colors.background
val blurModifier = Modifier.drawBehind {
    val gradientHeight = size.height * 0.3f
    val gradientBrush = Brush.verticalGradient(
        colors = listOf(Color.Transparent, surfaceColor),
        startY = -gradientHeight,
        endY = 0f,
        
        drawRect(
            brush = gradientBrush,
            topLeft = Offset(x = 0f, y = -gradientHeight),
            size = Size(width = size.width, height = gradientHeight),
        )
    }
}

완성!

위 코드를 활용하면, 블러를 그리는 커스텀 Modifier를 작성할 수 있다. 직접 도전해 보자.