Skip to content

Commit

Permalink
Add transformHitTests to Rotate/ScaleEffect
Browse files Browse the repository at this point in the history
Per issue #66
  • Loading branch information
gskinner committed Nov 19, 2023
1 parent 48e30ba commit 33e23b3
Show file tree
Hide file tree
Showing 3 changed files with 39 additions and 10 deletions.
24 changes: 19 additions & 5 deletions lib/src/effects/rotate_effect.dart
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
import 'dart:math' as math;

import 'package:flutter/widgets.dart';

import '../../flutter_animate.dart';
Expand All @@ -14,6 +16,7 @@ import '../../flutter_animate.dart';
class RotateEffect extends Effect<double> {
static const double neutralValue = 0.0;
static const double defaultValue = -1.0;
static const bool defaultTransformHitTests = true;

const RotateEffect({
Duration? delay,
Expand All @@ -22,7 +25,9 @@ class RotateEffect extends Effect<double> {
double? begin,
double? end,
this.alignment,
}) : super(
bool? transformHitTests,
}) : transformHitTests = transformHitTests ?? defaultTransformHitTests,
super(
delay: delay,
duration: duration,
curve: curve,
Expand All @@ -31,6 +36,7 @@ class RotateEffect extends Effect<double> {
);

final Alignment? alignment;
final bool transformHitTests;

@override
Widget build(
Expand All @@ -40,10 +46,16 @@ class RotateEffect extends Effect<double> {
EffectEntry entry,
) {
Animation<double> animation = buildAnimation(controller, entry);
return RotationTransition(
turns: animation,
alignment: alignment ?? Alignment.center,
child: child,
return getOptimizedBuilder<double>(
animation: animation,
builder: (_, __) {
return Transform.rotate(
angle: animation.value * 2 * math.pi,
alignment: alignment ?? Alignment.center,
transformHitTests: transformHitTests,
child: child,
);
},
);
}
}
Expand All @@ -57,6 +69,7 @@ extension RotateEffectExtensions<T> on AnimateManager<T> {
double? begin,
double? end,
Alignment? alignment,
bool? transformHitTests,
}) =>
addEffect(RotateEffect(
delay: delay,
Expand All @@ -65,5 +78,6 @@ extension RotateEffectExtensions<T> on AnimateManager<T> {
begin: begin,
end: end,
alignment: alignment,
transformHitTests: transformHitTests,
));
}
17 changes: 14 additions & 3 deletions lib/src/effects/scale_effect.dart
Original file line number Diff line number Diff line change
@@ -1,5 +1,3 @@
import 'dart:math' as math;

import 'package:flutter/widgets.dart';

import '../../flutter_animate.dart';
Expand All @@ -15,6 +13,7 @@ class ScaleEffect extends Effect<Offset> {
static const double neutralScale = 1.0;
static const double defaultScale = 0;
static const double minScale = 0.000001;
static const bool defaultTransformHitTests = true;

const ScaleEffect({
Duration? delay,
Expand All @@ -23,7 +22,9 @@ class ScaleEffect extends Effect<Offset> {
Offset? begin,
Offset? end,
this.alignment,
}) : super(
bool? transformHitTests,
}) : transformHitTests = transformHitTests ?? defaultTransformHitTests,
super(
delay: delay,
duration: duration,
curve: curve,
Expand All @@ -32,6 +33,7 @@ class ScaleEffect extends Effect<Offset> {
);

final Alignment? alignment;
final bool transformHitTests;

@override
Widget build(
Expand All @@ -48,6 +50,7 @@ class ScaleEffect extends Effect<Offset> {
scaleX: _normalizeScale(animation.value.dx),
scaleY: _normalizeScale(animation.value.dy),
alignment: alignment ?? Alignment.center,
transformHitTests: transformHitTests,
child: child,
);
},
Expand All @@ -70,6 +73,7 @@ extension ScaleEffectExtensions<T> on AnimateManager<T> {
Offset? begin,
Offset? end,
Alignment? alignment,
bool? transformHitTests,
}) =>
addEffect(ScaleEffect(
delay: delay,
Expand All @@ -78,6 +82,7 @@ extension ScaleEffectExtensions<T> on AnimateManager<T> {
begin: begin,
end: end,
alignment: alignment,
transformHitTests: transformHitTests,
));

/// Adds a [scaleX] extension to [AnimateManager] ([Animate] and [AnimateList]).
Expand All @@ -89,6 +94,7 @@ extension ScaleEffectExtensions<T> on AnimateManager<T> {
double? begin,
double? end,
Alignment? alignment,
bool? transformHitTests,
}) {
begin ??=
(end == null ? ScaleEffect.defaultScale : ScaleEffect.neutralScale);
Expand All @@ -100,6 +106,7 @@ extension ScaleEffectExtensions<T> on AnimateManager<T> {
begin: ScaleEffect.neutralValue.copyWith(dx: begin),
end: ScaleEffect.neutralValue.copyWith(dx: end),
alignment: alignment,
transformHitTests: transformHitTests,
));
}

Expand All @@ -112,6 +119,7 @@ extension ScaleEffectExtensions<T> on AnimateManager<T> {
double? begin,
double? end,
Alignment? alignment,
bool? transformHitTests,
}) {
begin ??=
(end == null ? ScaleEffect.defaultScale : ScaleEffect.neutralScale);
Expand All @@ -123,6 +131,7 @@ extension ScaleEffectExtensions<T> on AnimateManager<T> {
begin: ScaleEffect.neutralValue.copyWith(dy: begin),
end: ScaleEffect.neutralValue.copyWith(dy: end),
alignment: alignment,
transformHitTests: transformHitTests,
));
}

Expand All @@ -135,6 +144,7 @@ extension ScaleEffectExtensions<T> on AnimateManager<T> {
double? begin,
double? end,
Alignment? alignment,
bool? transformHitTests,
}) {
begin ??=
(end == null ? ScaleEffect.defaultScale : ScaleEffect.neutralScale);
Expand All @@ -146,6 +156,7 @@ extension ScaleEffectExtensions<T> on AnimateManager<T> {
begin: Offset(begin, begin),
end: Offset(end, end),
alignment: alignment,
transformHitTests: transformHitTests,
));
}
}
8 changes: 6 additions & 2 deletions test/effects/rotate_test.dart
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
import 'dart:math';

import 'package:flutter/material.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:flutter_animate/flutter_animate.dart';
Expand All @@ -15,7 +17,9 @@ void main() {

// check halfway
await tester.pumpAnimation(animation, initialDelay: 500.ms);
tester.expectWidgetWithDouble<RotationTransition>(
(o) => o.turns.value, 1, 'turns');

Matrix4 expectedMatrix = Transform.rotate(angle: (1 * pi * 2)).transform;
tester.expectWidgetWithBool<Transform>(
(o) => o.transform == expectedMatrix, true, 'rotate');
});
}

0 comments on commit 33e23b3

Please sign in to comment.