11package io.github.vrcmteam.vrcm.presentation.screens.gallery
22
3+ import androidx.compose.animation.AnimatedVisibility
4+ import androidx.compose.animation.ExperimentalSharedTransitionApi
35import androidx.compose.foundation.clickable
46import androidx.compose.foundation.layout.*
57import androidx.compose.foundation.lazy.grid.GridCells
@@ -26,9 +28,7 @@ import com.skydoves.landscapist.coil3.CoilImage
2628import io.github.vrcmteam.vrcm.network.api.files.FileApi
2729import io.github.vrcmteam.vrcm.network.api.files.data.FileData
2830import io.github.vrcmteam.vrcm.network.api.files.data.FileTagType
29- import io.github.vrcmteam.vrcm.presentation.compoments.EmptyContent
30- import io.github.vrcmteam.vrcm.presentation.compoments.LocationDialogContent
31- import io.github.vrcmteam.vrcm.presentation.compoments.RefreshBox
31+ import io.github.vrcmteam.vrcm.presentation.compoments.*
3232import io.github.vrcmteam.vrcm.presentation.settings.locale.strings
3333import io.github.vrcmteam.vrcm.presentation.supports.Pager
3434import org.koin.compose.koinInject
@@ -154,14 +154,15 @@ sealed class GalleryTabPager(private val tagType: FileTagType) : Pager {
154154 }
155155 }
156156
157+ @OptIn(ExperimentalSharedTransitionApi ::class )
157158 @Composable
158159 private fun GalleryItem (
159160 file : FileData ,
160161 tagType : FileTagType ,
161162 aspectRatio : Float = 1f,
162163 shape : Shape = MaterialTheme .shapes.medium
163164 ) {
164- val (_ , setDialogContent) = LocationDialogContent .current
165+ val (dialogContent , setDialogContent) = LocationDialogContent .current
165166
166167
167168
@@ -177,42 +178,50 @@ sealed class GalleryTabPager(private val tagType: FileTagType) : Pager {
177178 } else {
178179 " "
179180 }
180- CoilImage (
181- imageModel = { imageUrl },
182- imageOptions = ImageOptions (
183- contentScale = ContentScale .Crop ,
184- alignment = Alignment .Center
185- ),
186- imageLoader = { koinInject() },
187- modifier = Modifier
188- .fillMaxSize()
189- .clip(shape)
190- .clickable {
191- // 点击图片时,打开全屏预览
192- setDialogContent(ImagePreviewDialog (file.id, file.name, file.extension))
193- },
194- loading = {
195- Box (modifier = Modifier .fillMaxSize(), contentAlignment = Alignment .Center ) {
196- CircularProgressIndicator (
197- modifier = Modifier .size(24 .dp),
198- strokeWidth = 2 .dp
199- )
200- }
201- },
202- failure = {
203- Column (
204- modifier = Modifier .fillMaxSize(),
205- horizontalAlignment = Alignment .CenterHorizontally ,
206- verticalArrangement = Arrangement .Center
207- ) {
208- Text (
209- text = strings.galleryTabLoadFailed,
210- style = MaterialTheme .typography.bodySmall,
211- color = MaterialTheme .colorScheme.error
181+ AnimatedVisibility (dialogContent == null || (dialogContent as ImagePreviewDialog ).fileId != file.id) {
182+ CoilImage (
183+ imageModel = { imageUrl },
184+ imageOptions = ImageOptions (
185+ contentScale = ContentScale .Crop ,
186+ alignment = Alignment .Center
187+ ),
188+ imageLoader = { koinInject() },
189+ modifier = Modifier
190+ .fillMaxSize()
191+ .clip(shape)
192+ .sharedBoundsBy(
193+ file.id,
194+ sharedTransitionScope = LocalSharedTransitionDialogScope .current,
195+ animatedVisibilityScope = this @AnimatedVisibility
212196 )
197+ .clickable {
198+ // 点击图片时,打开全屏预览
199+ setDialogContent(ImagePreviewDialog (file.id, file.name, file.extension))
200+ },
201+ loading = {
202+ Box (modifier = Modifier .fillMaxSize(), contentAlignment = Alignment .Center ) {
203+ CircularProgressIndicator (
204+ modifier = Modifier .size(24 .dp),
205+ strokeWidth = 2 .dp
206+ )
207+ }
208+ },
209+ failure = {
210+ Column (
211+ modifier = Modifier .fillMaxSize(),
212+ horizontalAlignment = Alignment .CenterHorizontally ,
213+ verticalArrangement = Arrangement .Center
214+ ) {
215+ Text (
216+ text = strings.galleryTabLoadFailed,
217+ style = MaterialTheme .typography.bodySmall,
218+ color = MaterialTheme .colorScheme.error
219+ )
220+ }
213221 }
214- }
215- )
222+ )
223+ }
224+
216225 }
217226
218227 }
0 commit comments