10天学会flutter DAY10 flutter 玩转 动画与打包,jvm 面试

先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7

深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
img
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Android开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以添加V获取:vip204888 (备注Android)
img

正文

  • AnimatedWidget

  • Hero动画

  • 组合动画

  • 打包

  • 饼图

动画


​ Flutter中的动画系统基于Animation对象的,和之前的手势不同,它不是一个Widget,这是因为Animation对象本身和UI渲染没有任何关系。Animation是一个抽象类,就相当于一个定时器,它用于保存动画的插值和状态,并执行数值的变化。widget可以在build函数中读取Animation对象的当前值, 并且可以监听动画的状态改变。

AnimationController

​ AnimationController用于控制动画,它包含动画的启动forward()、停止stop() 、反向播放 reverse()等方法。AnimationController会在动画的每一帧,就会生成一个新的值。默认情况下,AnimationController在给定的时间段内线性的生成从0.0到1.0(默认区间)的数字。

AnimationController controller = AnimationController(

duration: const Duration(milliseconds: 2000), //动画时间

lowerBound: 10.0, //生成数字的区间

upperBound: 20.0, //10.0 - 20.0

vsync: this //TickerProvider 动画驱动器提供者

);

Ticker

​ Ticker的作用是添加屏幕刷新回调,每次屏幕刷新都会调用TickerCallback。使用Ticker来驱动动画会防止屏幕外动画(动画的UI不在当前屏幕时,如锁屏时)消耗不必要的资源。因为Flutter中屏幕刷新时会通知Ticker,锁屏后屏幕会停止刷新,所以Ticker就不会再触发。最简单的做法为将SingleTickerProviderStateMixin添加到State的定义中。

import ‘package:flutter/material.dart’;

void main() => runApp(AnimationApp());

class AnimationApp extends StatelessWidget {

@override

Widget build(BuildContext context) {

return MaterialApp(

title: “animation”,

home: Scaffold(

appBar: AppBar(

title: Text(‘animation’),

),

body: AnimWidget(),

),

);

}

}

// 动画是有状态的

class AnimWidget extends StatefulWidget {

@override

State createState() {

return _AnimWidgetState();

}

}

class _AnimWidgetState extends State

with SingleTickerProviderStateMixin {

AnimationController controller;

bool forward = true;

@override

void initState() {

super.initState();

controller = AnimationController(

// 动画的时长

duration: Duration(milliseconds: 2000),

lowerBound: 10.0,

upperBound: 100.0,

// 提供 vsync 最简单的方式,就是直接混入 SingleTickerProviderStateMixin

// 如果有多个AnimationController,则使用TickerProviderStateMixin。

vsync: this,

);

//状态修改监听

controller

…addStatusListener((AnimationStatus status) {

debugPrint(“状态:$status”);

})

…addListener(() {

setState(() => {});

});

debugPrint(“controller.value:${controller.value}”);

}

@override

Widget build(BuildContext context) {

return Column(

children: [

Container(

width: controller.value,

height: controller.value,

color: Colors.blue,

),

RaisedButton(

child: Text(“播放”),

onPressed: () {

if (forward) {

controller.forward();

} else {

controller.reverse();

}

forward = !forward;

},

),

RaisedButton(

child: Text(“停止”),

onPressed: () {

controller.stop();

},

)

],

);

}

}

动画状态监听:在forword结束之后状态为completed。在reverse结束之后状态为dismissed

Tween

​ 默认情况下,AnimationController对象值为:double类型,范围是0.0到1.0 。如果我们需要不同的范围或不同的数据类型,则可以使用Tween来配置动画以生成不同的范围或数据类型的值。要使用Tween对象,需要调用其animate()方法,然后传入一个控制器对象,同时动画过程中产生的数值由Tweenlerp方法决定。

import ‘package:flutter/material.dart’;

void main() => runApp(AnimationApp());

class AnimationApp extends StatelessWidget {

@override

Widget build(BuildContext context) {

return MaterialApp(

title: “animation”,

home: Scaffold(

appBar: AppBar(

title: Text(‘animation’),

),

body: AnimWidget(),

),

);

}

}

// 动画是有状态的

class AnimWidget extends StatefulWidget {

@override

State createState() {

return _AnimWidgetState();

}

}

class _AnimWidgetState extends State

with SingleTickerProviderStateMixin {

AnimationController controller;

bool forward = true;

Tween tween;

@override

void initState() {

super.initState();

controller = AnimationController(

// 动画的时长

duration: Duration(milliseconds: 2000),

// 提供 vsync 最简单的方式,就是直接继承 SingleTickerProviderStateMixin

vsync: this,

);

//使用Color

tween = ColorTween(begin: Colors.blue, end: Colors.yellow);

//添加动画值修改监听

tween.animate(controller)…addListener(() => setState(() {}));

}

@override

Widget build(BuildContext context) {

return Column(

children: [

Container(

width: 100,

height: 100,

//获取动画当前值

color: tween.evaluate(controller),

),

RaisedButton(

child: Text(“播放”),

onPressed: () {

if (forward) {

controller.forward();

} else {

controller.reverse();

}

forward = !forward;

},

),

RaisedButton(

child: Text(“停止”),

onPressed: () {

controller.stop();

},

)

],

);

}

}

Curve

​ 动画过程默认是线性的(匀速),如果需要非线形的,比如:加速的或者先加速后减速等。Flutter中可以通过Curve(曲线)来描述动画过程。

import ‘package:flutter/material.dart’;

void main() => runApp(AnimationApp());

class AnimationApp extends StatelessWidget {

@override

Widget build(BuildContext context) {

return MaterialApp(

title: “animation”,

home: Scaffold(

appBar: AppBar(

title: Text(‘animation’),

),

body: AnimWidget(),

),

);

}

}

// 动画是有状态的

class AnimWidget extends StatefulWidget {

@override

State createState() {

return _AnimWidgetState();

}

}

class _AnimWidgetState extends State

with SingleTickerProviderStateMixin {

AnimationController controller;

Animation animation;

bool forward = true;

@override

void initState() {

super.initState();

controller = AnimationController(

// 动画的时长

duration: Duration(milliseconds: 2000),

// 提供 vsync 最简单的方式,就是直接继承 SingleTickerProviderStateMixin

vsync: this,

);

//弹性

animation = CurvedAnimation(parent: controller, curve: Curves.bounceIn);

//使用Color

animation = Tween(begin: 10.0, end: 100.0).animate(animation)

…addListener(() {

setState(() => {});

});

}

@override

Widget build(BuildContext context) {

return Column(

children: [

Container(

//不需要转换

width: animation.value,

height: animation.value,

//获取动画当前值

color: Colors.blue,

),

RaisedButton(

child: Text(“播放”),

onPressed: () {

if (forward) {

controller.forward();

} else {

controller.reverse();

}

forward = !forward;

},

),

RaisedButton(

child: Text(“停止”),

onPressed: () {

controller.stop();

},

)

],

);

}

}

AnimatedWidget

​ 通过上面的学习我们能够感受到Animation对象本身和UI渲染没有任何关系。而通过addListener()setState() 来更新UI这一步其实是通用的,如果每个动画中都加这么一句是比较繁琐的。AnimatedWidget类封装了调用setState()的细节,简单来说就是自动调用setState()

​ Flutter中已经封装了很多动画,比如对widget进行缩放,可以直接使用ScaleTransition

import ‘package:flutter/material.dart’;

void main() => runApp(AnimationApp());

class AnimationApp extends StatelessWidget {

@override

Widget build(BuildContext context) {

return MaterialApp(

title: “animation”,

home: Scaffold(

appBar: AppBar(

title: Text(‘animation’),

),

body: AnimWidget(),

),

);

}

}

// 动画是有状态的

class AnimWidget extends StatefulWidget {

@override

State createState() {

return _AnimWidgetState();

}

}

class _AnimWidgetState extends State

with SingleTickerProviderStateMixin {

AnimationController controller;

Animation animation;

bool forward = true;

@override

void initState() {

super.initState();

controller = AnimationController(

// 动画的时长

duration: Duration(milliseconds: 2000),

// 提供 vsync 最简单的方式,就是直接继承 SingleTickerProviderStateMixin

vsync: this,

);

//弹性

animation = CurvedAnimation(parent: controller, curve: Curves.bounceIn);

//使用Color

animation = Tween(begin: 10.0, end: 100.0).animate(animation);

Android进阶资料

以下的资料是近年来,我和一些朋友面试收集整理了很多大厂的面试真题和资料,还有来自如阿里、小米、爱奇艺等一线大厂的大牛整理的架构进阶资料。希望可以帮助到大家。

Android进阶核心笔记

百万年薪必刷面试题

最全Android进阶学习视频

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip204888 (备注Android)
img

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

// 提供 vsync 最简单的方式,就是直接继承 SingleTickerProviderStateMixin

vsync: this,

);

//弹性

animation = CurvedAnimation(parent: controller, curve: Curves.bounceIn);

//使用Color

animation = Tween(begin: 10.0, end: 100.0).animate(animation);

Android进阶资料

以下的资料是近年来,我和一些朋友面试收集整理了很多大厂的面试真题和资料,还有来自如阿里、小米、爱奇艺等一线大厂的大牛整理的架构进阶资料。希望可以帮助到大家。

Android进阶核心笔记

[外链图片转存中…(img-c4abq3Qr-1713411268755)]

百万年薪必刷面试题

[外链图片转存中…(img-iDHDrz81-1713411268755)]

最全Android进阶学习视频

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip204888 (备注Android)
[外链图片转存中…(img-zn1F3YZF-1713411268756)]

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 5
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值