首页 > 其他分享 >Flutter hero动画

Flutter hero动画

时间:2023-12-26 13:55:05浏览次数:15  
标签:动画 const dart PhotoHero hero Flutter 页面

在 Flutter 中,图像从当前页面转到另一个页面称为 hero 动画,相同的动作有时也被称为 共享元素过渡。

hero 动画基本结构

  • 在不同页面分别使用两个 hero widgets,同时使用配对的标签来实现动画
  • Navigator 管理含有 app 页面的堆栈。
  • 推送一个页面或弹出一个 Navigator 堆栈中的页面会触发动画。
  • Flutter 框架设置了一个 RectTween 类,用来定义 hero 从原页面飞至目标页面的边界。在飞翔过程中,hero 移动到一个应用图层,这样它可以在两个页面上方显示。

Hero 动画需要使用两个 Hero widgets 来实现:一个用来在原页面中描述 widget,另一个在目标页面中描述 widget。从用户角度来说,hero 似乎是分享的,只有程序员需要了解实施细节。

标准 hero 动画

  • 使用 MaterialPageRoute,CupertinoPageRoute 指定页面,或使用 PageRouteBuilder 创建自定义页面。
  • 在过渡的最后,通过在 SizedBox 中裹挟目标图像来改变图像大小。
  • 通过在布局 widget 中放置目标图像来改变图像位置。

PhotoHero 类

自定义的 PhotoHero 类保留了 hero 以及其大小,图像,和点击时的动作。

import 'package:flutter/material.dart';

class PhotoHero extends StatelessWidget {
  const PhotoHero({
    super.key,
    required this.width,
    this.height,
    required this.imageUrl,
    this.onTap,
  });
  final double width;
  final double? height;
  final String imageUrl;
  final VoidCallback? onTap;
  @override
  Widget build(BuildContext context) {
    return Container(
      width: width,
      height: height,
      color: Colors.transparent,
      child: Hero(
        tag: imageUrl,
        child: Material(// Provides a canvas for the InkWell's splash during Hero's flight. Otherwise, the splash would be left behind.
          child: InkWell(
            onTap: onTap,
            child: Image.asset(
              imageUrl,
              fit: BoxFit.cover,
            ),
          ),
        ),
      ),
    );
  }
}

hero_page.dart

import 'package:flutter/material.dart';

import '../components/photo_hero.dart';

class HeroPage extends StatelessWidget {
  const HeroPage({super.key});
  static const url =
      'images/products/O1CN01yvMCj11GkmaVukfRK_!!2652950661.jpg_Q75.jpg';
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('HeroPage'),
      ),
      body: Center(
        child: PhotoHero(
          width: 60,
          height: 60,
          imageUrl: url,
          onTap: () {
            Navigator.pushNamed(context, '/herophoto', arguments: url);
          },
        ),
      ),
    );
  }
}

hero_photo.dart

import 'package:flutter/material.dart';

import '../components/photo_hero.dart';

class HeroPhoto extends StatelessWidget {
  final String url;

  const HeroPhoto({super.key, required this.url});

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('HeroPhoto'),
      ),
      body: Container(
        color: Colors.transparent,
        padding: const EdgeInsets.all(16),
        alignment: Alignment.center,
        child: PhotoHero(
          width: 300,
          height: 300,
          imageUrl: url,
          onTap: () {
            Navigator.pop(context);
          },
        ),
      ),
    );
  }
}


标签:动画,const,dart,PhotoHero,hero,Flutter,页面
From: https://www.cnblogs.com/angelwgh/p/17926430.html

相关文章

  • 使用 Flutter 制作地图应用
    使用Flutter制作地图应用本文主要介绍使用Flutter制作地图应用在本文中,我将向您展示如何使用Flutter向您的应用程序添加映射功能。对于本教程,您将不需要googlemapsAPI,因此您无需支付任何费用,因为我们将使用另一个免费API,所以不用多说,让我们深入研究它。依赖关系创建一个......
  • 十九、显示动画-位置改变
    ArkUI中,产生动画的方式是改变属性值且指定动画参数。动画参数包含了如动画的时长、变化规律(即曲线)等参数,当属性值发生变化后,按照动画参数,从原来的状态过渡到新的状态,即形成一个动画。AnimateParam对象说明名称类型描述durationnumber动画持续时间,单位为毫秒。默认值......
  • lottie 动画在 vue 中的使用
    前言最近我所负责的项目中,我采用了动画效果,并开始使用gif来实现。然而,在实践过程中,我发现gif格式的动画在git中出现了明显的锯齿感,这让我非常困扰。为了追求更完美的表现效果,我最终选择了lottie来实现我的动画需求。我深知动画效果的呈现对于用户体验至关重要,因此我非常......
  • 27、flutter Dialog 弹窗
    AlertDialog//放在State<>之下void_alertDialog()async{varresult=awaitshowDialog(barrierDismissible:true,//表示点击灰色背景的时候是否消失弹出框context:context,builder:(context){returnAlertDialog(......
  • flutter响应式
    1LayoutBuilder作用比较类似css的@media,根据不同的尺寸渲染不同的节点LayoutBuilder( builder:(BuildContextcontext,constraints){print(constraints);//BoxConstraints(0.0<=w<=360.0,0.0<=h<=692.0) print(constraints.maxHeight);print(constraints.......
  • Flutter Icons交错动画
    import'package:flutter/material.dart';classAnimateIconsextendsStatelessWidget{constAnimateIcons({super.key});@overrideWidgetbuild(BuildContextcontext){returnScaffold(appBar:AppBar(title:constText(�......
  • 26、Flutter中命名路由
    Flutter中的命名路由main.dart中配置路由voidmain(){runApp(MaterialApp(theme:ThemeData(appBarTheme:constAppBarTheme(color:Colors.blue,//设置导航栏颜色(新版本的设置方法)),),//home:Scaffold(body:MyFlutter1())......
  • 25、Flutter中基本路由
    Flutter路由介绍Flutter中的路由通俗的讲就是页面跳转。在Flutter中通过Navigator组件管理路由导航。并提供了管理堆栈的方法。如:Navigator.push和Navigator.popFlutter中给我们提供了两种配置路由跳转的方式:1、基本路由2、命名路由Flutter中的基本路由使用想从HomePage......
  • flutter中背景图片(动态图片)
    单页面设置背景图片使用 Container 组件和 decoration 属性:优点:简单易用,适用于大多数情况下的页面背景设置。缺点:无法控制背景图片的位置和层级。classMyBookextendsStatelessWidget{constMyBook({super.key});@overrideWidgetbuild(BuildContextcontex......
  • Unity引擎2D游戏开发,野猪基本的移动逻辑和动画
    一、类的继承在Scripts下创建Enemy文件夹,里面再创建两个C#文件将Boar文件内的代码修改为以下代码,:后的是Enemy,即继承了Enemy类publicclassBoar:Enemy{}在Enemy内,编写基本属性publicclassEnemy:MonoBehaviour{[Header("基本参数")]//基本移动速度......