Skip to content
This repository has been archived by the owner on Feb 16, 2024. It is now read-only.

Drop Flare Dependency #375

Merged
merged 105 commits into from Nov 16, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
105 commits
Select commit Hold shift + click to select a range
71bfb91
On this branch, I will rewrite the icon for the menu button on the ba…
pennzht Nov 5, 2020
c5ab107
Merge branch 'master' into x-icon
pennzht Nov 7, 2020
8067f80
Add some experiments.
pennzht Nov 7, 2020
4ab37d6
Add more experiment.
pennzht Nov 7, 2020
f9b74d4
Add icon/colors.txt.
pennzht Nov 7, 2020
0348cd7
Add metrics.
pennzht Nov 7, 2020
d997a98
Move directory.
pennzht Nov 9, 2020
e0bacce
Modify.
pennzht Nov 9, 2020
b8ec95c
Add times for animation.
pennzht Nov 9, 2020
0e15e1a
Add flare_icon.dart.
pennzht Nov 9, 2020
d173dbd
Setting up framework.
pennzht Nov 9, 2020
b1cff4e
Add SIP.
pennzht Nov 9, 2020
e8163e7
Add more changes.
pennzht Nov 9, 2020
f03ff6a
Remove unused LayoutBuilder.
pennzht Nov 9, 2020
5f82b57
Remove AspectRatio.
pennzht Nov 9, 2020
ad118db
Add scaling.
pennzht Nov 9, 2020
e650aca
Add _size.
pennzht Nov 9, 2020
fc073f3
Rename to unitHeight and unitWidth.
pennzht Nov 9, 2020
8bab6d7
Add icon.dart.
pennzht Nov 9, 2020
c00605f
Add more metrics.
pennzht Nov 9, 2020
ef2a0f1
Add more metrics.x
pennzht Nov 9, 2020
bf2b658
Add more metrics.
pennzht Nov 9, 2020
ded1779
Add initial experiment.
pennzht Nov 9, 2020
90e17bd
Add more metrics.
pennzht Nov 9, 2020
fd48b01
Add experiment.
pennzht Nov 9, 2020
24cc7df
Add paintStick.
pennzht Nov 9, 2020
dadc2c2
Experiment with the x-icon.
pennzht Nov 9, 2020
4166700
Almost!
pennzht Nov 9, 2020
ddd1cc0
First success!
pennzht Nov 9, 2020
85c1c92
Remove unused flare imports.
pennzht Nov 9, 2020
af6fd28
Cleanup.
pennzht Nov 9, 2020
430b5ca
Add easing and more.
pennzht Nov 9, 2020
9cf6ffc
Add offset.
pennzht Nov 9, 2020
fb2145c
First good version!
pennzht Nov 9, 2020
9ec058e
Add paints.
pennzht Nov 9, 2020
f5fe935
Add paints.
pennzht Nov 9, 2020
9e031e3
First visually correct example.
pennzht Nov 9, 2020
fe92381
A not-so-successful shader.
pennzht Nov 9, 2020
b03bc4f
Another not-so-successful gradient.
pennzht Nov 9, 2020
c4fdf21
A successful gradient (experimental).
pennzht Nov 9, 2020
b168f57
A successful version!
pennzht Nov 9, 2020
307d5a2
Add experiment.
pennzht Nov 9, 2020
594ccc1
Update metrics.
pennzht Nov 9, 2020
b6b7af1
Remove unused.
pennzht Nov 9, 2020
1a5c05c
Remove colors.dart.
pennzht Nov 9, 2020
5df0d84
Rename.
pennzht Nov 9, 2020
31d590c
Redocument.
pennzht Nov 9, 2020
1d3c255
Refactor.
pennzht Nov 9, 2020
4c425cf
Refactor.
pennzht Nov 9, 2020
4e53e49
Refactor.
pennzht Nov 9, 2020
a07dc83
Comment.
pennzht Nov 9, 2020
75ab41c
Refactor.
pennzht Nov 9, 2020
27c3875
Rename to private.
pennzht Nov 9, 2020
7f1ffa2
Further refactor.
pennzht Nov 9, 2020
637b3a6
Remove spaces.
pennzht Nov 9, 2020
1d94d69
Add other animation for close icon.
pennzht Nov 9, 2020
16f96a8
Use reverse and forward instead of fling.
pennzht Nov 9, 2020
e066ebe
Add _iconController.
pennzht Nov 9, 2020
e69a2d8
Update icon_tester.dart.
pennzht Nov 9, 2020
3b6dcb8
Refactor.
pennzht Nov 9, 2020
6237f93
Tweak duration.
pennzht Nov 9, 2020
4054dda
Reorder.
pennzht Nov 9, 2020
9d08bb2
Remove unused debug.
pennzht Nov 9, 2020
c10f0aa
Ran into a strange error. Look into it later.
pennzht Nov 9, 2020
0e13ef4
Use `print`.
pennzht Nov 10, 2020
d04bc3a
Merge branch 'master' into x-icon-2
pennzht Nov 10, 2020
08d1de0
Rewire flare_icon.dart.
pennzht Nov 10, 2020
8352fea
Rewire.
pennzht Nov 10, 2020
f68e602
Rename.
pennzht Nov 10, 2020
a33efcb
Rewire.
pennzht Nov 10, 2020
667d88d
Add comparison.
pennzht Nov 10, 2020
abca68b
Use light for comparison.
pennzht Nov 10, 2020
b155377
Add icon_player.dart.
pennzht Nov 12, 2020
c48e873
Add icon_player.dart.
pennzht Nov 12, 2020
52f507d
Format.
pennzht Nov 12, 2020
c754e5c
Add icon_only_player.dart.
pennzht Nov 12, 2020
b20565c
Correct rotation direction.
pennzht Nov 12, 2020
a3254d1
Make `curve` private.
pennzht Nov 12, 2020
1dc7273
Make private.
pennzht Nov 12, 2020
8e97ee4
Use private.
pennzht Nov 12, 2020
547d48b
Remove unused `isRotationPhase`.
pennzht Nov 12, 2020
f629e73
Refactor to reduce similar code.
pennzht Nov 12, 2020
583514c
Update comment.
pennzht Nov 12, 2020
b6dba14
Make private.
pennzht Nov 12, 2020
aa5facc
Add license notice.
pennzht Nov 12, 2020
303e24f
Use `knobDeviation`.
pennzht Nov 12, 2020
841b472
Rename.
pennzht Nov 12, 2020
29911ff
Update comment.
pennzht Nov 12, 2020
054c0b7
Simplify.
pennzht Nov 12, 2020
4d72914
Finalize the PR.
pennzht Nov 14, 2020
cdb3ba5
Merge branch 'master' into x-icon-4
pennzht Nov 14, 2020
73946dd
Remove unused testers/players.
pennzht Nov 14, 2020
69d412a
Remove imports on flare.
pennzht Nov 14, 2020
3385663
Remove flare mixin.
pennzht Nov 14, 2020
db26d9b
Remove flare parameters.
pennzht Nov 14, 2020
e456635
Remove flare from golden testing.
pennzht Nov 14, 2020
85c177f
Remove flare from dependencies.
pennzht Nov 14, 2020
f5ad86a
Remove flr assets.
pennzht Nov 14, 2020
fbd1c60
Update pubspec.lock.
pennzht Nov 14, 2020
92bf5df
Change alignment.
pennzht Nov 14, 2020
740d408
Update goldens.
pennzht Nov 14, 2020
f82af9b
Run `flutter format`.
pennzht Nov 14, 2020
a0d0057
Use absolute import paths.
pennzht Nov 14, 2020
42facd6
Reorder to fit logical order.
pennzht Nov 14, 2020
5c19716
Remove unused const.
pennzht Nov 16, 2020
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
2 changes: 0 additions & 2 deletions golden_test/flutter_test_config.dart
Expand Up @@ -4,7 +4,6 @@

import 'dart:async';

import 'package:flare_flutter/flare_testing.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:shared_preferences/shared_preferences.dart';

Expand All @@ -21,7 +20,6 @@ Future<void> testExecutable(FutureOr<void> Function() testMain) async {
};

TestWidgetsFlutterBinding.ensureInitialized();
FlareTesting.setup();
// Disabling the warning because @visibleForTesting doesn't take the testing
// framework into account.
// ignore: invalid_use_of_visible_for_testing_member
Expand Down
Binary file modified golden_test/goldens/home_page_desktop_dark.png
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified golden_test/goldens/home_page_desktop_light.png
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified golden_test/goldens/home_page_mobile_dark.png
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified golden_test/goldens/home_page_mobile_light.png
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
78 changes: 17 additions & 61 deletions lib/pages/backdrop.dart
Expand Up @@ -2,10 +2,6 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

import 'package:flare_dart/math/mat2d.dart';
import 'package:flare_flutter/flare.dart';
import 'package:flare_flutter/flare_actor.dart';
import 'package:flare_flutter/flare_controller.dart';
import 'package:flutter/material.dart';
import 'package:flutter/rendering.dart';
import 'package:flutter/services.dart';
Expand All @@ -15,6 +11,7 @@ import 'package:flutter_gen/gen_l10n/gallery_localizations.dart';
import 'package:gallery/layout/adaptive.dart';
import 'package:gallery/pages/home.dart';
import 'package:gallery/pages/settings.dart';
import 'package:gallery/pages/settings_icon/icon.dart' as settings_icon;

const double _settingsButtonWidth = 64;
const double _settingsButtonHeightDesktop = 56;
Expand All @@ -33,24 +30,25 @@ class Backdrop extends StatefulWidget {
_BackdropState createState() => _BackdropState();
}

class _BackdropState extends State<Backdrop>
with SingleTickerProviderStateMixin, FlareController {
class _BackdropState extends State<Backdrop> with TickerProviderStateMixin {
AnimationController _settingsPanelController;
AnimationController _iconController;
FocusNode _settingsPageFocusNode;
ValueNotifier<bool> _isSettingsOpenNotifier;
Widget _settingsPage;
Widget _homePage;

FlutterActorArtboard _artboard;
FlareAnimationLayer _animationLayer;

@override
void initState() {
super.initState();
_settingsPanelController = AnimationController(
vsync: this,
duration: const Duration(milliseconds: 200),
);
_iconController = AnimationController(
vsync: this,
duration: const Duration(milliseconds: 500),
);
_settingsPageFocusNode = FocusNode();
_isSettingsOpenNotifier = ValueNotifier(false);
_settingsPage = widget.settingsPage ??
Expand All @@ -63,52 +61,22 @@ class _BackdropState extends State<Backdrop>
@override
void dispose() {
_settingsPanelController.dispose();
_iconController.dispose();
_settingsPageFocusNode.dispose();
_isSettingsOpenNotifier.dispose();
super.dispose();
}

@override
void initialize(FlutterActorArtboard artboard) {
_artboard = artboard;
initAnimationLayer();
}

@override
void setViewTransform(Mat2D viewTransform) {
// This is a necessary override for the [FlareController] mixin.
}

@override
bool advance(FlutterActorArtboard artboard, double elapsed) {
if (_animationLayer != null) {
final layer = _animationLayer;
layer.time = _settingsPanelController.value * layer.duration;
layer.animation.apply(layer.time, _artboard, 1);
if (layer.isDone || layer.time == 0) {
_animationLayer = null;
}
}
return _animationLayer != null;
}

void initAnimationLayer() {
if (_artboard != null) {
final animationName = 'Animations';
final animation = _artboard.getAnimation(animationName);
_animationLayer = FlareAnimationLayer()
..name = animationName
..animation = animation;
}
}

void _toggleSettings() {
initAnimationLayer();
// Animate the settings panel to open or close.
_settingsPanelController.fling(
velocity: _isSettingsOpenNotifier.value ? -1 : 1);
if (_isSettingsOpenNotifier.value) {
_settingsPanelController.reverse();
_iconController.reverse();
} else {
_settingsPanelController.forward();
_iconController.forward();
}
_isSettingsOpenNotifier.value = !_isSettingsOpenNotifier.value;
isActive.value = true;
}

Animation<RelativeRect> _slideDownSettingsPageAnimation(
Expand Down Expand Up @@ -251,9 +219,8 @@ class _BackdropState extends State<Backdrop>
),
],
_SettingsIcon(
animationController: _settingsPanelController,
animationController: _iconController,
toggleSettings: _toggleSettings,
flareController: this,
isSettingsOpenNotifier: _isSettingsOpenNotifier,
),
],
Expand All @@ -272,13 +239,11 @@ class _BackdropState extends State<Backdrop>
class _SettingsIcon extends AnimatedWidget {
_SettingsIcon(
{this.animationController,
this.flareController,
this.toggleSettings,
this.isSettingsOpenNotifier})
: super(listenable: animationController);

final AnimationController animationController;
final FlareController flareController;
final VoidCallback toggleSettings;
final ValueNotifier<bool> isSettingsOpenNotifier;

Expand Down Expand Up @@ -324,16 +289,7 @@ class _SettingsIcon extends AnimatedWidget {
},
child: Padding(
padding: const EdgeInsetsDirectional.only(start: 3, end: 18),
child: FlareActor(
Theme.of(context).colorScheme.brightness == Brightness.light
? 'packages/flutter_gallery_assets/assets/icons/settings/settings_light.flr'
: 'packages/flutter_gallery_assets/assets/icons/settings/settings_dark.flr',
alignment: Directionality.of(context) == TextDirection.ltr
? Alignment.bottomLeft
: Alignment.bottomRight,
fit: BoxFit.contain,
controller: flareController,
),
child: settings_icon.SettingsIcon(animationController.value),
),
),
),
Expand Down
193 changes: 193 additions & 0 deletions lib/pages/settings_icon/icon.dart
@@ -0,0 +1,193 @@
// Copyright 2019 The Flutter team. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

import 'dart:math';
import 'package:flutter/material.dart';
import 'package:flutter/rendering.dart';
import 'package:gallery/pages/settings_icon/metrics.dart';

class SettingsIcon extends StatelessWidget {
const SettingsIcon(this.time);

final double time;

@override
Widget build(BuildContext context) {
return CustomPaint(
painter: _SettingsIconPainter(time: time, context: context),
);
}
}

class _SettingsIconPainter extends CustomPainter {
_SettingsIconPainter({@required this.time, @required this.context});

final double time;
final BuildContext context;

Offset _center;
double _scaling;
Canvas _canvas;

/// Computes [_center] and [_scaling], parameters used to convert offsets
/// and lengths in relative units into logical pixels.
///
/// The icon is aligned to the bottom-start corner.
void _computeCenterAndScaling(Size size) {
_scaling = min(size.width / unitWidth, size.height / unitHeight);
_center = Directionality.of(context) == TextDirection.ltr
? Offset(
unitWidth * _scaling / 2, size.height - unitHeight * _scaling / 2)
: Offset(size.width - unitWidth * _scaling / 2,
size.height - unitHeight * _scaling / 2);
}

/// Transforms an offset in relative units into an offset in logical pixels.
Offset _transform(Offset offset) {
return _center + offset * _scaling;
}

/// Transforms a length in relative units into a dimension in logical pixels.
double _size(double length) {
return length * _scaling;
}

/// A rectangle with a fixed location, used to locate gradients.
Rect get _fixedRect {
final topLeft = Offset(-_size(stickLength / 2), -_size(stickWidth / 2));
final bottomRight = Offset(_size(stickLength / 2), _size(stickWidth / 2));
return Rect.fromPoints(topLeft, bottomRight);
}

/// Black or white paint, depending on brightness.
Paint get _monoPaint {
final monoColor =
Theme.of(context).colorScheme.brightness == Brightness.light
? Colors.black
: Colors.white;
return Paint()..color = monoColor;
}

/// Pink paint with horizontal gradient.
Paint get _pinkPaint {
const shader = LinearGradient(colors: [pinkLeft, pinkRight]);
final shaderRect = _fixedRect.translate(
_size(-(stickLength - colorLength(time)) / 2),
0,
);

return Paint()..shader = shader.createShader(shaderRect);
}

/// Teal paint with horizontal gradient.
Paint get _tealPaint {
const shader = LinearGradient(colors: [tealLeft, tealRight]);
final shaderRect = _fixedRect.translate(
_size((stickLength - colorLength(time)) / 2),
0,
);

return Paint()..shader = shader.createShader(shaderRect);
}

/// Paints a stadium-shaped stick.
void _paintStick({
@required Offset center,
@required double length,
@required double width,
double angle = 0,
@required Paint paint,
}) {
// Convert to pixels.
center = _transform(center);
length = _size(length);
width = _size(width);

// Paint.
width = min(width, length);
final stretch = length / 2;
final radius = width / 2;

_canvas.save();

_canvas.translate(center.dx, center.dy);
_canvas.rotate(angle);

final leftOval = Rect.fromCircle(
center: Offset(-stretch + radius, 0),
radius: radius,
);

final rightOval = Rect.fromCircle(
center: Offset(stretch - radius, 0),
radius: radius,
);

_canvas.drawPath(
Path()
..arcTo(leftOval, pi / 2, pi, false)
..arcTo(rightOval, -pi / 2, pi, false),
paint,
);

_canvas.restore();
}

@override
void paint(Canvas canvas, Size size) {
_computeCenterAndScaling(size);
_canvas = canvas;

if (isTransitionPhase(time)) {
_paintStick(
center: upperColorOffset(time),
length: colorLength(time),
width: stickWidth,
paint: _pinkPaint,
);

_paintStick(
center: lowerColorOffset(time),
length: colorLength(time),
width: stickWidth,
paint: _tealPaint,
);

_paintStick(
center: upperMonoOffset(time),
length: monoLength(time),
width: knobDiameter,
paint: _monoPaint,
);

_paintStick(
center: lowerMonoOffset(time),
length: monoLength(time),
width: knobDiameter,
paint: _monoPaint,
);
} else {
_paintStick(
center: upperKnobCenter,
length: stickLength,
width: knobDiameter,
angle: -knobRotation(time),
paint: _monoPaint,
);

_paintStick(
center: knobCenter(time),
length: stickLength,
width: knobDiameter,
angle: knobRotation(time),
paint: _monoPaint,
);
}
}

@override
bool shouldRepaint(CustomPainter oldDelegate) =>
oldDelegate is! _SettingsIconPainter ||
(oldDelegate as _SettingsIconPainter).time != time;
}