Flutter-更改TabBarView的动画

时间:2018-10-19 09:29:58

标签: flutter flutter-layout flutter-animation

我用DeafualtTabController实现了基本的TabBar和TabBarView,请参见下面的代码。

class MyApp2 extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return DefaultTabController(
      length: BOTTOM_TABS,
      child: Scaffold(
        appBar: AppBar(title: const Text('Bottom App Bar')),
        body: _tabBarView(),
        bottomNavigationBar: _bottomTabBar(),
      ),
    );
  }

  _tabBarView() {
    return TabBarView(
      physics: NeverScrollableScrollPhysics(),
      children: [
        Container(
          color: Colors.blue,
        ),
        Container(
          color: Colors.orange,
        ),
        Container(
          color: Colors.lightGreen,
        ),
        Container(
          color: Colors.red,
        ),
      ],
    );
  }

  _bottomTabBar() {
    return TabBar(
      tabs: [
        Tab(
          icon: new Icon(Icons.home),
        ),
        Tab(
          icon: new Icon(Icons.public),
        ),
        Tab(
          icon: new Icon(Icons.group),
        ),
        Tab(
          icon: new Icon(Icons.person),
        )
      ],
    );
  }
}

效果很好!现在,我要从默认动画更改两个选项卡之间的动画。但是我找不到简单的方法。

经过一些研究,似乎我需要使用自定义TabController并以某种方式使用其animateTo方法。对我来说,改变动画似乎是一个很大的改变。 我想知道这是否是正确的方法,或者我是否缺少一些更简单的方法来仅更改选项卡视图之间的默认动画?

如果有人可以给我一些很好的资源来指出正确的方向,我将不胜感激。

2 个答案:

答案 0 :(得分:5)

这并不困难,只需使用TabController(这样做需要使用SingleTickerProviderStateMixin)和AnimatedBuilder。

enter image description here

class MyApp2 extends StatefulWidget {
  @override
  _MyApp2State createState() => _MyApp2State();
}

class _MyApp2State extends State<MyApp2> with SingleTickerProviderStateMixin {
  TabController _tabController;

  @override
  void initState() {
    _tabController = TabController(length: 4, vsync: this);
    super.initState();
  }

  _tabBarView() {
    return AnimatedBuilder(
      animation: _tabController.animation,
      builder: (BuildContext context, snapshot) {
        return Transform.rotate(
          angle: _tabController.animation.value * pi,
          child: [
            Container(
              color: Colors.blue,
            ),
            Container(
              color: Colors.orange,
            ),
            Container(
              color: Colors.lightGreen,
            ),
            Container(
              color: Colors.red,
            ),
          ][_tabController.animation.value.round()],
        );
      },
    );
  }

  _bottomTabBar() {
    return TabBar(
      controller: _tabController,
      labelColor: Colors.black,
      tabs: [
        Tab(
          icon: new Icon(Icons.home),
        ),
        Tab(
          icon: new Icon(Icons.public),
        ),
        Tab(
          icon: new Icon(Icons.group),
        ),
        Tab(
          icon: new Icon(Icons.person),
        )
      ],
    );
  }

  @override
  Widget build(BuildContext context) {
    return DefaultTabController(
      length: 4,
      child: Scaffold(
        appBar: AppBar(title: const Text('Bottom App Bar')),
        body: _tabBarView(),
        bottomNavigationBar: _bottomTabBar(),
      ),
    );
  }
}

答案 1 :(得分:0)

我不知道您是否要完全更改动画。

但是,如果仅需要一些自定义,是否尝试使用DefaultTabController而不是tabController? 您只需要将TabBar作为参数传递给TabBarViewtabController

要使用tabController自定义动画,应为animateTo指定一个Animation,还应使用tabController的{​​{1}}功能来指定曲线和持续时间。

https://api.flutter.dev/flutter/material/TabController/animateTo.html https://api.flutter.dev/flutter/material/TabController-class.html