mirror of
				https://github.com/immich-app/immich.git
				synced 2025-11-01 19:17:12 -04:00 
			
		
		
		
	fix(mobile): Fixes hero animation on main timeline (#1924)
* fixed hero animation for local assets * fixes backwards hero animation out of gallery image
This commit is contained in:
		
							parent
							
								
									a5f49b065c
								
							
						
					
					
						commit
						dac4020f27
					
				| @ -123,7 +123,10 @@ class GalleryViewerPage extends HookConsumerWidget { | ||||
| 
 | ||||
|     /// Original (large) image of a local asset. Required asset.isLocal | ||||
|     ImageProvider localImageProvider(Asset asset) { | ||||
|       return AssetEntityImageProvider(asset.local!); | ||||
|       return AssetEntityImageProvider( | ||||
|         isOriginal: true, | ||||
|         asset.local!, | ||||
|       ); | ||||
|     } | ||||
| 
 | ||||
|     void precacheNextImage(int index) { | ||||
| @ -385,8 +388,11 @@ class GalleryViewerPage extends HookConsumerWidget { | ||||
|                   onTapDown: (_, __, ___) => | ||||
|                       showAppBar.value = !showAppBar.value, | ||||
|                   imageProvider: provider, | ||||
|                   heroAttributes: | ||||
|                       PhotoViewHeroAttributes(tag: assetList[index].id), | ||||
|                   heroAttributes: PhotoViewHeroAttributes( | ||||
|                     tag: assetList[index].id, | ||||
|                   ), | ||||
|                   filterQuality: FilterQuality.high, | ||||
|                   tightMode: true, | ||||
|                   minScale: PhotoViewComputedScale.contained, | ||||
|                 ); | ||||
|               } else { | ||||
| @ -394,8 +400,10 @@ class GalleryViewerPage extends HookConsumerWidget { | ||||
|                   onDragStart: (_, details, __) => | ||||
|                       localPosition = details.localPosition, | ||||
|                   onDragUpdate: (_, details, __) => handleSwipeUpDown(details), | ||||
|                   heroAttributes: | ||||
|                       PhotoViewHeroAttributes(tag: assetList[index].id), | ||||
|                   heroAttributes: PhotoViewHeroAttributes( | ||||
|                     tag: assetList[index].id, | ||||
|                   ), | ||||
|                   filterQuality: FilterQuality.high, | ||||
|                   maxScale: 1.0, | ||||
|                   minScale: 1.0, | ||||
|                   child: SafeArea( | ||||
|  | ||||
| @ -67,6 +67,31 @@ class ThumbnailImage extends HookConsumerWidget { | ||||
|         HapticFeedback.heavyImpact(); | ||||
|       }, | ||||
|       child: Hero( | ||||
|         createRectTween: (begin, end) { | ||||
|           double? top; | ||||
|           // Uses the [BoxFit.contain] algorithm | ||||
|           if (asset.width != null && asset.height != null) { | ||||
|             final assetAR = asset.width! / asset.height!; | ||||
|             final w = MediaQuery.of(context).size.width; | ||||
|             final deviceAR = MediaQuery.of(context).size.aspectRatio; | ||||
|             if (deviceAR < assetAR) { | ||||
|               top = asset.height! * w / asset.width!; | ||||
|             } else { | ||||
|               top = 0; | ||||
|             } | ||||
|             // get the height offset | ||||
|           } | ||||
| 
 | ||||
|           return MaterialRectCenterArcTween( | ||||
|             begin: Rect.fromLTRB( | ||||
|               0, | ||||
|               top ?? 0.0, | ||||
|               MediaQuery.of(context).size.width, | ||||
|               MediaQuery.of(context).size.height, | ||||
|             ), | ||||
|             end: end, | ||||
|           ); | ||||
|         }, | ||||
|         tag: asset.id, | ||||
|         child: Stack( | ||||
|           children: [ | ||||
|  | ||||
| @ -259,7 +259,6 @@ class _PhotoViewGalleryState extends State<PhotoViewGallery> { | ||||
|             controller: pageOption.controller, | ||||
|             scaleStateController: pageOption.scaleStateController, | ||||
|             customSize: widget.customSize, | ||||
|             heroAttributes: pageOption.heroAttributes, | ||||
|             scaleStateChangedCallback: scaleStateChangedCallback, | ||||
|             enableRotation: widget.enableRotation, | ||||
|             initialScale: pageOption.initialScale, | ||||
| @ -289,7 +288,6 @@ class _PhotoViewGalleryState extends State<PhotoViewGallery> { | ||||
|             scaleStateController: pageOption.scaleStateController, | ||||
|             customSize: widget.customSize, | ||||
|             gaplessPlayback: widget.gaplessPlayback, | ||||
|             heroAttributes: pageOption.heroAttributes, | ||||
|             scaleStateChangedCallback: scaleStateChangedCallback, | ||||
|             enableRotation: widget.enableRotation, | ||||
|             initialScale: pageOption.initialScale, | ||||
| @ -310,6 +308,19 @@ class _PhotoViewGalleryState extends State<PhotoViewGallery> { | ||||
|             errorBuilder: pageOption.errorBuilder, | ||||
|           ); | ||||
| 
 | ||||
|     if (pageOption.heroAttributes != null) { | ||||
|       return Hero( | ||||
|         tag: pageOption.heroAttributes!.tag, | ||||
|         createRectTween: pageOption.heroAttributes!.createRectTween, | ||||
|         flightShuttleBuilder: pageOption.heroAttributes!.flightShuttleBuilder, | ||||
|         placeholderBuilder: pageOption.heroAttributes!.placeholderBuilder, | ||||
|         transitionOnUserGestures: pageOption.heroAttributes!.transitionOnUserGestures, | ||||
|         child: ClipRect( | ||||
|           child: photoView, | ||||
|         ), | ||||
|       ); | ||||
|     } | ||||
| 
 | ||||
|     return ClipRect( | ||||
|       child: photoView, | ||||
|     ); | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user