Flutter 12 实现双击屏幕显示点赞爱心多种动画(AnimationIcon)效果

本文主要是使用Flutter封装一个双击屏幕显示点赞爱心UI效果,并实现了爱心Icon 透明度、缩放、旋转、渐变等动画效果。

实现效果:

实现逻辑:

1、封装FavoriteGesture(爱心手势)实现双击屏幕显示爱心Icon;

2、封装FavoriteAnimationIcon(爱心Icon)实现双击屏幕显示爱心Icon,快速双击时同时显示多个爱心Icon;

3、给FavoriteAnimationIcon增加透明度淡入淡出动画效果;

4、给FavoriteAnimationIcon增加缩放动画效果;

5、给FavoriteAnimationIcon增加旋转动画效果;

7、给FavoriteAnimationIcon增加渐变动画效果;

一、封装FavoriteGesture爱心手势

1)Stack实现多界面堆叠

实现爱心Icon显示在视频界面上层,视频界面由上层child传入,使用Stack实现多界面堆叠;

class FavoriteGesture extends StatefulWidget {static const double defaultSize = 100;final Widget child;final double size;const FavoriteGesture({super.key, this.size = defaultSize, required this.child});@overrideState<FavoriteGesture> createState() => _FavoriteGestureState();
}class _FavoriteGestureState extends State<FavoriteGesture> {@overrideWidget build(BuildContext context) {return Stack(children: [widget.child,Icon(Icons.favorite, size: widget.size, color: Colors.redAccent)],);}
}

2)GestureDetector监听双击事件

使用GestureDetector监听屏幕双击事件和点击的坐标,使用Positioned将Icon显示到点击坐标的位置;当用户双击屏幕时,显示爱心Icon,延迟600毫秒,爱心Icon消失。

class FavoriteGesture extends StatefulWidget {static const double defaultSize = 100;final Widget child;final double size;const FavoriteGesture({super.key, this.size = defaultSize, required this.child});@overrideState<FavoriteGesture> createState() => _FavoriteGestureState();
}class _FavoriteGestureState extends State<FavoriteGesture> {final GlobalKey _key = GlobalKey();bool inFavorite = false;// temp表示最近的一次双击坐标Offset temp = Offset.zero;@overrideWidget build(BuildContext context) {return GestureDetector(key: _key,onDoubleTapDown: (details) {temp = details.globalPosition;},onDoubleTap: () {setState(() {inFavorite = true;});Future.delayed(const Duration(milliseconds: 600), () {setState(() {inFavorite = false;});});},child: Stack(children: [widget.child,if (inFavorite)Positioned(top: temp.dy - widget.size / 2,left: temp.dx - widget.size / 2,child: Icon(Icons.favorite, size: widget.size, color: Colors.redAccent)),],));}
}

3)RenderBox 实现屏幕坐标转换本地坐标

onDoubleTapDown: (details) {temp = details.globalPosition;} 获取到的点击坐标是屏幕的坐标,需要转换成Icon的父布局Stack的坐标,通过RenderBox 来实现屏幕坐标转换本地坐标。

class FavoriteGesture extends StatefulWidget {static const double defaultSize = 100;final Widget child;final double size;const FavoriteGesture({super.key, this.size = defaultSize, required this.child});@overrideState<FavoriteGesture> createState() => _FavoriteGestureState();
}class _FavoriteGestureState extends State<FavoriteGesture> {final GlobalKey _key = GlobalKey();bool inFavorite = false;// temp表示最近的一次双击坐标Offset temp = Offset.zero;Offset _globalToLocal(Offset global) {RenderBox renderBox = _key.currentContext?.findRenderObject() as RenderBox;return renderBox.globalToLocal(global);}@overrideWidget build(BuildContext context) {return GestureDetector(key: _key,onDoubleTapDown: (details) {temp = _globalToLocal(details.globalPosition);},onDoubleTap: () {setState(() {inFavorite = true;});Future.delayed(const Duration(milliseconds: 600), () {setState(() {inFavorite = false;});});},child: Stack(children: [widget.child,if (inFavorite)Positioned(top: temp.dy - widget.size / 2,left: temp.dx - widget.size / 2,child: Icon(Icons.favorite, size: widget.size, color: Colors.redAccent)),],));}
}

实现效果如下:

 

二、封装FavoriteAnimationIcon 爱心Icon

1)封装FavoriteAnimationIcon

封装FavoriteAnimationIcon,将Icon坐标、大小、动效等统一封装起来,并暴露动效结束的回调接口给上层,便于清除过期的爱心Icon。

/*年轻人,只管向前看,不要管自暴自弃者的话*/import 'package:flutter/material.dart';///create by itz on 2024-10-24 14:19
///desc :
class FavoriteAnimationIcon extends StatefulWidget {// 爱心显示位置坐标final Offset position;// 爱心大小final double size;// 动效完成,Icon消失回调final Function? onAnimationComplete;const FavoriteAnimationIcon({super.key, required this.position, required this.size, this.onAnimationComplete});@overrideState<FavoriteAnimationIcon> createState() => _FavoriteAnimationIconState();
}class _FavoriteAnimationIconState extends State<FavoriteAnimationIcon> {@overridevoid initState() {// TODO: implement initStatesuper.initState();Future.delayed(const Duration(milliseconds: 600), () {widget.onAnimationComplete?.call();});}@overrideWidget build(BuildContext context) {var content = Icon(Icons.favorite, size: widget.size, color: Colors.redAccent);return Positioned(top: widget.position.dy - widget.size / 2, left: widget.position.dx - widget.size / 2, child: content);}
}

2)快速双击时,同时显示多个爱心Icon。

使用list记录双击的坐标位置,实现快速双击屏幕时,同时显示多个爱心Icon;多个爱心Icon,使用Stack实现多爱心Icon堆叠效果。

class FavoriteGesture extends StatefulWidget {static const double defaultSize = 100;final Widget child;final double size;const FavoriteGesture({super.key, this.size = defaultSize, required this.child});@overrideState<FavoriteGesture> createState() => _FavoriteGestureState();
}class _FavoriteGestureState extends State<FavoriteGesture> {final GlobalKey _key = GlobalKey();// 保存当前需要展示的iconList<Offset> iconOffsets = [];// temp表示最近的一次双击坐标Offset temp = Offset.zero;Offset _globalToLocal(Offset global) {RenderBox renderBox = _key.currentContext?.findRenderObject() as RenderBox;return renderBox.globalToLocal(global);}@overrideWidget build(BuildContext context) {var iconStack = Stack(children: iconOffsets.map((e) => FavoriteAnimationIcon(position: e,size: widget.size,onAnimationComplete: () {setState(() => iconOffsets.remove(e));},)).toList());return GestureDetector(key: _key,onDoubleTapDown: (details) {temp = _globalToLocal(details.globalPosition);},onDoubleTap: () {// 添加坐标到集合中,触发一次重绘制。根据坐标集合来在不同的坐标上渲染出iconsetState(() => iconOffsets.add(temp));},child: Stack(children: [widget.child,iconStack,],));}
}

实现效果如下:

三、透明度淡入淡出动画效果

1)Animation 动画

本节使用Animation forward 正向播放来实现淡入淡出动画效果。

2)Opacity Widget

在 Flutter 中,Opacity Widget 用于控制其子部件(child widget)的不透明度。通过设置 Opacity Widget 的 opacity 属性为一个介于 0.0(完全透明)和 1.0(完全不透明)之间的值,可以调整子部件的可见度。

3)淡入淡出动画设计

我们将爱心淡入、显示、淡出时间占比分别设计为:淡入10%、显示70%、淡出20%;这个可以自由设置。

以Icon显示但消失时间1S来计算:

淡入10% = 100ms内 实现 opacity 属性从 0.0(完全透明)和 1.0(完全不透明)的值。

显示70% = 700ms内 实现 opacity 属性值 一直等于1(完全不透明)。

淡入20% = 200ms内 实现 opacity 属性从 0.0(完全透明)和 1.0(完全不透明)的值。

class FavoriteAnimationIcon extends StatefulWidget {// 爱心显示位置坐标final Offset position;// 爱心大小final double size;// 动效完成,Icon消失回调final Function? onAnimationComplete;const FavoriteAnimationIcon({super.key, required this.position, required this.size, this.onAnimationComplete});@overrideState<FavoriteAnimationIcon> createState() => _FavoriteAnimationIconState();
}class _FavoriteAnimationIconState extends State<FavoriteAnimationIcon> with TickerProviderStateMixin {// 展示的进度值为0.1static const double appearValue = 0.1;// 消失的进度值为0.8static const double dismissValue = 0.8;static const int _duration = 600;late AnimationController _animationController;@overridevoid initState() {// TODO: implement initStatesuper.initState();_animationController = AnimationController(duration: const Duration(milliseconds: _duration),vsync: this,);// 监听动画进度变化,刷新Icon_animationController.addListener(() {setState(() {});});startAnimation();}@overridevoid dispose() {super.dispose();// 释放动画资源_animationController.dispose();}@overrideWidget build(BuildContext context) {var content = Icon(Icons.favorite, size: widget.size, color: Colors.redAccent);return Positioned(top: widget.position.dy - widget.size / 2,left: widget.position.dx - widget.size / 2,child: Opacity(opacity: opacity, child: content));}// 需要得到的结果是透明度的进度值的百分比double get opacity {if (value < appearValue) {// 处于渐进阶段,播放透明度动画return value / appearValue;}if (value < dismissValue) {// 处于展示阶段,不需要动画return 1;}// 处于渐隐阶段,播放器透明度动画return (1 - value) / (1 - dismissValue);}double get value {return _animationController.value;}Future<void> startAnimation() async {await _animationController.forward();widget.onAnimationComplete?.call();}
}

实现效果如下:

四、缩放动画效果

Transform.scale Widget

在 Flutter 中,Transform.scale Widget 用于按比例缩放其子部件(child widget)。通过设置 Transform.scale 的 scale 属性为一个倍数,可以调整子部件的缩放比例。

Icon缩放时间同上面的 淡入淡出动画设计

class FavoriteAnimationIcon extends StatefulWidget {// 爱心显示位置坐标final Offset position;// 爱心大小final double size;// 动效完成,Icon消失回调final Function? onAnimationComplete;const FavoriteAnimationIcon({super.key, required this.position, required this.size, this.onAnimationComplete});@overrideState<FavoriteAnimationIcon> createState() => _FavoriteAnimationIconState();
}class _FavoriteAnimationIconState extends State<FavoriteAnimationIcon> with TickerProviderStateMixin {// 展示的进度值为0.1static const double appearValue = 0.1;// 消失的进度值为0.8static const double dismissValue = 0.8;static const int _duration = 600;late AnimationController _animationController;@overridevoid initState() {// TODO: implement initStatesuper.initState();_animationController = AnimationController(duration: const Duration(milliseconds: _duration),vsync: this,);// 监听动画进度变化,刷新Icon_animationController.addListener(() {setState(() {});});startAnimation();}@overridevoid dispose() {super.dispose();// 释放动画资源_animationController.dispose();}@overrideWidget build(BuildContext context) {var content = Icon(Icons.favorite, size: widget.size, color: Colors.redAccent);var child = Transform.scale(scale: scale, alignment: Alignment.bottomCenter, child: content);return Positioned(top: widget.position.dy - widget.size / 2,left: widget.position.dx - widget.size / 2,child: Opacity(opacity: opacity, child: child));}// 需要得到的结果是透明度的进度值的百分比double get opacity {if (value < appearValue) {// 处于渐进阶段,播放透明度动画return value / appearValue;}if (value < dismissValue) {// 处于展示阶段,不需要动画return 1;}// 处于渐隐阶段,播放器透明度动画return (1 - value) / (1 - dismissValue);}// 需要计算缩放尺寸的占比double get scale {if (value < appearValue) {// 处于出现阶段(从1.1到1 缩小的过程)return 1 + appearValue - value;}if (value < dismissValue) {// 处于正常展示阶段return 1;}// 处于消失放大阶段return 1 + (value - dismissValue) / (1 - dismissValue);}double get value {return _animationController.value;}Future<void> startAnimation() async {await _animationController.forward();widget.onAnimationComplete?.call();}
}

实现效果如下:

五、旋转动画效果

Transform.rotate Widget

在 Flutter 中,Transform.rotate Widget 用于旋转其子部件(child widget)。通过设置 Transform.rotate 的 angle 属性为一个角度值,可以使子部件绕中心旋转指定的角度。

import 'dart:math';import 'package:flutter/material.dart';///create by itz on 2024-10-24 14:19
///desc :
class FavoriteAnimationIcon extends StatefulWidget {// 爱心显示位置坐标final Offset position;// 爱心大小final double size;// 动效完成,Icon消失回调final Function? onAnimationComplete;const FavoriteAnimationIcon({super.key, required this.position, required this.size, this.onAnimationComplete});@overrideState<FavoriteAnimationIcon> createState() => _FavoriteAnimationIconState();
}class _FavoriteAnimationIconState extends State<FavoriteAnimationIcon> with TickerProviderStateMixin {// 展示的进度值为0.1static const double appearValue = 0.1;// 消失的进度值为0.8static const double dismissValue = 0.8;static const int _duration = 600;late AnimationController _animationController;final double angle = pi / 10 * (2 * Random().nextDouble() - 1);@overridevoid initState() {// TODO: implement initStatesuper.initState();_animationController = AnimationController(duration: const Duration(milliseconds: _duration),vsync: this,);// 监听动画进度变化,刷新Icon_animationController.addListener(() {setState(() {});});startAnimation();}@overridevoid dispose() {super.dispose();// 释放动画资源_animationController.dispose();}@overrideWidget build(BuildContext context) {var content = Icon(Icons.favorite, size: widget.size, color: Colors.redAccent);// 旋转var childRotate = Transform.rotate(angle: angle, child: content);// 缩放var childScale = Transform.scale(scale: scale, alignment: Alignment.bottomCenter, child: childRotate);// 透明度var childOpacity = Opacity(opacity: opacity, child: childScale);return Positioned(top: widget.position.dy - widget.size / 2, left: widget.position.dx - widget.size / 2, child: childOpacity);}// 需要得到的结果是透明度的进度值的百分比double get opacity {if (value < appearValue) {// 处于渐进阶段,播放透明度动画return value / appearValue;}if (value < dismissValue) {// 处于展示阶段,不需要动画return 1;}// 处于渐隐阶段,播放器透明度动画return (1 - value) / (1 - dismissValue);}// 需要计算缩放尺寸的占比double get scale {if (value < appearValue) {// 处于出现阶段(从1.1到1 缩小的过程)return 1 + appearValue - value;}if (value < dismissValue) {// 处于正常展示阶段return 1;}// 处于消失放大阶段return 1 + (value - dismissValue) / (1 - dismissValue);}double get value {return _animationController.value;}Future<void> startAnimation() async {await _animationController.forward();widget.onAnimationComplete?.call();}
}

实现效果如下:

六、渐变动画效果

ShaderMask Widget

在 Flutter 中,ShaderMask Widget 用于将子部件应用一个着色器效果,可以用来创建各种视觉效果,比如颜色遮罩、渐变遮罩等。

class FavoriteAnimationIcon extends StatefulWidget {// 爱心显示位置坐标final Offset position;// 爱心大小final double size;// 动效完成,Icon消失回调final Function? onAnimationComplete;const FavoriteAnimationIcon({super.key, required this.position, required this.size, this.onAnimationComplete});@overrideState<FavoriteAnimationIcon> createState() => _FavoriteAnimationIconState();
}class _FavoriteAnimationIconState extends State<FavoriteAnimationIcon> with TickerProviderStateMixin {// 展示的进度值为0.1static const double appearValue = 0.1;// 消失的进度值为0.8static const double dismissValue = 0.8;static const int _duration = 600;late AnimationController _animationController;final double angle = pi / 10 * (2 * Random().nextDouble() - 1);@overridevoid initState() {// TODO: implement initStatesuper.initState();_animationController = AnimationController(duration: const Duration(milliseconds: _duration),vsync: this,);// 监听动画进度变化,刷新Icon_animationController.addListener(() {setState(() {});});startAnimation();}@overridevoid dispose() {super.dispose();// 释放动画资源_animationController.dispose();}@overrideWidget build(BuildContext context) {var content = Icon(Icons.favorite, size: widget.size, color: Colors.redAccent);// 缩放var childScale = Transform.scale(scale: scale, alignment: Alignment.bottomCenter, child: content);// 旋转var childRotate = Transform.rotate(angle: angle, child: childScale);// 渐变var childShaderMask = ShaderMask(blendMode: BlendMode.srcATop,shaderCallback: (Rect bounds) => RadialGradient(colors: const [Color(0xFFEE6E6E), Color(0xFFF03F3F)],center: Alignment.topLeft.add(const Alignment(0.66, 0.66))).createShader(bounds),child: childRotate);// 透明度var childOpacity = Opacity(opacity: opacity, child: childShaderMask);return Positioned(top: widget.position.dy - widget.size / 2, left: widget.position.dx - widget.size / 2, child: childOpacity);}// 需要得到的结果是透明度的进度值的百分比double get opacity {if (value < appearValue) {// 处于渐进阶段,播放透明度动画return value / appearValue;}if (value < dismissValue) {// 处于展示阶段,不需要动画return 1;}// 处于渐隐阶段,播放器透明度动画return (1 - value) / (1 - dismissValue);}// 需要计算缩放尺寸的占比double get scale {if (value < appearValue) {// 处于出现阶段(从1.1到1 缩小的过程)return 1 + appearValue - value;}if (value < dismissValue) {// 处于正常展示阶段return 1;}// 处于消失放大阶段return 1 + (value - dismissValue) / (1 - dismissValue);}double get value {return _animationController.value;}Future<void> startAnimation() async {await _animationController.forward();widget.onAnimationComplete?.call();}
}

实现效果如下: 

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

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

相关文章

【设计模式系列】抽象工厂模式

一、什么是抽象工厂模式 抽象工厂模式&#xff08;Abstract Factory Pattern&#xff09;是一种创建型设计模式&#xff0c;它提供了一个接口&#xff0c;用于创建一系列相关或相互依赖的对象&#xff0c;而无需指定它们具体的类。这种模式允许客户端使用抽象的接口来创建一组…

VoLTE 微案例:VoLTE 注册失败,I-CSCF 返回 403,HSS(UAR) 返回 5001

目录 1. 问题描述 2. 故障注册流程与正常流程对照 3. 结论 博主wx:yuanlai45_csdn 博主qq:2777137742 想要 深入学习 5GC IMS 等通信知识(加入 51学通信),或者想要 cpp 方向修改简历,模拟面试,学习指导都可以添加博主低价指导哈。 1. 问题描述

对比迁移项目的改动

文章目录 对比迁移项目的改动场景背景解决方案 对比迁移项目的改动 场景背景 同源定制化项目&#xff0c;同一套代码扩展出来的项目&#xff08;从领导口中得知&#xff09; A项目的有三维地图展示&#xff0c;项目B跑起来却加载不出来&#xff0c;但是本地运行A项目代码&…

vue-pc 实现内嵌式微信扫码登录(附完整代码)

一、准备工作 1. 注册微信开放平台账号 地址&#xff1a;&#xff08;[https://open.weixin.qq.com/](https://open.weixin.qq.com/)&#xff09; 2. 申请开发者资质认证&#xff1a; 3. 创建网站应用 4. 查看应用详情&#xff0c;拿到 AppID 、 AppSecret 和 redirect_uri (授…

如何在服务器上部署开源大模型 GLM-4-9B-Chat 并应用到RAG应用中

本地服务器部署开源大模型有一个前提&#xff0c;就是得有 GPU 显卡资源&#xff0c;在我下面的例子中我租用了 autodl 中的算力资源&#xff0c;具体是租用了一张消费级别的 RTX 3090 显卡。 环境配置 操作系统及版本&#xff1a;ubuntu 22.04CUDA 版本&#xff1a; 12.1pyto…

【MATLAB源码-第263期】基于matlab的帝企鹅优化算法(EPO)无人机三维路径规划,输出做短路径图和适应度曲线.

操作环境&#xff1a; MATLAB 2022a 1、算法描述 帝企鹅优化算法&#xff08;Emperor Penguin Optimizer&#xff0c;简称EPO&#xff09;是一种基于自然现象的优化算法&#xff0c;灵感来自于帝企鹅在南极极寒环境中的生活习性。帝企鹅是一种群居动物&#xff0c;生活在极端…

再创佳绩 | 竹云荣获“数据要素×”大赛黑龙江分赛一等奖!

近日&#xff0c;由国家数据局、黑龙江省人民政府指导&#xff0c;黑龙江省发改委、黑龙江省数据局主办的2024年“数据要素”大赛黑龙江分赛决赛盛大召开。竹云作为联合单位参与《供热数据资产登记评价中心供热数据要素综合服务平台》项目&#xff0c;荣获绿色低碳赛道一等奖。…

C++ [项目] 愤怒的小鸟

现在才发现C游戏的支持率这么高&#xff0c;那就发几篇吧 零、前情提要 此篇为 制作,由于他没有CSDN,于是由我代发 一、基本介绍 支持Dev-C5.11版本(务必调为英文输入法),基本操作看游戏里的介绍,怎么做的……懒得说,能看懂就看注释,没有的自己猜,如果你很固执……私我吧 …

基于K8S的StatefulSet部署mysql主从

StatefulSet特性 StatefulSet的网络状态 拓扑状态&#xff1a;应用的多个实例必须按照某种顺序启动&#xff0c;并且必须成组存在&#xff0c;例如一个应用中必须存在一个A Pod和两个B Pod&#xff0c;且A Pod必须先于B Pod启动的场景 存储状态&#xff1a;应用存在多个实例&…

分享Vue3中的一个路由加载函数,基于Glob导入模式,根据路径自动生成路由

哈喽&#xff0c;大家好&#xff01;我是「励志前端小黑哥」&#xff0c;我带着最新发布的文章又来了&#xff01; 专注前端领域10年&#xff0c;专门分享那些没用的前端知识&#xff01; 今天要分享的内容&#xff0c;是一段路由加载的函数代码&#xff0c;这段代码能自动读取…

Three.js实现小米 su7 压缩后的模型加载

Three.js实现小米 su7 压缩后的模型加载 预览&#xff1a; https://threehub.cn/#/codeMirror?navigationThreeJS&classifybasic&idgltfOptLoader import * as THREE from three import { OrbitControls } from three/examples/jsm/controls/OrbitControls.js impo…

复旦大学全球供应链研究中心揭牌,合合信息共话大数据赋能

10月13日&#xff0c;复旦大学全球供应链研究中心&#xff08;以下简称“中心”&#xff09;揭牌仪式在复旦大学管理学院政立院区隆重举行。我国的供应链体系庞大复杂&#xff0c;在百年未有之大变局下&#xff0c;保障产业链供应链安全已成为我国的重要战略目标。中心的设立旨…

打造企业数字化转型的未来蓝图:架构蓝图的构建与实施策略深度解析

随着数字经济的蓬勃发展&#xff0c;全球企业正在经历前所未有的变革与挑战。企业的运营模式、客户体验和市场竞争格局都在迅速变化。为了应对这些挑战&#xff0c;企业必须从战略到技术层面进行深度重塑&#xff0c;架构蓝图的构建和实施是数字化转型过程中不可或缺的工具。架…

CSS - grid制作表格

1. grid-template-columns&#xff1a;网格布局中的列的数量&#xff0c;也可以设置列的宽度 .grid-container {display: grid;grid-template-columns: 80px 200px auto 40px; }.grid-container {display: grid;grid-template-columns: auto auto auto auto;//表示所有列的宽度…

Starrocks部署前期准备

前提条件 硬件要求 CPU StarRocks 依靠 AVX2 指令集充分发挥其矢量化能力。因此&#xff0c;在生产环境中&#xff0c;强烈建议您将 StarRocks 部署于 x86 架构 CPU 的服务器上。 您可以在终端中运行以下命令来检查 CPU 是否支持 AVX2 指令集&#xff1a; cat /proc/cpuin…

高效评优:基于SpringBoot的学生奖励管理系统

1系统概述 1.1 研究背景 随着计算机技术的发展以及计算机网络的逐渐普及&#xff0c;互联网成为人们查找信息的重要场所&#xff0c;二十一世纪是信息的时代&#xff0c;所以信息的管理显得特别重要。因此&#xff0c;使用计算机来管理学生评奖评优管理系统的相关信息成为必然。…

[JAVAEE] 线程安全问题

目录 一. 什么是线程安全 二. 线程安全问题产生的原因 三. 线程安全问题的解决 3.1 解决修改操作不是原子性的问题 > 加锁 a. 什么是锁 b. 没有加锁时 c. 加锁时 d. 死锁 e. 避免死锁 3.2 解决内存可见性的问题 > volatile关键字 (易变的, 善变的) a. 不加…

古埃及象形文字在线字典

我在个人网站“小孔的埃及学站点”上推出了在线的象形文字字典&#xff0c;总共收罗了将近700条的象形文字&#xff08;词&#xff09;。在线字典的使用方法很简单&#xff0c;在网站各大版块首页的右上方会有如下图所示的查询入口。 点击文本框&#xff0c;输入中文或英文关键…

百度文心一言接入流程-java版

百度文心一言接入流程-java版 一、准备工作二、API接口调用-java三、百度Prompt工程参考资料: 百度文心一言:https://yiyan.baidu.com/百度千帆大模型:https://qianfan.cloud.baidu.com/百度千帆大模型文档:https://cloud.baidu.com/doc/WENXINWORKSHOP/index.html千tokens…

使用API有效率地管理Dynadot域名,通过域名命令删除域名服务器(NS)

前言 Dynadot是通过ICANN认证的域名注册商&#xff0c;自2002年成立以来&#xff0c;服务于全球108个国家和地区的客户&#xff0c;为数以万计的客户提供简洁&#xff0c;优惠&#xff0c;安全的域名注册以及管理服务。 Dynadot平台操作教程索引&#xff08;包括域名邮箱&…