Skip to content

Commit 0285369

Browse files
committed
try some feature
1 parent d15c582 commit 0285369

File tree

13 files changed

+313
-12
lines changed

13 files changed

+313
-12
lines changed

app/build.gradle

+3-5
Original file line numberDiff line numberDiff line change
@@ -197,7 +197,7 @@ dependencies {
197197
}
198198
implementation project(path: ':subs:dataview')
199199
implementation project(path: ':subs:skeleton')
200-
200+
implementation project(path: ':subs:compose')
201201
implementation 'com.alibaba:fastjson:2.0.19.graal'
202202

203203
}
@@ -211,10 +211,10 @@ import com.android.build.api.instrumentation.InstrumentationScope
211211
androidComponents {
212212
onVariants(selector().all(), {
213213
instrumentation.transformClassesWith(FooClassVisitorFactory.class, InstrumentationScope.PROJECT) {}
214-
instrumentation.transformClassesWith(TrackClassVisitorFactory.class,InstrumentationScope.PROJECT) { param ->
214+
instrumentation.transformClassesWith(TrackClassVisitorFactory.class, InstrumentationScope.PROJECT) { param ->
215215
param.trackOn = true
216216
}
217-
instrumentation.transformClassesWith(TigerClassVisitorFactory.class,InstrumentationScope.PROJECT) { param ->
217+
instrumentation.transformClassesWith(TigerClassVisitorFactory.class, InstrumentationScope.PROJECT) { param ->
218218
param.tigerOn = true
219219
}
220220
instrumentation.setAsmFramesComputationMode(FramesComputationMode.COPY_FRAMES)
@@ -226,8 +226,6 @@ androidComponents {
226226
//}
227227

228228

229-
230-
231229
// 自定义插件的一些测试,如果无法运行,可以暂时注释掉
232230
//apply from: file("../gradle/custom_plugin.gradle")
233231
apply from: file("../gradle/funs.gradle")

app/src/main/java/home/smart/fly/animations/ui/activity/MatisseDemoActivity.java

+4-1
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,9 @@
1414
import androidx.recyclerview.widget.RecyclerView;
1515

1616
import com.bumptech.glide.Glide;
17+
import com.engineer.compose.ui.gpufilter.GPUFilterActivity;
1718
import com.permissionx.guolindev.PermissionX;
19+
import com.pixpark.gpupixel.filter.GPUPixelFilter;
1820
import com.yalantis.ucrop.UCrop;
1921
import com.zhihu.matisse.Matisse;
2022
import com.zhihu.matisse.MimeType;
@@ -65,7 +67,8 @@ protected void onCreate(Bundle savedInstanceState) {
6567

6668
@Override
6769
public void onRVItemClick(ViewGroup parent, View itemView, int position) {
68-
Intent mIntent = new Intent(this, MatissePhotoActivity.class);
70+
// Intent mIntent = new Intent(this, MatissePhotoActivity.class);
71+
Intent mIntent = new Intent(MatisseDemoActivity.this, GPUFilterActivity.class);
6972
mIntent.putExtra("url", mStrings.get(position));
7073
startActivity(mIntent);
7174
overridePendingTransition(R.anim.zoomin, R.anim.zoomout);

gradle/libs.versions.toml

+4
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ coilCompose = "2.7.0"
1212
composeRuntimeLiveData= "1.7.6"
1313
accompanistPager = "0.36.0"
1414
lifecycleViewmodelCompose = "2.8.7"
15+
kotlinVersion = "2.0.21"
1516

1617

1718
[libraries]
@@ -34,3 +35,6 @@ accompanist-pager = {group = "com.google.accompanist",name="accompanist-pager",v
3435
accompanist-pager-indicator = {group = "com.google.accompanist",name="accompanist-pager-indicators",version.ref = "accompanistPager"}
3536
androidx-compose-runtime = {group = "androidx.compose.runtime",name="runtime-livedata",version.ref = "composeRuntimeLiveData"}
3637
androidx-lifecycle-viewmodel-compose = {group = "androidx.lifecycle",name="lifecycle-viewmodel-compose",version.ref = "lifecycleViewmodelCompose"}
38+
[plugins]
39+
kotlin-android = { id = "org.jetbrains.kotlin.android", version.ref = "kotlinVersion" }
40+
kotlin-compose = { id = "org.jetbrains.kotlin.plugin.compose", version.ref = "kotlinVersion" }

subs/compose/build.gradle

+11-4
Original file line numberDiff line numberDiff line change
@@ -22,19 +22,19 @@ android {
2222
}
2323
}
2424
compileOptions {
25-
sourceCompatibility JavaVersion.VERSION_1_8
26-
targetCompatibility JavaVersion.VERSION_1_8
25+
sourceCompatibility JavaVersion.VERSION_11
26+
targetCompatibility JavaVersion.VERSION_11
2727
}
2828
kotlinOptions {
29-
jvmTarget = '1.8'
29+
jvmTarget = '11'
3030
}
3131
buildFeatures {
3232
compose true
3333
}
3434
}
3535

3636
dependencies {
37-
37+
implementation fileTree(include: ['*.aar'], dir: 'libs')
3838
implementation libs.androidx.core.ktx
3939
implementation libs.androidx.lifecycle.runtime.ktx
4040
api libs.androidx.activity.compose
@@ -51,6 +51,12 @@ dependencies {
5151

5252
api libs.accompanist.pager
5353
api libs.accompanist.pager.indicator
54+
implementation libs.androidx.activity.compose
55+
implementation platform(libs.androidx.compose.bom)
56+
implementation libs.androidx.ui
57+
implementation libs.androidx.ui.graphics
58+
implementation libs.androidx.ui.tooling.preview
59+
implementation libs.androidx.material3
5460

5561

5662
testImplementation libs.junit
@@ -60,4 +66,5 @@ dependencies {
6066
androidTestImplementation libs.androidx.ui.test.junit4
6167
debugApi libs.androidx.ui.tooling
6268
debugImplementation libs.androidx.ui.test.manifest
69+
debugImplementation libs.androidx.ui.tooling
6370
}
3.54 MB
Binary file not shown.

subs/compose/src/main/AndroidManifest.xml

+5
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,11 @@
44
<uses-permission android:name="android.permission.RECORD_AUDIO" />
55

66
<application>
7+
<activity
8+
android:name=".ui.gpufilter.GPUFilterActivity"
9+
android:exported="true"
10+
android:label="@string/title_activity_gpufilter"
11+
android:theme="@style/Theme.AndroidAnimationExercise" />
712
<activity
813
android:name=".ui.GalleryActivity"
914
android:exported="false"

subs/compose/src/main/java/com/engineer/compose/ui/GalleryActivity.kt

+1-2
Original file line numberDiff line numberDiff line change
@@ -95,8 +95,7 @@ fun ViewPagerExample(imageUrls: List<String>, initialPage: Int = 0, modifier: Mo
9595
.fillMaxSize()
9696
) { page ->
9797
Box(
98-
modifier = Modifier.fillMaxSize(),
99-
contentAlignment = Alignment.Center
98+
modifier = Modifier.fillMaxSize(), contentAlignment = Alignment.Center
10099
) {
101100
// val painter = rememberAsyncImagePainter(model = imageUrls[page])
102101
val painter = rememberAsyncImagePainter(
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,179 @@
1+
package com.engineer.compose.ui.gpufilter
2+
3+
import android.graphics.BitmapFactory
4+
import android.os.Bundle
5+
import android.util.Log
6+
import androidx.activity.ComponentActivity
7+
import androidx.activity.compose.setContent
8+
import androidx.activity.enableEdgeToEdge
9+
import androidx.compose.foundation.Image
10+
import androidx.compose.foundation.background
11+
import androidx.compose.foundation.clickable
12+
import androidx.compose.foundation.layout.Arrangement
13+
import androidx.compose.foundation.layout.Box
14+
import androidx.compose.foundation.layout.Column
15+
import androidx.compose.foundation.layout.Spacer
16+
import androidx.compose.foundation.layout.aspectRatio
17+
import androidx.compose.foundation.layout.fillMaxSize
18+
import androidx.compose.foundation.layout.fillMaxWidth
19+
import androidx.compose.foundation.layout.height
20+
import androidx.compose.foundation.layout.padding
21+
import androidx.compose.foundation.layout.size
22+
import androidx.compose.foundation.lazy.LazyRow
23+
import androidx.compose.foundation.lazy.items
24+
import androidx.compose.foundation.shape.CircleShape
25+
import androidx.compose.foundation.shape.RoundedCornerShape
26+
import androidx.compose.material3.Scaffold
27+
import androidx.compose.material3.Text
28+
import androidx.compose.runtime.Composable
29+
import androidx.compose.runtime.getValue
30+
import androidx.compose.runtime.mutableStateOf
31+
import androidx.compose.runtime.remember
32+
import androidx.compose.runtime.setValue
33+
import androidx.compose.ui.Alignment
34+
import androidx.compose.ui.Modifier
35+
import androidx.compose.ui.draw.clip
36+
import androidx.compose.ui.graphics.Color
37+
import androidx.compose.ui.graphics.asImageBitmap
38+
import androidx.compose.ui.graphics.painter.BitmapPainter
39+
import androidx.compose.ui.layout.ContentScale
40+
import androidx.compose.ui.text.font.FontWeight
41+
import androidx.compose.ui.tooling.preview.Preview
42+
import androidx.compose.ui.unit.dp
43+
import androidx.compose.ui.unit.sp
44+
import com.engineer.compose.ui.gpufilter.ui.theme.AndroidAnimationExerciseTheme
45+
import com.pixpark.gpupixel.GPUPixel
46+
import com.pixpark.gpupixel.GPUPixelSourceImage
47+
import com.pixpark.gpupixel.filter.GPUPixelFilter
48+
49+
class GPUFilterActivity : ComponentActivity() {
50+
private lateinit var gpuPixelSourceImage: GPUPixelSourceImage
51+
52+
override fun onCreate(savedInstanceState: Bundle?) {
53+
super.onCreate(savedInstanceState)
54+
enableEdgeToEdge()
55+
val url = intent.getStringExtra("url") ?: ""
56+
57+
gpuPixelSourceImage = GPUPixelSourceImage(BitmapFactory.decodeFile(url))
58+
59+
setContent {
60+
AndroidAnimationExerciseTheme {
61+
Scaffold(modifier = Modifier.fillMaxSize()) { innerPadding ->
62+
Log.i("", innerPadding.toString())
63+
PhotoFilterScreen(url) {
64+
Log.i("zyq", "filter is $it")
65+
val result = it.replace(" ", "")
66+
// val gpuFilter = GPUPixelFilter(result)
67+
// gpuPixelSourceImage.removeAllTargets()
68+
69+
// gpuPixelSourceImage.addTarget(gpuFilter)
70+
}
71+
}
72+
}
73+
}
74+
GPUPixel.setContext(this)
75+
}
76+
}
77+
78+
@Composable
79+
fun PhotoFilterScreen(url: String, cb: (String) -> Unit) {
80+
var selectedFilter by remember { mutableStateOf(Filter("Color Invert Filter", "Inverts image colors")) }
81+
val imageModifier = Modifier
82+
.fillMaxWidth()
83+
.aspectRatio(16f / 9f)
84+
.clip(RoundedCornerShape(8.dp))
85+
86+
Column(modifier = Modifier.fillMaxSize()) {
87+
// TopAppBar(
88+
// title = { Text("photo filter") },
89+
// navigationIcon = {
90+
// IconButton(onClick = { /* 返回逻辑 */ }) {
91+
// Icon(Icons.Default.ArrowBack, contentDescription = "Back")
92+
// }
93+
// },
94+
// backgroundColor = MaterialTheme.colors.primary,
95+
// contentColor = Color.White
96+
// )
97+
98+
Spacer(modifier = Modifier.height(8.dp))
99+
100+
Box(
101+
modifier = Modifier
102+
.fillMaxWidth()
103+
.weight(1f)
104+
.background(Color.Gray, RoundedCornerShape(8.dp)),
105+
contentAlignment = Alignment.Center
106+
) {
107+
val bitmap = BitmapFactory.decodeFile(url)
108+
val bitmapPainter = BitmapPainter((bitmap.asImageBitmap()))
109+
Image(
110+
painter = bitmapPainter,
111+
contentDescription = "Filtered Image",
112+
modifier = imageModifier,
113+
contentScale = ContentScale.Crop
114+
)
115+
}
116+
117+
Spacer(modifier = Modifier.height(8.dp))
118+
119+
LazyRow(
120+
modifier = Modifier
121+
.fillMaxWidth()
122+
.padding(8.dp), horizontalArrangement = Arrangement.spacedBy(8.dp)
123+
) {
124+
// val filters = listOf("Blur", "Brightness", "CircleCrop", "ColorFilter", "Contrast")
125+
items(filters) { filter ->
126+
FilterItem(filter.name, isSelected = selectedFilter == filter) {
127+
selectedFilter = filter
128+
cb(selectedFilter.name)
129+
}
130+
}
131+
}
132+
}
133+
}
134+
135+
data class Filter(val name: String, val desc: String)
136+
137+
val filters = listOf(
138+
Filter("Color Invert Filter", "Inverts image colors"),
139+
Filter("Color Matrix Filter", "Applies color matrix transformation"),
140+
Filter("Crosshatch Filter", "Creates crosshatch drawing effect"),
141+
Filter("Emboss Filter", "Creates embossed effect"),
142+
Filter("Glass Sphere Filter", "Spherical glass distortion effect"),
143+
Filter("Halftone Filter", "Creates halftone pattern effect"),
144+
Filter("Pixellation Filter", "Creates pixelated effect"),
145+
Filter("Posterize Filter", "Reduces image to limited colors"),
146+
Filter("Sketch Filter", "Creates sketch-like effect"),
147+
Filter("Smooth Toon Filter", "Cartoon effect with smoothing"),
148+
Filter("Sphere Refraction Filter", "Spherical refraction effect"),
149+
Filter("Toon Filter", "Cartoon/comic effect")
150+
)
151+
152+
@Composable
153+
fun FilterItem(filterName: String, isSelected: Boolean, onClick: () -> Unit) {
154+
Column(
155+
horizontalAlignment = Alignment.CenterHorizontally,
156+
modifier = Modifier
157+
.clickable(onClick = onClick)
158+
.padding(8.dp)
159+
) {
160+
Box(
161+
modifier = Modifier
162+
.size(60.dp)
163+
.clip(CircleShape)
164+
.background(if (isSelected) Color.Blue else Color.LightGray), contentAlignment = Alignment.Center
165+
) {
166+
Text(filterName.first().toString(), color = Color.White, fontWeight = FontWeight.Bold)
167+
}
168+
Text(filterName, fontSize = 12.sp)
169+
}
170+
}
171+
172+
173+
@Preview(showBackground = true)
174+
@Composable
175+
fun GreetingPreview() {
176+
AndroidAnimationExerciseTheme {
177+
PhotoFilterScreen("") {}
178+
}
179+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
package com.engineer.compose.ui.gpufilter.ui.theme
2+
3+
import androidx.compose.ui.graphics.Color
4+
5+
val Purple80 = Color(0xFFD0BCFF)
6+
val PurpleGrey80 = Color(0xFFCCC2DC)
7+
val Pink80 = Color(0xFFEFB8C8)
8+
9+
val Purple40 = Color(0xFF6650a4)
10+
val PurpleGrey40 = Color(0xFF625b71)
11+
val Pink40 = Color(0xFF7D5260)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
package com.engineer.compose.ui.gpufilter.ui.theme
2+
3+
import android.app.Activity
4+
import android.os.Build
5+
import androidx.compose.foundation.isSystemInDarkTheme
6+
import androidx.compose.material3.MaterialTheme
7+
import androidx.compose.material3.darkColorScheme
8+
import androidx.compose.material3.dynamicDarkColorScheme
9+
import androidx.compose.material3.dynamicLightColorScheme
10+
import androidx.compose.material3.lightColorScheme
11+
import androidx.compose.runtime.Composable
12+
import androidx.compose.ui.platform.LocalContext
13+
14+
private val DarkColorScheme = darkColorScheme(
15+
primary = Purple80,
16+
secondary = PurpleGrey80,
17+
tertiary = Pink80
18+
)
19+
20+
private val LightColorScheme = lightColorScheme(
21+
primary = Purple40,
22+
secondary = PurpleGrey40,
23+
tertiary = Pink40
24+
25+
/* Other default colors to override
26+
background = Color(0xFFFFFBFE),
27+
surface = Color(0xFFFFFBFE),
28+
onPrimary = Color.White,
29+
onSecondary = Color.White,
30+
onTertiary = Color.White,
31+
onBackground = Color(0xFF1C1B1F),
32+
onSurface = Color(0xFF1C1B1F),
33+
*/
34+
)
35+
36+
@Composable
37+
fun AndroidAnimationExerciseTheme(
38+
darkTheme: Boolean = isSystemInDarkTheme(),
39+
// Dynamic color is available on Android 12+
40+
dynamicColor: Boolean = true,
41+
content: @Composable () -> Unit
42+
) {
43+
val colorScheme = when {
44+
dynamicColor && Build.VERSION.SDK_INT >= Build.VERSION_CODES.S -> {
45+
val context = LocalContext.current
46+
if (darkTheme) dynamicDarkColorScheme(context) else dynamicLightColorScheme(context)
47+
}
48+
49+
darkTheme -> DarkColorScheme
50+
else -> LightColorScheme
51+
}
52+
53+
MaterialTheme(
54+
colorScheme = colorScheme,
55+
typography = Typography,
56+
content = content
57+
)
58+
}

0 commit comments

Comments
 (0)