flutter显示出底部控件的引导页

需求:同一个页面的两个不同的入口,同一个控件的位置有变化,显示引导页时对应这个控件的引导内容的位置也需要改变;同时半透明底部显示出真实的页面内容。
这样的需要如果切图然后再往页面上贴位置无法精确的对准。
思路:先绘制一层半透明遮罩覆盖页面,在需要显示的控件位置绘制为全透明,然后再将引导内容绘制在遮罩上面(共有三层,真实页面、透明遮罩。控件对应的那些说明内容),获取控件的位置确定在哪里全透明。

入口一进入时:
在这里插入图片描述
入口二进入时:
在这里插入图片描述

import 'package:common/sp_util.dart';
import 'package:jade/configs/CommonConfig.dart';
import 'package:jade/configs/PathConfig.dart';
import 'package:jade/utils/JadeColors.dart';
import 'package/jade/utils/Utils.dart';
import 'package:util/navigator_util.dart';
import 'package:flutter/material.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
/*
* 引导页
* */
class SharedPurchaseGuidePage extends StatelessWidget {final double width;final double height;final Offset offset;const SharedPurchaseGuidePage({this.width,this.height,this.offset});Widget build(BuildContext context) {return WillPopScope(child: Stack(children: [CustomPaint(size: Size(Utils().screenWidth(context), Utils().screenHeight(context)), // 自定义Widget的大小painter: MyCustomPainter(width,height,offset),),Positioned(left: offset.dx + width,top: offset.dy,child: _leftView(context))],),onWillPop: () async => false,);}_leftView(context){return Container(width: Utils().screenWidth(context) * 0.68,height: 210.w,padding: EdgeInsets.symmetric(vertical: 28.w),decoration: BoxDecoration(image: DecorationImage(image: AssetImage(PathConfig.imageSharedPurchaseGuideBg),fit: BoxFit.fill)),child: Column(crossAxisAlignment: CrossAxisAlignment.end,children: [Row(mainAxisAlignment: MainAxisAlignment.end,children: [Text('点击了解共享购',style: TextStyle(color: Colors.white,fontSize: 28.sp,fontWeight: FontWeight.w600)),SizedBox(width: 54.w),GestureDetector(child: Container(width: 100.w,height: 40.w,alignment: Alignment.center,margin: EdgeInsets.only(right: 20.w),decoration: BoxDecoration(color: Colors.white,borderRadius: BorderRadius.circular(20),),child: Text('知道了',style: TextStyle(color: JadeColors.blue,fontSize: 22.sp,fontWeight: FontWeight.w600),),),onTap: (){SpUtil.putBool(CommonConfig.havePostDetailSharedPurchaseGuide, true);NavigatorUtil.pop();},)],),Container(margin: EdgeInsets.only(right: 20.w,top: 26.w),child: Text('为促进交易,本版块加入了独特的共\n享购功能,与传统的团购与拼单很不\n一样,欢迎体验!',style: TextStyle(color: Colors.white,fontSize: 22.sp)))],),);}
}class MyCustomPainter extends CustomPainter {final double width;final double height;final Offset offset;const MyCustomPainter(this.width,this.height,this.offset);void paint(Canvas canvas, Size size) {//背景Paint backgroundPaint = Paint()..color = Colors.black45..style = PaintingStyle.fill;//添加背景一个路径Path path = Path()..addRect(Rect.fromLTWH(0, 0, size.width, size.height));//留白的圆角矩形路径Path holePath = Path()// ..addRect(Rect.fromLTWH(offset.dx, offset.dy, width, height));..addRRect(RRect.fromRectAndRadius(Rect.fromLTWH(offset.dx-5, offset.dy, width+5, height), Radius.circular(5)));Path combinedPath = Path.combine(PathOperation.difference, path, holePath);canvas.drawPath(combinedPath, backgroundPaint);}bool shouldRepaint(covariant CustomPainter oldDelegate) {return false; // 不需要重绘,因为我们只是绘制一次,并没有动画或状态更改}
}
GlobalKey _sharedPurchaseKey = new GlobalKey();
//需要全透明的控件
Row(key: _sharedPurchaseKey,children: [Text(S.current.sharedPurchase,style: TextStyle(color: JadeColors.blue,fontSize: 24.sp,fontWeight: FontWeight.bold)),GestureDetector(child: Container(color: Colors.transparent,padding: EdgeInsets.all(4),child: Image.asset(PathConfig.iconQuestion,width: 34.w,height: 34.w),),onTap: (){NavigatorUtil.push(SharedPurchaseDesc());},),],),//获取共享购文字加问号的坐标,跳转(这个方法需要在页面加载完成后调用)_getOffset() {if(_sharedPurchaseKey.currentContext != null){_sharedPurchaseWidth = _sharedPurchaseKey.currentContext.size.width;_sharedPurchaseHeight = _sharedPurchaseKey.currentContext.size.height;_offset = WidgetUtil.getWidgetLocalToGlobal(_sharedPurchaseKey.currentContext);bool sharedPurchaseGuide = SpUtil.getBool(CommonConfig.havePostDetailSharedPurchaseGuide,defValue: false);if(!sharedPurchaseGuide){//跳转一个透明页面NavigatorUtil.pushTransparentRoute(SharedPurchaseGuidePage(width: _sharedPurchaseWidth,height: _sharedPurchaseHeight,offset: _offset));}}}///Get the coordinates of the widget on the screen.Widgets must be rendered completely.///获取widget在屏幕上的坐标,widget必须渲染完成static Offset getWidgetLocalToGlobal(BuildContext context) {RenderBox box = context.findRenderObject();return box == null ? Offset.zero : box.localToGlobal(Offset.zero);}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/162814.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C语言基础

gcc编译hello world windows环境下编译C程序,其可执行文件后缀为.exe; 而Linux环境下也就是用gcc编译时可执行文件默认后缀名为.out。 从C源程序到成为可执行文件中间所要经历的步骤: C源文件 - 预处理 - 编译 - 汇编 - 链接 - 可执行文件 使…

浅述边缘计算场景下的云边端协同融合架构的应用场景示例

云计算正在向一种更加全局化的分布式节点组合形态进阶,而边缘计算是云计算能力向边缘侧分布式拓展的新触角。随着城市建设进程加快,海量设备产生的数据,若上传到云端进行处理,会对云端造成巨大压力。如果利用边缘计算来让云端的能…

breach1靶机攻略

breach1 准备 这个靶机ip固定为 192.168.110.140 使用vmware的话,将它加入一张仅主机的网卡就行,比如vmnet7,然后vmnet设置成192.168.110.0网段,kali也新建一张网卡加入该网卡 扫描 nmap --min-rate 10000 -p- 192.168.110.1…

rwkv模型lora微调之accelerate和deepspeed训练加速

目录 一、rwkv模型简介 二、lora原理简介 三、rwkv-lora微调 1、数据整理 2、环境搭建 a、Dockerfile编写 b、制造镜像 c、容器启动 3、训练代码修改 四、模型推理 1、模型推理 2、lora权重合并 3、推理web服务 五、总结 由于业务采用的ChatGLM模型推理成本太大了…

【JAVA学习笔记】63 -坦克大战1.3-敌方发射子弹,击中坦克消失并爆炸,敌人坦克随机移动,规定范围限制移动

项目代码 https://github.com/yinhai1114/Java_Learning_Code/tree/main/IDEA_Chapter18/src/com/yinhai/tankgame1_3 〇、要求 增加功能 1.让敌人的坦克也能够发射子弹(可以有多颗子弹) 2.当我方坦克击中敌人坦克时,敌人的坦克就消失,如果能做出爆炸效果更好. …

pytest中的pytest.ini

[pytest] filterwarnings ignore::DeprecationWarning addopts -v -s markers uat:1 smok:2 log_cli1 xfail_strict True filterwarnings ignore::DeprecationWarning 这个的功能就是 test_login.py::Test_login::test_login_correct_password PASSEDwarnings summary …

【复盘】记录一次JVM 异常问题 java.lang.OutOfMemoryError: unable to create new native thread

背景是最新运营提了一个需求,需要根据用户信息拉去三分机构的信贷数据,需要达到一天百万级别,但是经过实际测试,也只能达到40W量级,具体就是通过起多个Spring Boot项目,每个项目1S拉一个用户,基…

《Webpack 5 基础配置》- 禁止在出现编译错误或警告时,覆盖浏览器全屏显示

Webpack5 overlay 配置地址默认编译错误或警告为 true,即浏览器全屏显示;overlay 属性可以是 boolean 型,也可是 object 类型;还有其它设置说明,详见上述官网地址; module.exports {devServer: {client: {…

【使用Python编写游戏辅助工具】第二篇:键盘监听的应用

前言 这里是【使用Python编写游戏辅助工具】的第二篇:键盘监听的应用。本文主要介绍使用Python实现事件监听功能。 键盘监听是指通过编程的方式监控用户在键盘上的按键操作。 在这里键盘监听的主要用途是: 监听我们按下的按键,如果按下了指…

找出字符串中第一个匹配项的下标

给你两个字符串 haystack 和 needle ,请你在 haystack 字符串中找出 needle 字符串的第一个匹配项的下标(下标从 0 开始)。如果 needle 不是 haystack 的一部分,则返回 -1 。 示例 1: 输入:haystack “s…

【MongoDB】索引 - 复合索引

一、准备工作 这里准备一些学生数据 db.students.insertMany([{ _id: 1, name: "张三", age: 20, class: { id: 1, name: "1班" }},{ _id: 2, name: "李四", age: 22, class: { id: 2, name: "2班" }},{ _id: 3, name: "王五…

docker存储卷

docker存储卷 COW机制 Docker镜像由多个只读层叠加而成,启动容器时,Docker会加载只读镜像层并在镜像栈顶部添加一个读写层。 如果运行中的容器修改了现有的一个已经存在的 文件,那么该文件将会从读写层下面的只读层复制到读写层&#xff0…