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