1、图片控件
图片使用
2、动画
import 'package:flutter/material.dart';
void main() => runApp(LogoApp());
class LogoApp extends StatefulWidget {
@override
_LogoAppState createState() => _LogoAppState();
}
/// SingleTickerProviderStateMixin 资源回收
class _LogoAppState extends State<LogoApp> with SingleTickerProviderStateMixin {
Animation<double> animation;
AnimationController controller;
AnimationStatus animationStatus;
double animationValue;
@override
void initState() {
super.initState();
controller = AnimationController(vsync: this, duration: Duration(seconds: 2));
animation = Tween<double>(begin: 0, end: 300).animate(controller)
..addListener((){
setState(() {
animationValue = animation.value;
});
})
..addStatusListener((AnimationStatus status){
setState(() {
animationStatus = status;
});
});
}
@override
void dispose() {
controller.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
return Container(
margin: EdgeInsets.only(top: 64),
child: Column(
children: <Widget>[
GestureDetector(
onTap: () {
controller.reset();
controller.forward();
},
child: Text('Start', textDirection: TextDirection.ltr,),
),
Text('State' + animationStatus.toString(), textDirection: TextDirection.ltr,),
Text('Value' + animationValue.toString(), textDirection: TextDirection.ltr,),
Container(
height: animation.value,
width: animation.value,
child: FlutterLogo(),
),
],
),
);
}
}
AnimatedWidget
import 'package:flutter/material.dart';
class AnimatedLogo extends AnimatedWidget {
AnimatedLogo({Key key, Animation<double> animation}) : super(key: key, listenable: animation);
@override
Widget build(BuildContext context) {
final Animation<double> animation = listenable;
return Center(
child: Container(
margin: EdgeInsets.symmetric(vertical: 10),
height: animation.value,
width: animation.value,
child: FlutterLogo(),
),
);
}
}
void main() => runApp(LogoApp());
class LogoApp extends StatefulWidget {
@override
_LogoAppState createState() => _LogoAppState();
}
/// SingleTickerProviderStateMixin 资源回收
class _LogoAppState extends State<LogoApp> with SingleTickerProviderStateMixin {
Animation<double> animation;
AnimationController controller;
AnimationStatus animationStatus;
double animationValue;
@override
void initState() {
super.initState();
controller = AnimationController(vsync: this, duration: Duration(seconds: 2));
animation = Tween<double>(begin: 0, end: 300).animate(controller);
controller.forward();
}
@override
void dispose() {
controller.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
return AnimatedLogo(animation: animation,);
}
}
AnimatedBuilder
import 'package:flutter/material.dart';
class LogoWidget extends StatelessWidget {
@override
Widget build(BuildContext context) => Container(
margin: EdgeInsets.symmetric(vertical: 10),
child: FlutterLogo(),
);
}
class GrowTransition extends StatelessWidget {
GrowTransition(this.child, this.animation);
final Widget child;
final Animation<double> animation;
@override
Widget build(BuildContext context) => Center(
child: AnimatedBuilder(
animation: animation,
builder: (context, child) => Container(
child: child,
height: animation.value,
width: animation.value,
),
child: child,
),
);
}
void main() => runApp(LogoApp());
class LogoApp extends StatefulWidget {
@override
_LogoAppState createState() => _LogoAppState();
}
/// SingleTickerProviderStateMixin 资源回收
class _LogoAppState extends State<LogoApp> with SingleTickerProviderStateMixin {
Animation<double> animation;
AnimationController controller;
AnimationStatus animationStatus;
double animationValue;
@override
void initState() {
super.initState();
controller =
AnimationController(vsync: this, duration: Duration(seconds: 2));
animation = Tween<double>(begin: 0, end: 300).animate(controller);
controller.forward();
}
@override
void dispose() {
controller.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) => GrowTransition(LogoWidget(), animation);
}
Hero动画
import 'package:flutter/material.dart';
import 'package:flutter/scheduler.dart' show timeDilation;
void main() => runApp(MaterialApp(home: HeroAnimation(),));
class PhotoHero extends StatelessWidget {
final String photo;
final VoidCallback onTap;
final double width;
const PhotoHero({Key key, this.photo, this.onTap, this.width})
: super(key: key);
@override
Widget build(BuildContext context) {
return SizedBox(
width: width,
child: Hero(
tag: photo,
child: Material(
color: Colors.transparent,
child: InkWell(
onTap: onTap,
child: Image.network(
photo,
fit: BoxFit.contain,
),
),
)),
);
}
}
class HeroAnimation extends StatelessWidget {
@override
Widget build(BuildContext context) {
timeDilation = 5.0;
return Scaffold(
appBar: AppBar(
title: const Text('Basic hero animation'),
),
body: Center(
child: PhotoHero(
photo: 'https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1576745823025&di=8067dd52c36dffd837f122247a609792&imgtype=0&src=http%3A%2F%2Fimg9.zol.com.cn%2Fdp_800%2F248%2F247227.jpg',
width: 300,
onTap: () {
Navigator.of(context).push(
MaterialPageRoute<void>(builder: (BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text('Flipper page'),
),
body: Container(
color: Colors.lightBlueAccent,
padding: const EdgeInsets.all(16),
alignment: Alignment.topLeft,
child: PhotoHero(
photo: 'https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1576745823025&di=8067dd52c36dffd837f122247a609792&imgtype=0&src=http%3A%2F%2Fimg9.zol.com.cn%2Fdp_800%2F248%2F247227.jpg',
width: 100,
onTap: () {
Navigator.of(context).pop();
},
),
),
);
})
);
},
),
),
);
}
}
高阶待续…
来源:CSDN
作者:hungry_lady
链接:https://blog.csdn.net/weixin_38885024/article/details/103603653