Flutter   发布时间:2022-05-03  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了Flutter “孔雀开屏”的动画效果大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

Flutter “孔雀开屏”的动画效果

先来看下具体的@L_262_0@

Flutter “孔雀开屏”的动画效果

不知道这种@L_262_0@大家叫什么名字?如果有更合适的名字可以在评论处告诉我,下面来说下如何实现此@L_262_0@。

使用Navigator进入一个新的页面时,通常用法如下:

Navigator.of(context).push(MaterialPageRoute(
  builder: (context){
    return PageB();
  }
));

@H_827_25@materialPageRoute就包含了切换页面时的动画@L_262_0@,在iOS上@L_262_0@是左右滑动切换,在Android上@L_262_0@是上下滑动,如果想要自定义切换@L_262_0@如何实现呢?答案是使用PageRouteBuilder用法如下:

Navigator.of(context).push(PageRouteBuilder(pageBuilder:
    (BuildContext context,Animation<double> animation,Animation<double> secondaryAnimation) {
  ...
}));

pageBuilder函数中使用animation返回新页面的动画@L_262_0@即可。

新的页面圆形@L_262_0@逐渐打开,注意并没有缩放@L_262_0@,所以新的页面是被裁减的,新的页面以右上角为圆心,半径逐渐变大进行裁切,就是我们想要的@L_262_0@。

通过上面的分析,使用ClipPath对新的页面进行裁切

Navigator.of(context).push(PageRouteBuilder(pageBuilder:
    (BuildContext context,Animation<double> secondaryAnimation) {
  return AnimatedBuilder(
    animation: animation,builder: (context,child) {
      return ClipPath(
        clipper: CirclePath(animation.value),child: child,);
    },child: PageB(),);
}));

重点是CirclePath,这就是裁切的路径,

class CirclePath extends Cus@R_607_10608@lipper<Path> {
  CirclePath(this.value);

  final double value;

  @override
  Path getClip(Size sizE) {
    var path = Path();
    double radius =
        value * sqrt(size.height * size.height + size.width * size.width);
    path.addOval(Rect.fromLTRB(
        size.width - radius,-radius,size.width + radius,radius));
    return path;
  }

  @override
  bool shouldReclip(Cus@R_607_10608@lipper<Path> oldClipper) {
    return true;
  }
}

由于Path没有直接添加圆形的API函数,因此使用椭圆方法,只需将椭圆的矩形区域设置为正方形,那么裁切出来的就是圆形。

半径的最大值并不是屏幕的宽或者高,而是屏幕的对角线长度。

由于是从右上角开始,而且裁切的矩形区域必须是正方形,所以裁切的矩形区域是超出页面区域的。

如果很多页面都用到了这个@L_262_0@,可以进行封装,类似于@H_827_25@materialPageRoute,封装如下:

class CirclePageRoute extends PageRoute {
  CirclePageRoute({
    @required this.builder,this.transitionDuration = const Duration(milliseconds: 500),this.opaque = true,this.barrierDismissible = false,this.barrierColor,this.barrierLabel,this.maintainState = true,});

  final WidgetBuilder builder;

  @override
  final Duration transitionDuration;

  @override
  final bool opaque;

  @override
  final bool barrierDismissible;

  @override
  final Color barrierColor;

  @override
  final String barrierLabel;

  @override
  final bool maintainState;

  @override
  Widget buildPage(BuildContext context,Animation<double> secondaryAnimation) {
    return AnimatedBuilder(
      animation: animation,child) {
        return ClipPath(
          clipper: CirclePath(animation.value),);
      },child: builder(context),);
  }
}

使用

Navigator.of(context).push(CirclePageRoute(builder: (context) {
  return PageB();
}));

如果你查看CuperTinoPageRoute、@H_827_25@materialPageRoute、PageRouteBuilder的源码,你会发现这3个都是继承自PageRoute,所以,不知不觉我们又学会了自定义路由。

交流

老孟Flutter博客地址(近200个控件用法):http://laomengit.com

欢迎加入Flutter交流群(微信:laomENGIt)、关注公众号【老孟Flutter】:

Flutter “孔雀开屏”的动画效果

Flutter “孔雀开屏”的动画效果

大佬总结

以上是大佬教程为你收集整理的Flutter “孔雀开屏”的动画效果全部内容,希望文章能够帮你解决Flutter “孔雀开屏”的动画效果所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签: