Skip to content

Commit b0cd392

Browse files
add RenderScript sample
1 parent 7873b2b commit b0cd392

File tree

1 file changed

+132
-0
lines changed

1 file changed

+132
-0
lines changed
Lines changed: 132 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,132 @@
1+
@file:Suppress("DEPRECATION")
2+
3+
package com.smarttoolfactory.tutorial1_1basics.chapter6_graphics
4+
5+
import android.content.Context
6+
import android.graphics.Bitmap
7+
import android.renderscript.Allocation
8+
import android.renderscript.Element
9+
import android.renderscript.RenderScript
10+
import android.renderscript.ScriptIntrinsicBlur
11+
import androidx.compose.foundation.Image
12+
import androidx.compose.foundation.layout.Column
13+
import androidx.compose.foundation.layout.aspectRatio
14+
import androidx.compose.foundation.layout.fillMaxSize
15+
import androidx.compose.foundation.layout.fillMaxWidth
16+
import androidx.compose.foundation.layout.padding
17+
import androidx.compose.foundation.rememberScrollState
18+
import androidx.compose.foundation.verticalScroll
19+
import androidx.compose.material3.Slider
20+
import androidx.compose.material3.Text
21+
import androidx.compose.runtime.Composable
22+
import androidx.compose.runtime.getValue
23+
import androidx.compose.runtime.mutableFloatStateOf
24+
import androidx.compose.runtime.mutableStateOf
25+
import androidx.compose.runtime.remember
26+
import androidx.compose.runtime.setValue
27+
import androidx.compose.ui.Modifier
28+
import androidx.compose.ui.graphics.ImageBitmap
29+
import androidx.compose.ui.graphics.asAndroidBitmap
30+
import androidx.compose.ui.graphics.asImageBitmap
31+
import androidx.compose.ui.layout.ContentScale
32+
import androidx.compose.ui.platform.LocalContext
33+
import androidx.compose.ui.res.imageResource
34+
import androidx.compose.ui.tooling.preview.Preview
35+
import androidx.compose.ui.unit.dp
36+
import com.smarttoolfactory.tutorial1_1basics.R
37+
import com.smarttoolfactory.tutorial1_1basics.ui.components.StyleableTutorialText
38+
import com.smarttoolfactory.tutorial1_1basics.ui.components.TutorialHeader
39+
import com.smarttoolfactory.tutorial1_1basics.ui.components.TutorialText2
40+
import kotlin.math.roundToInt
41+
42+
43+
@Preview
44+
@Composable
45+
fun Tutorial6_40Screen1() {
46+
TutorialContent()
47+
}
48+
49+
50+
@Composable
51+
private fun TutorialContent() {
52+
Column(modifier = Modifier.padding(8.dp)) {
53+
TutorialHeader(text = "RenderScript")
54+
StyleableTutorialText(
55+
text = "Blue Bitmap using **RenderScript**",
56+
bullets = false
57+
)
58+
RenderScriptBlursample()
59+
}
60+
}
61+
62+
@Preview
63+
@Composable
64+
private fun RenderScriptBlursample() {
65+
66+
Column(
67+
modifier = Modifier.fillMaxSize().verticalScroll(rememberScrollState())
68+
) {
69+
70+
val imageBitmap = ImageBitmap.imageResource(R.drawable.landscape10)
71+
72+
var blurRadius by remember {
73+
mutableFloatStateOf(10f)
74+
}
75+
76+
val context = LocalContext.current
77+
78+
val blurredBitmap by remember(imageBitmap, blurRadius) {
79+
mutableStateOf(blurBitmap(context, imageBitmap.asAndroidBitmap(), blurRadius))
80+
}
81+
82+
TutorialText2(text = "Default")
83+
84+
Image(
85+
modifier = Modifier.fillMaxWidth().aspectRatio(3 / 2f),
86+
bitmap = imageBitmap,
87+
contentDescription = null,
88+
contentScale = ContentScale.FillBounds
89+
)
90+
91+
92+
TutorialText2(text = "Blurred")
93+
Image(
94+
modifier = Modifier.fillMaxWidth().aspectRatio(3 / 2f),
95+
bitmap = blurredBitmap.asImageBitmap(),
96+
contentDescription = null,
97+
contentScale = ContentScale.FillBounds
98+
)
99+
100+
101+
Text("Blur radius: ${blurRadius.roundToInt()}")
102+
103+
Slider(
104+
modifier = Modifier.padding(horizontal = 16.dp),
105+
value = blurRadius,
106+
onValueChange = {
107+
blurRadius = it
108+
},
109+
valueRange = 0.01f..25f
110+
)
111+
}
112+
}
113+
114+
fun blurBitmap(context: Context, bitmap: Bitmap, blurRadius: Float): Bitmap {
115+
116+
val bitmapToBlur = bitmap.copy(Bitmap.Config.ARGB_8888, true)
117+
118+
val renderScript = RenderScript.create(context)
119+
val input = Allocation.createFromBitmap(renderScript, bitmapToBlur)
120+
val output = Allocation.createTyped(renderScript, input.type)
121+
122+
ScriptIntrinsicBlur.create(renderScript, Element.U8_4(renderScript)).apply {
123+
setRadius(blurRadius)
124+
setInput(input)
125+
forEach(output)
126+
}
127+
128+
output.copyTo(bitmapToBlur)
129+
renderScript.destroy()
130+
131+
return bitmapToBlur
132+
}

0 commit comments

Comments
 (0)