Flutter Demo: 径向菜单动画

import 'dart:math';
import 'package:flutter/material.dart';
import 'package:vector_math/vector_math.dart' show radians;

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        body: SizedBox.expand(
          child: RadialMenu(),
        ),
      ),
    );
  }
}

class RadialMenu extends StatefulWidget {
  @override
  _RadialMenuState createState() => _RadialMenuState();
}

class _RadialMenuState extends State<RadialMenu>
    with SingleTickerProviderStateMixin {
  AnimationController controller;

  @override
  void initState() {
    super.initState();
    controller = AnimationController(
      duration: Duration(milliseconds: 900),
      vsync: this,
    );
  }

  @override
  Widget build(BuildContext context) {
    return RadialAnimetion(
      controller: controller,
    );
  }
}

class RadialAnimetion extends StatelessWidget {
  RadialAnimetion({Key key, this.controller})
      : scale = Tween<double>(
          begin: 1.0,
          end: 0.0,
        ).animate(
          CurvedAnimation(
            parent: controller,
            curve: Curves.fastOutSlowIn,
          ),
        ),
        translation = Tween<double>(
          begin: 0.0,
          end: 100.0,
        ).animate(
          CurvedAnimation(
            parent: controller,
            curve: Curves.linear,
          ),
        ),
        rotation = Tween<double>(
          begin: 0.0,
          end: 360.0,
        ).animate(
          CurvedAnimation(
            parent: controller,
            curve: Interval(0.0, 0.8), // 到80%结束
          ),
        ),
        super(key: key);
  final AnimationController controller;
  final Animation<double> scale;
  final Animation<double> translation;
  final Animation<double> rotation;

  @override
  Widget build(BuildContext context) {
    return AnimatedBuilder(
      animation: controller,
      builder: (context, builder) {
        return Transform.rotate(
          angle: radians(rotation.value),
          child: Stack(
            alignment: Alignment.center,
            children: <Widget>[
              _buildButton(0, color: Colors.orange, icon: Icons.cloud_upload),
              _buildButton(45, color: Colors.yellow, icon: Icons.comment),
              _buildButton(90, color: Colors.pink, icon: Icons.color_lens),
              _buildButton(135, color: Colors.green, icon: Icons.date_range),
              _buildButton(180, color: Colors.blueGrey, icon: Icons.details),
              _buildButton(225,
                  color: Colors.purple, icon: Icons.do_not_disturb_on),
              _buildButton(270, color: Colors.lime, icon: Icons.drafts),
              _buildButton(315,
                  color: Colors.indigo, icon: Icons.error_outline),
              Transform.scale(
                scale: scale.value - 1,
                child: FloatingActionButton(
                  child: Icon(Icons.close),
                  onPressed: _close,
                  backgroundColor: Colors.red,
                ),
              ),
              Transform.scale(
                scale: scale.value,
                child: FloatingActionButton(
                  child: Icon(Icons.menu),
                  onPressed: _open,
                  backgroundColor: Colors.blue,
                ),
              ),
            ],
          ),
        );
      },
    );
  }

  _buildButton(double angle, {Color color, IconData icon}) {
    // 将[度]转换为弧度。
    final double rad = radians(angle);
    return Transform(
      transform: Matrix4.identity()
        ..translate(
          translation.value * cos(rad),
          translation.value * sin(rad),
        ),
      child: FloatingActionButton(
        backgroundColor: color,
        child: Icon(icon),
        onPressed: () {},
      ),
    );
  }

  _open() {
    controller.forward();
  }

  _close() {
    controller.reverse();
  }
}

原文地址:https://www.cnblogs.com/ajanuw/p/11127141.html

时间: 2024-10-16 14:25:24

Flutter Demo: 径向菜单动画的相关文章

径向菜单的制作

最终效果: 在径向菜单的制作前,首先需要知道几点知识点: Math.sin(x)      x 的正玄值.返回值在 -1.0 到 1.0 之间: Math.cos(x)    x 的余弦值.返回的是 -1.0 到 1.0 之间的数: 这两个函数中的X 都是指的“弧度”而非“角度”,弧度的计算公式为: 2*PI/360*角度,使用js表示是这样的:Math.PI/180*度数(1度=180/Math.PI) 如:30° 角度 的弧度 = 2*PI/360*30 如何计算圆的极坐标(用于计算出子菜单

【Flutter学习】之动画实现原理浅析(三)

一,概述 Flutter动画库的核心类是Animation对象,它生成指导动画的值,Animation对象指导动画的当前状态(例如,是开始.停止还是向前或者向后移动),但它不知道屏幕上显示的内容.动画类型分为两类: 补简动画(Tween),定义了开始点和结束点.时间线以及定义转换时间和速度的曲线.然后由框架计算如何从开始点过渡到结束点.Tween是一个无状态(stateless)对象,需要begin和end值.Tween的唯一职责就是定义从输入范围到输出范围的映射.输入范围通常为0.0到1.0,

Flutter 即学即用系列博客——02 一个纯 Flutter Demo 说明

前言 上一篇文章我们搭建好了 Flutter 的开发环境. Flutter 即学即用--01 环境搭建 这一篇我们通过 Flutter 的一个 Demo 来了解下 Flutter. 开发系统:MAC IDE:Android Studio 目录 1. 创建一个 Flutter 项目 第一步:主界面点击创建 Flutter 项目 第一步:如果已经打开项目,则通过 File->New->New Flutter Project... 创建 第二步:默认选择 Flutter Application 即可

【译】仿Taasky的3D翻转菜单动画实现

最终效果 最终效果 开始 首先下载并打开一个事先搭好架子的Demo,然后来分析一下.这个Demo包含一个主页和详情页,其中MenuViewController继承自UITableViewController,它主要用于展示左边侧栏,自定义的MenuItemCell中设置了每一个菜单的图标和颜色.DetailViewController为详情页,显示了每个cell点击后,对应的颜色和图标. Starter Project效果 这个教程将详细的介绍实现步骤,具体步骤如下: 整个教程将使用自动布局来实

文字菜单动画畅想

p{text-indent:2em;}前端开发whqet,csdn,王海庆,whqet,前端开发专家 本博之前曾经写过两篇博文<纯css3文字效果推荐>.<css3立体文字最佳实践>得到了大家的广泛认可,今天我们更进一步,研究一下文字菜单上可以做哪些动画,12种效果会不会由您喜欢的,来来来,开工. 本文案例演示代码我放在了codepen,速度可能有点慢,不过相信真正的前端童鞋应该喜欢codepen的强大之处. ------------------------------------

(二)实现菜单动画

在上一篇文章中,我们实现了界面的展现.如果你还没读过,请点击下面的链接: http://www.cnblogs.com/fuly550871915/p/4930470.html 贴一张上一篇文章实现的效果图吧,如下: 虽然我们将各个菜单都全部展现了出来,但是菜单的动画以及菜单的点击都还没有实现.在上一篇文章我们也分析了,如果将菜单的位置设定在红色按钮那里,然后给菜单设定补间动画,让其移动到图示位置,虽然动画实现了,会影响到点击事件.而属性动画虽然可以解决这个问题,但是它的向下兼容性不是很好,因此

flutter 下拉菜单封装

直接上代码,简单的下拉菜单封装 import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter_app/utils/CXColors.dart'; class DropDownSelect extends StatelessWidget { final String label; String value; final List<DropdownMen

圆形菜单动画

导航效果如图 HTML <!DOCTYPE html> <html > <head> <meta charset="UTF-8"> <title>CSS3 Animated buttons</title> <link href='http://fonts.googleapis.com/css?family=Hammersmith+One' rel='stylesheet' type='text/css'>

iOS-一个弹出菜单动画视图开源项目分享

类似于Tumblr发布按钮的弹出视图 使用很简单: 初始化: @property (nonatomic, strong) XWMenuPopView *myMenuPopView; - (void)viewDidLoad { [super viewDidLoad]; //将弹出菜单视图添加到主视图 _myMenuPopView = [[XWMenuPopView alloc] initWithFrame:self.view.frame]; [_myMenuPopView setMenuPopDe