返回顶部
首页 > 资讯 > 精选 >Flutter仿网易怎么实现广告卡片3D翻转效果
  • 652
分享到

Flutter仿网易怎么实现广告卡片3D翻转效果

2023-06-30 10:06:35 652人浏览 薄情痞子
摘要

这篇文章主要介绍“Flutter仿网易怎么实现广告卡片3D翻转效果”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Flutter仿网易怎么实现广告卡片3D翻转效果”文章能帮助大家解决问题。先看下网易新

这篇文章主要介绍“Flutter仿网易怎么实现广告卡片3D翻转效果”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Flutter仿网易怎么实现广告卡片3D翻转效果”文章能帮助大家解决问题。

    先看下网易新闻的效果:

    Flutter仿网易怎么实现广告卡片3D翻转效果

    实现思路

    1、获取各种距离

    看图:

    Flutter仿网易怎么实现广告卡片3D翻转效果

    思路: 如上图,状态栏高度和AppBar的高度我们都可以得到,屏幕的高度我们也可以得到,那么自然我们就可以计算出内容区域的高度,拿到内容区域高度我们先放到一边,接下来我们需要获取广告区域距离AppBar的距离,这是一个进行翻转核心数据,这里我们可以通过GlobalKey获取这个组件的渲染对象RenderObject并转化为RenderBox,通过RenderBox我们可以获取到这个组件在屏幕上的坐标,这样我们拿到这个坐标Y轴的值就是当前组件距离顶部的距离

    核心代码:

    // 这里我们获取相对于屏幕左上角组件的坐标y轴GlobalKey _globalKey = GlobalKey();RenderBox? renderBox =    _globalKey.currentContext?.findRenderObject() as RenderBox?;double? dy = renderBox?.localToGlobal(Offset.zero).dy;

    接下来我们就可以计算出几个关键数据:

    状态栏高度:stateHeight = MediaQuery.of(context).padding.top;已知。

    AppBar高度:appBarHeight = 56; 默认高度 已知。

    内容区域高度:contentHeight = MediaQuery.of(context).size.height - stateHeight -appBarHeight;

    假设我们广告区域的高度是200,广告组件的高度一般都是固定的。

    得出:广告上方距离顶部的最大距离:maxHeight= contentheight - 200;

    还记得我们上面获取的dy值吗,这个值是当前广告上面距离屏幕顶部的距离,那么我们就可以得出当前广告距离AppBar底部的距离: bannerY = dy - appBarHeight - stateHeight;

    同理可以得出当前广告的滑动距离:scrollY = contentheight - 200 - bannerY;

    滑动的最大距离就是:maxSrollY = contentHeight - bannerHeight;

    2、翻转

    搞定了这些数据,接下来的工作就比较简单了,我们使用TransfORM组件来进行180度的翻转就可以了,
    获取当前滑动的比例,那就是当前滑动距离/最大滑动距离,也就是 scrollY/maxHeight; 接下来我们看下Transform这个类,

    代码:

    Container(    padding: EdgeInsetsDirectional.only(        start: 20, end: 20, top: 30, bottom: 30),    height: bannerHeight,    key: _globalKey,    child: Transform(      alignment: Alignment.center, //相对于坐标系原点的对齐方式 从中间翻转      transform: Matrix4.identity()//这是一个矩阵变换类,可以对组件的坐标进行翻转,有兴趣可以了解下        ..rotateX(0)// 翻转X轴        ..rotateY(angle),// 翻转Y轴 这里需要传入角度      child: Image.asset(        "images/img.png",        fit: BoxFit.fill,      ),    ));

    通过rotateY就可以将组件绕着Y轴进行翻转,也就达到了我们想要的3D效果,上面我们得到了滑动比例,那么我们就可以用这个比例乘以PI值,刷新页面就可以了呗,接下来我们通过滑动监听将这个数字进行更新看下效果:

    核心代码:

    double h = MediaQuery.of(context).size.height; //屏幕高度RenderBox? renderBox =    _globalKey.currentContext?.findRenderObject() as RenderBox?;double? dy = renderBox?.localToGlobal(Offset.zero).dy;// 56 AppBar 高度if (dy != null) {  // 广告距离AppBar Y轴距离  var bannerY = dy - appBarHeight - stateHeight;  // 主内容区域高度  var contentHeight = h - appBarHeight - stateHeight;  if (bannerY + bannerHeight < contentHeight && bannerY > 0) {    setState(() {      //滑动的距离      angle = pi * ((contentHeight - bannerHeight - bannerY) /              (contentHeight - bannerHeight));         });  }}

    效果:

    Flutter仿网易怎么实现广告卡片3D翻转效果

    翻转效果确实实现了,不过怎么看着有点不对劲呢,这里有两个问题:

    1、划上去翻过来的图片直接镜像了。

    Flutter仿网易怎么实现广告卡片3D翻转效果

    2、当我们滑动到一半的时候,两边的宽度是一致的,3D效果不明显。

    Flutter仿网易怎么实现广告卡片3D翻转效果

    其实这两个问题都很好解决,

    第一个滑动角度问题,我们滑动到90度进行翻过来的时候只需要将角度+180度进行翻转即可。这样就相当于翻了360度,最后自然会回到原来的图片的样子。

    第二个我们需要设置Transform的一个属性..setEntry(3, 2, 0.002),让卡片翻转过程中看起来远小近大的效果。

    我们加上这两个属性再看看效果:

    Flutter仿网易怎么实现广告卡片3D翻转效果

    这样看着是不是效果就好多了。

    这里我只简单了插入了一条广告,如果有多个广告建议用一个Map对象将Key存储起来,因为一个Key只能对应一个组件。

    完整代码

    class ListViewWidgetDemo extends StatefulWidget {  @override  State<StatefulWidget> createState() {    return ListViewState();  }}class ListViewState extends State<ListViewWidgetDemo> {  List<NewsListBean> lis = <NewsListBean>[];  late ScrollController _scrollController = ScrollController();  String imageUrl =      "https://images.unsplash.com/photo-1451187580459-43490279c0fa?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=crop&w=500&q=60";  GlobalKey _globalKey = GlobalKey();  double angle = 0;  double bannerHeight = 200;  @override  void initState() {    WidgetsBinding.instance?.addPostFrameCallback((timeStamp) {      _scrollController.addListener(() {        double appBarHeight = 56;        double stateHeight = MediaQuery.of(context).padding.top;        double h = MediaQuery.of(context).size.height; //屏幕高度        RenderBox? renderBox =            _globalKey.currentContext?.findRenderObject() as RenderBox?;        double? dy = renderBox?.localToGlobal(Offset.zero).dy;        // 56 AppBar 高度        if (dy != null) {          // 广告距离AppBar Y轴距离          var bannerY = dy - appBarHeight - stateHeight;          // 主内容区域高度          var contentHeight = h - appBarHeight - stateHeight;          if (bannerY + bannerHeight < contentHeight && bannerY > 0) {            setState(() {              //滑动的距离              angle = pi *                  ((contentHeight - bannerHeight - bannerY) /                      (contentHeight - bannerHeight));              // 前半部分 0-90 后半部分 270-360              if (angle >= (pi / 2)) {                angle = angle + pi;              }            });          }        }      });    });    super.initState();    for (int i = 0; i < 40; i++) {      lis.add(NewsListBean(        i.isEven ? 0 : 1,        "资讯标题$i",        imageUrl,      ));    }    // 插入广告    lis.insert(12, NewsListBean(2, "广告", imageUrl));  }  @override  Widget build(BuildContext context) {    return Scaffold(        appBar: AppBar(          title: Text("仿网易新闻广告卡片翻转"),        ),        body: ListView.builder(            controller: _scrollController,            shrinkWrap: true,            scrollDirection: Axis.vertical,            itemCount: lis.length,            itemBuilder: (context, index) {              return _listWidget(lis[index]);            }));  }  Widget _listWidget(NewsListBean bean) {    late Widget widget;    switch (bean.type) {      case 0:        widget = Container(            height: 50,            padding: EdgeInsetsDirectional.only(start: 20),            alignment: Alignment.centerLeft,            color: Colors.blue[200],            child: Text(              bean.title,              style: TextStyle(),            ));        break;      case 1:        widget = Row(          children: [            Expanded(              child: Container(                  height: 80,                  alignment: Alignment.center,                  color: Colors.red[200],                  margin: EdgeInsets.all(10),                  child: Text(bean.title)),            ),            Image.network(              bean.image,              width: 40,              height: 40,            )          ],        );        break;      case 2:        widget = Container(            padding: EdgeInsetsDirectional.only(                start: 20, end: 20, top: 30, bottom: 30),            height: bannerHeight,            key: _globalKey,            child: Transform(              alignment: Alignment.center, //相对于坐标系原点的对齐方式              transform: Matrix4.identity()                ..setEntry(3, 2, 0.002)                ..rotateX(0)                ..rotateY(angle),              child: Image.asset(                "images/img.png",                fit: BoxFit.fill,              ),            ));        break;      default:        widget = SizedBox();        break;    }    return widget;  }}class NewsListBean {  //资讯类型 0:资讯无图 1:资讯有图 2:3d广告  final int type;  final bool isFirst;  final String title;  final String image;  NewsListBean(this.type, this.title, this.image, {this.isFirst = false});}

    关于“Flutter仿网易怎么实现广告卡片3D翻转效果”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识,可以关注编程网精选频道,小编每天都会为大家更新不同的知识点。

    --结束END--

    本文标题: Flutter仿网易怎么实现广告卡片3D翻转效果

    本文链接: https://lsjlt.com/news/328263.html(转载时请注明来源链接)

    有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

    猜你喜欢
    • Flutter仿网易实现广告卡片3D翻转效果
      目录前言实现思路1、获取各种距离2、翻转完整代码小结前言 在逛网易新闻时,发现列表中的广告在你滑动的时候会有一个3D旋转的交互引你的注意,不得不说这些产品为了让用户看广告花样百出,那...
      99+
      2024-04-02
    • Flutter仿网易怎么实现广告卡片3D翻转效果
      这篇文章主要介绍“Flutter仿网易怎么实现广告卡片3D翻转效果”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Flutter仿网易怎么实现广告卡片3D翻转效果”文章能帮助大家解决问题。先看下网易新...
      99+
      2023-06-30
    • CSS如何实现卡片3D翻转效果
      这篇文章将为大家详细讲解有关CSS如何实现卡片3D翻转效果,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。效果:代码:html:<div class="main">...
      99+
      2023-06-08
    • Android如何实现翻转动画效果(卡片翻转)
      目录前言需求一、先介绍三个插值器二、实现步骤1.效果图2.布局3.逻辑判断(是否隐藏)4.翻转动画5.bug出现6.bug解决三、源码四、总结前言 最近好友问计蒙翻转动画,恰好在大...
      99+
      2024-04-02
    • css3如何实现卡片翻转效果
      本文小编为大家详细介绍“css3如何实现卡片翻转效果”,内容详细,步骤清晰,细节处理妥当,希望这篇“css3如何实现卡片翻转效果”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。 ...
      99+
      2024-04-02
    • css怎样实现卡片图像翻转效果
      本篇文章为大家展示了css怎样实现卡片图像翻转效果,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。css翻转图片具体代码示例:   HTML代码部分<divc...
      99+
      2024-04-02
    • Android利用Camera实现中轴3D卡牌翻转效果
      在Android系统API中,有两个Camera类: android.graphics.Camera android.hardware.Camera 第二个应用...
      99+
      2022-06-06
      3d Android
    • HTML怎么实现仿拉勾网首页穿墙广告效果
      本篇内容主要讲解“HTML怎么实现仿拉勾网首页穿墙广告效果”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“HTML怎么实现仿拉勾网首页穿墙广告效果”吧! ...
      99+
      2024-04-02
    • css3中怎么实现图形3d翻转效果
      css3中怎么实现图形3d翻转效果,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。<!DOCTYPE html&...
      99+
      2024-04-02
    • 使用CSS3怎么实现一个3D翻转效果
      本篇文章给大家分享的是有关使用CSS3怎么实现一个3D翻转效果,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。第一步非常简单,我们简单画1个演示方块,为其 添加transitio...
      99+
      2023-06-08
    • 使用CSS实现卡片翻转效果的技巧
      使用CSS实现卡片翻转效果的技巧CSS是前端开发中最常用的技术之一,它不仅可以美化页面,还可以实现一些炫酷的特效。其中,卡片翻转效果是一种非常常见且具有吸引力的效果。本文将介绍如何使用CSS来实现卡片翻转效果,并提供具体的代码示例。基本结构...
      99+
      2023-11-21
      CSS卡片翻转效果
    • css怎么实现翻转图片的效果
      这篇“css怎么实现翻转图片的效果”文章,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要参考一下,对于“css怎么实现翻转图片的效果”,小编整理了以下知识点,请大家跟着小编的步伐一步...
      99+
      2024-04-02
    • 使用JetpackCompose实现翻转卡片效果流程详解
      目录介绍执行ML Kit银行卡识别输出结论如何使用 Jetpack Compose 创建翻转卡片效果 介绍 在电子商务和银行应用程序中输入卡信息是很常见的情况。我认为让用户更轻松地...
      99+
      2023-05-19
      Jetpack Compose翻转卡片 Jetpack Compose翻转效果
    • html5怎么实现图片的3D旋转效果
      本篇内容主要讲解“html5怎么实现图片的3D旋转效果”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“html5怎么实现图片的3D旋转效果”吧!   完整代码如...
      99+
      2024-04-02
    • css3怎么实现3D色子翻转特效
      本篇内容主要讲解“css3怎么实现3D色子翻转特效”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“css3怎么实现3D色子翻转特效”吧!css3使我们能够跳出2d...
      99+
      2024-04-02
    • css3怎么实现超立体3D图片侧翻倾斜效果
      这篇文章主要讲解了“css3怎么实现超立体3D图片侧翻倾斜效果”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“css3怎么实现超立体3D图片侧翻倾斜效果”吧!...
      99+
      2024-04-02
    • 怎么实现Android TV 3D卡片无限循环效果
      这篇文章主要讲解了“怎么实现Android TV 3D卡片无限循环效果”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么实现Android TV 3D卡片无限循环效果”吧!##思路自定义Vi...
      99+
      2023-06-25
    • css3怎么实现翻转效果
      这篇文章将为大家详细讲解有关css3怎么实现翻转效果,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。css3实现翻转效果的方法:1、将外层元素设置perspective;2、将第二包裹层翻转180度,同时设...
      99+
      2023-06-14
    • 利用CSS实现卡片翻转效果的方法和示例
      在现代的网页设计中,翻转效果是一种常见且炫酷的特效,可以为网页增添一份动感和交互性。利用CSS的转换属性和动画属性,我们可以轻松地实现卡片的翻转效果。本文将介绍一种基础的卡片翻转效果,并提供具体的代码示例供读者参考。卡片翻转效果是指将卡片从...
      99+
      2023-10-21
      CSS 卡片翻转 方法和示例
    • css3怎么实现麻将筛子3D翻转特效
      这篇文章主要介绍“css3怎么实现麻将筛子3D翻转特效”,在日常操作中,相信很多人在css3怎么实现麻将筛子3D翻转特效问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”css3...
      99+
      2024-04-02
    软考高级职称资格查询
    编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
    • 官方手机版

    • 微信公众号

    • 商务合作