You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Flutter中实现三面翻转容器?flip_card包仅支持正反两面

实现三面翻转容器效果

因为flip_card包仅支持正反两面,我们可以直接使用Flutter的内置动画和变换组件来实现三面翻转效果。以下是完整的实现方案:

核心思路

通过Stack放置三个代表不同面的容器,利用Transform添加3D透视效果,配合AnimationController实现平滑的Y轴旋转动画,每次点击切换到下一个面。

完整代码实现

import 'package:flutter/material.dart';
import 'dart:math';

class ThreeSidedFlipCard extends StatefulWidget {
  const ThreeSidedFlipCard({super.key});

  @override
  State<ThreeSidedFlipCard> createState() => _ThreeSidedFlipCardState();
}

class _ThreeSidedFlipCardState extends State<ThreeSidedFlipCard> with SingleTickerProviderStateMixin {
  late AnimationController _controller;
  late Animation<double> _rotationAnimation;
  int _currentSide = 0;
  // 自定义三个面的颜色,可替换为任意Widget
  final List<Color> _sideColors = [Colors.redAccent, Colors.greenAccent, Colors.blueAccent];

  @override
  void initState() {
    super.initState();
    // 初始化动画控制器,设置翻转时长
    _controller = AnimationController(
      duration: const Duration(milliseconds: 800),
      vsync: this,
    );
    _rotationAnimation = Tween<double>(begin: 0, end: 0).animate(
      CurvedAnimation(parent: _controller, curve: Curves.easeInOut)
    );
  }

  @override
  void dispose() {
    _controller.dispose();
    super.dispose();
  }

  // 切换到下一个面的逻辑
  void _flipToNextSide() {
    setState(() {
      _currentSide = (_currentSide + 1) % 3;
      // 计算目标旋转角度(120度的弧度值)
      final double targetAngle = _currentSide * (2 * pi / 3);
      _rotationAnimation = Tween<double>(
        begin: _rotationAnimation.value,
        end: targetAngle
      ).animate(
        CurvedAnimation(parent: _controller, curve: Curves.easeInOut)
      );
    });
    _controller.reset();
    _controller.forward();
  }

  @override
  Widget build(BuildContext context) {
    return GestureDetector(
      onTap: _flipToNextSide,
      child: AnimatedBuilder(
        animation: _rotationAnimation,
        builder: (context, child) {
          return Transform(
            // 添加透视效果,数值越小透视越强
            transform: Matrix4.identity()
              ..setEntry(3, 2, 0.001)
              ..rotateY(_rotationAnimation.value),
            alignment: Alignment.center,
            child: Stack(
              children: [
                // 第一个面(初始正面)
                Transform(
                  transform: Matrix4.identity()..rotateY(0),
                  alignment: Alignment.center,
                  child: _buildSide(0),
                ),
                // 第二个面(旋转120度)
                Transform(
                  transform: Matrix4.identity()..rotateY(2 * pi / 3),
                  alignment: Alignment.center,
                  child: _buildSide(1),
                ),
                // 第三个面(旋转240度)
                Transform(
                  transform: Matrix4.identity()..rotateY(4 * pi / 3),
                  alignment: Alignment.center,
                  child: _buildSide(2),
                ),
              ],
            ),
          );
        },
      ),
    );
  }

  // 构建单个面的Widget,可自定义内容
  Widget _buildSide(int index) {
    return Container(
      width: 200,
      height: 300,
      decoration: BoxDecoration(
        color: _sideColors[index],
        borderRadius: BorderRadius.circular(16),
        boxShadow: [
          BoxShadow(
            color: Colors.black.withOpacity(0.3),
            blurRadius: 8,
            offset: const Offset(0, 4),
          ),
        ],
      ),
      child: Center(
        child: Text(
          '第${index + 1}面',
          style: const TextStyle(
            color: Colors.white,
            fontSize: 24,
            fontWeight: FontWeight.bold,
          ),
        ),
      ),
    );
  }
}

// 测试用的主函数
void main() {
  runApp(const MaterialApp(
    home: Scaffold(
      backgroundColor: Colors.grey[200],
      body: Center(child: ThreeSidedFlipCard()),
    ),
  ));
}

自定义说明

  • 修改面的内容:修改_buildSide方法,可将纯色容器替换为图片、表单或任意自定义Widget。
  • 调整翻转速度:修改AnimationController的duration参数,数值越小翻转越快。
  • 增强/减弱3D效果:调整Matrix4.setEntry(3,2, 0.001)中的数值,数值越小透视效果越强。
  • 修改面的数量:如果需要更多面,只需增加_sideColors的元素数量,调整旋转角度的计算逻辑(将2*pi/3改为2*pi/n,n为面的数量)。

内容的提问来源于stack exchange,提问作者Afthal Ad

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 12:02:43