mirror of
https://github.com/immich-app/immich.git
synced 2024-12-25 10:43:13 +02: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…
Reference in New Issue
Block a user