Skip to content

Commit d8080e4

Browse files
add inner shadow sample
1 parent 9477f96 commit d8080e4

File tree

1 file changed

+143
-0
lines changed

1 file changed

+143
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,143 @@
1+
package com.smarttoolfactory.tutorial1_1basics.chapter6_graphics
2+
3+
import android.graphics.BlurMaskFilter
4+
import android.graphics.PorterDuff
5+
import android.graphics.PorterDuffXfermode
6+
import androidx.compose.foundation.background
7+
import androidx.compose.foundation.layout.Column
8+
import androidx.compose.foundation.layout.Row
9+
import androidx.compose.foundation.layout.fillMaxSize
10+
import androidx.compose.foundation.layout.padding
11+
import androidx.compose.foundation.shape.RoundedCornerShape
12+
import androidx.compose.material.Slider
13+
import androidx.compose.material.Text
14+
import androidx.compose.runtime.Composable
15+
import androidx.compose.runtime.getValue
16+
import androidx.compose.runtime.mutableFloatStateOf
17+
import androidx.compose.runtime.remember
18+
import androidx.compose.runtime.setValue
19+
import androidx.compose.ui.Modifier
20+
import androidx.compose.ui.composed
21+
import androidx.compose.ui.draw.drawWithContent
22+
import androidx.compose.ui.geometry.toRect
23+
import androidx.compose.ui.graphics.Color
24+
import androidx.compose.ui.graphics.Paint
25+
import androidx.compose.ui.graphics.Shape
26+
import androidx.compose.ui.graphics.drawOutline
27+
import androidx.compose.ui.tooling.preview.Preview
28+
import androidx.compose.ui.unit.Dp
29+
import androidx.compose.ui.unit.dp
30+
import androidx.compose.ui.unit.sp
31+
32+
33+
@Preview
34+
@Composable
35+
fun InnerShadowSample() {
36+
37+
Column(
38+
modifier = Modifier.fillMaxSize()
39+
.background(Color(0xff00796B))
40+
.padding(16.dp)
41+
) {
42+
43+
var blurRadiusWhite by remember {
44+
mutableFloatStateOf(5f)
45+
}
46+
47+
var blurRadiusBlack by remember {
48+
mutableFloatStateOf(4f)
49+
}
50+
51+
Text("Blur white: $blurRadiusWhite")
52+
53+
54+
Slider(
55+
value = blurRadiusWhite,
56+
onValueChange = {
57+
blurRadiusWhite = it
58+
},
59+
valueRange = 1f..20f
60+
)
61+
62+
Text("Blur black: $blurRadiusBlack")
63+
Slider(
64+
value = blurRadiusBlack,
65+
onValueChange = {
66+
blurRadiusBlack = it
67+
},
68+
valueRange = 1f..20f
69+
)
70+
71+
72+
Row(
73+
modifier = Modifier
74+
.innerShadow(
75+
shape = RoundedCornerShape(16.dp),
76+
color = Color.White.copy(.8f),
77+
x = (-2).dp,
78+
y = (-2).dp,
79+
blurRadius = blurRadiusWhite.dp
80+
)
81+
.innerShadow(
82+
shape = RoundedCornerShape(16.dp),
83+
color = Color.Black,
84+
x = 2.dp,
85+
y = 2.dp,
86+
blurRadius = (blurRadiusBlack).dp
87+
)
88+
.background(Color(0xff009688), RoundedCornerShape(16.dp))
89+
.padding(16.dp)
90+
) {
91+
Text(
92+
text = "Hello World",
93+
fontSize = 30.sp,
94+
95+
)
96+
}
97+
}
98+
}
99+
100+
fun Modifier.innerShadow(
101+
shape: Shape,
102+
color: Color = Color.Black,
103+
x: Dp = 2.dp,
104+
y: Dp = 2.dp,
105+
blurRadius: Dp = 4.dp,
106+
) = composed {
107+
val paint = remember {
108+
Paint()
109+
}
110+
111+
println("Paint: $paint")
112+
113+
drawWithContent {
114+
drawContent()
115+
116+
val outline = shape.createOutline(size, layoutDirection, this)
117+
118+
paint.color = color
119+
120+
with(drawContext.canvas) {
121+
saveLayer(size.toRect(), paint)
122+
123+
drawOutline(outline, paint)
124+
125+
val frameworkPaint = paint.asFrameworkPaint()
126+
127+
frameworkPaint.apply {
128+
xfermode = PorterDuffXfermode(PorterDuff.Mode.DST_OUT)
129+
maskFilter =
130+
BlurMaskFilter(blurRadius.toPx(), BlurMaskFilter.Blur.NORMAL)
131+
}
132+
133+
paint.color = Color.Black
134+
135+
translate(x.toPx(), y.toPx())
136+
drawOutline(outline, paint)
137+
138+
frameworkPaint.xfermode = null
139+
frameworkPaint.maskFilter = null
140+
restore()
141+
}
142+
}
143+
}

0 commit comments

Comments
 (0)