Flutter 動畫轉(zhuǎn)場歡迎屏 concentric_transition

image

原文

https://medium.com/flutterdevs/explore-concentric-transition-in-flutter-82ef4194d3d9

代碼

https://github.com/tiamo/flutter-concentric-transition/tree/master/example

參考

正文

image

Flutter 小部件是使用現(xiàn)代框架構(gòu)建的。這就像是一種反應(yīng)。在這里,我們從小部件開始創(chuàng)建任何應(yīng)用程序。屏幕中的每個組件都是一個小部件。這個小部件描述了根據(jù)他目前的配置和狀態(tài),他的前景應(yīng)該是什么樣的。小部件展示類似于它的想法和當前的設(shè)置和狀態(tài)。

Flutter 自動化測試使您能夠滿足您的應(yīng)用程序的高響應(yīng)性,因為它有助于在您的應(yīng)用程序中發(fā)現(xiàn) bug 和各種問題。Flutter 是一個工具,開發(fā)移動,桌面,網(wǎng)絡(luò)應(yīng)用程序與代碼 & 是一個免費和開放源碼的工具。

在本文中,我們將用 Flutter concentric_transition 探索 Concentric Transition 在 Flutter。利用該軟件包,可以很容易地實現(xiàn) Flutter 啟動動畫界面 。那么讓我們開始吧。

https://pub.dev/packages/concentric_transition

Concentric Transition

Concentric Transition 插件是一個非常好的 Flutter 插件。用戶可以使用這個插件創(chuàng)建一個動畫類型的入門屏幕,并創(chuàng)建自定義動畫屏幕,如同心頁面路由器,自定義剪刀,等等,就像我們使用同心頁面,然后為我們提供動畫類型的頁面路線,將我們從一個屏幕到另一個屏幕。

image

image

image

image

image

image

特點

  • Concentric PageView 頁面
  • Concentric Clipper 剪切圖
  • Concentric PageRoute 轉(zhuǎn)場路由

依賴包

你需要分別在你的代碼中實現(xiàn)它:

  • 第一步: 添加依賴項

將依賴項添加到 pubspec ー yaml 文件。

dependencies:
  concentric_transition: ^1.0.1+1
  • 第二步: 導入包
import 'package:concentric_transition/concentric_transition.dart';
  • 第三步: 運行 Run flutter package get

加入代碼

你需要分別在你的代碼中實現(xiàn)它:

在定義 ConcentricPageView 之前,我們將創(chuàng)建一個類,在這個類中,我們將定義其標題、圖像、顏色等,如下面的代碼引用所示。

class OnboardingData {
  final String? title;
  final Image? icon;
  final Color bgColor;
  final Color textColor;

  OnboardingData({
    this.title,
    this.icon,
    this.bgColor = Colors.white,
    this.textColor = Colors.black,
  });
}

在此之后,我們將在一個列表中定義入職類數(shù)據(jù),該列表將在屏幕上顯示給我們的數(shù)據(jù)。讓我們用下面的代碼來理解一下。

final List<OnboardingData> onBoardingData = [
  OnboardingData(
    icon:Image.asset('assets/images/melon.png'),
    title: "Fresh Lemon\nfruits",
    //textColor: Colors.white,
    bgColor: Color(0xffCFFFCE),
  ),
  OnboardingData(
    icon:Image.asset('assets/images/orange.png'),
    title: "Fresh Papaya\nfruits",
    bgColor: Color(0xffFFE0E1),
  ),
  OnboardingData(
    icon:Image.asset('assets/images/papaya.png'),
    title: "Fresh Papaya\nfruits",
    bgColor: Color(0xffFCF1B5),
    //textColor: Colors.white,
  ),
];

現(xiàn)在,我們將在動畫的顏色和持續(xù)時間所在的主體中使用 ConcentricPageView 小部件。使用列小部件,我們將在一個框中顯示圖像,并在圖像下方顯示其標題。讓我們用下面的代碼來理解一下。

ConcentricPageView(
  colors: colors,
  radius: 30,
  curve: Curves.ease,
  duration: Duration(seconds: 2),
  itemBuilder: (index, value) {
    OnboardingData page = onBoardingData[index % onBoardingData.length];
    return Container(
      child: Theme(
        data: ThemeData(
          textTheme: TextTheme(
            headline6: TextStyle(
              color: page.textColor,
              fontWeight: FontWeight.w600,
              fontFamily: 'Helvetica',
              letterSpacing: 0.0,
              fontSize: 17,
            ),
            subtitle2: TextStyle(
              color: page.textColor,
              fontWeight: FontWeight.w300,
              fontSize: 18,
            ),
          ),
        ),
        child: OnBoardingPage(onboardingDataPage: page),
      ),
    );
  },
),

當我們運行應(yīng)用程序時,我們應(yīng)該得到屏幕的輸出,就像下面的屏幕截圖一樣。

image

完整代碼

import 'dart:ui';
import 'package:concentric_transition/concentric_transition.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:flutter/painting.dart';



class ConcentricPageViewDemo extends StatelessWidget {
  final List<OnboardingData> onBoardingData = [
    OnboardingData(
      icon:Image.asset('assets/images/melon.png'),
      title: "Fresh Lemon\nfruits",
      //textColor: Colors.white,
      bgColor: Color(0xffCFFFCE),
    ),
    OnboardingData(

      icon:Image.asset('assets/images/orange.png'),
      title: "Fresh Papaya\nfruits",
      bgColor: Color(0xffFFE0E1),
    ),
    OnboardingData(

      icon:Image.asset('assets/images/papaya.png'),
      title: "Fresh Papaya\nfruits",
      bgColor: Color(0xffFCF1B5),
      //textColor: Colors.white,
    ),
  ];

  List<Color> get colors => onBoardingData.map((p) => p.bgColor).toList();

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      debugShowCheckedModeBanner: false,
      home: Scaffold(
        body: ConcentricPageView(
          colors: colors,
          radius: 30,
          curve: Curves.ease,
          duration: Duration(seconds: 2),
          itemBuilder: (index, value) {
            OnboardingData page = onBoardingData[index % onBoardingData.length];
            return Container(
              child: Theme(
                data: ThemeData(
                  textTheme: TextTheme(
                    headline6: TextStyle(
                      color: page.textColor,
                      fontWeight: FontWeight.w600,
                      fontFamily: 'Helvetica',
                      letterSpacing: 0.0,
                      fontSize: 17,
                    ),
                    subtitle2: TextStyle(
                      color: page.textColor,
                      fontWeight: FontWeight.w300,
                      fontSize: 18,
                    ),
                  ),
                ),
                child: OnBoardingPage(onboardingDataPage: page),
              ),
            );
          },
        ),
      ),
    );
  }
}

class OnBoardingPage extends StatelessWidget {
  final OnboardingData onboardingDataPage;

  const OnBoardingPage({
    Key? key,
    required this.onboardingDataPage,
  }) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return Container(
      margin: EdgeInsets.symmetric(
        horizontal: 30.0,
      ),
      child: Column(
//        mainAxisAlignment: MainAxisAlignment.center,
        children: <Widget>[
          _buildPicture(context),
          SizedBox(height: 30),
          _buildText(context),
        ],
      ),
    );
  }

  Widget _buildText(BuildContext context) {
    return Text(
      onboardingDataPage.title!,
      style: Theme.of(context).textTheme.headline6,
      textAlign: TextAlign.center,
    );
  }

  Widget _buildPicture(
      BuildContext context, {
        double size = 190,
        double iconSize = 170,
      }) {
    return Container(
      width: size,
      height: size,
      decoration: BoxDecoration(
        borderRadius: BorderRadius.all(Radius.circular(60.0)),
        color: onboardingDataPage.bgColor
//            .withBlue(page.bgColor.blue - 40)
            .withGreen(onboardingDataPage.bgColor.green + 20)
            .withRed(onboardingDataPage.bgColor.red - 100)
            .withAlpha(90),
      ),
      padding:EdgeInsets.all(15),
      margin: EdgeInsets.only(
        top: 140,
      ),
      child:onboardingDataPage.icon,
    );
  }
}

class OnboardingData {
  final String? title;
  final Image? icon;
  final Color bgColor;
  final Color textColor;

  OnboardingData({
    this.title,
    this.icon,
    this.bgColor = Colors.white,
    this.textColor = Colors.black,
  });
}

Conclusion

在這篇文章中,我解釋了探索 Concentric Transition Flutter,你可以根據(jù)自己的修改和實驗,這個小介紹是從探索 Concentric Transition Flutter 從我們這邊演示。

我希望這個博客將提供您嘗試在您的 Flutter 項目探索 Concentric Transition 充分的信息。我們向您展示了什么探索 Concentric Transition 在 Flutter 是和工作在您的 Flutter 應(yīng)用,所以請嘗試它。


? 貓哥

往期

開源

GetX Quick Start

https://github.com/ducafecat/getx_quick_start

新聞客戶端

https://github.com/ducafecat/flutter_learn_news

strapi 手冊譯文

https://getstrapi.cn

微信討論群 ducafecat

系列集合

譯文

https://ducafecat.tech/categories/%E8%AF%91%E6%96%87/

開源項目

https://ducafecat.tech/categories/%E5%BC%80%E6%BA%90/

Dart 編程語言基礎(chǔ)

https://space.bilibili.com/404904528/channel/detail?cid=111585

Flutter 零基礎(chǔ)入門

https://space.bilibili.com/404904528/channel/detail?cid=123470

Flutter 實戰(zhàn)從零開始 新聞客戶端

https://space.bilibili.com/404904528/channel/detail?cid=106755

Flutter 組件開發(fā)

https://space.bilibili.com/404904528/channel/detail?cid=144262

Flutter Bloc

https://space.bilibili.com/404904528/channel/detail?cid=177519

Flutter Getx4

https://space.bilibili.com/404904528/channel/detail?cid=177514

Docker Yapi

https://space.bilibili.com/404904528/channel/detail?cid=130578

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容