Android 自定义控件
目录
Android 自定义控件
一、什么是自定义控件
二、创建自定义控件的常见方式
2.1继承现有控件(如 Button、TextView 等)
2.2直接继承 View 类
2.3组合控件
三、自定义控件的基本步骤
3.1创建一个继承自 View 或现有控件的类
3.2重写 onDraw() 方法:
3.3处理用户交互:
3.4在 XML 布局文件中使用自定义控件:
四、自定义控件的常见应用场景:
五、自定义控件的常见挑战
5.1性能问题:
5.2适配不同屏幕尺寸和分辨率:
5.3触摸事件的处理:
5.4维护和扩展:
六、总结
Android 自定义控件
一、什么是自定义控件
Android 自定义控件是指开发者根据项目需求,通过继承现有的控件或直接继承 View 类,定制开发的控件。与系统提供的标准控件相比,自定义控件通常具有更加个性化的样式、功能和行为,能够更好地满足特定的 UI 设计要求和用户体验需求。
自定义控件可以应用于各种需求,例如:自定义按钮、图表、动画效果、复杂的布局、响应特定交互等。其核心目的是增强应用的灵活性和可定制性。
二、创建自定义控件的常见方式
2.1继承现有控件(如 Button、TextView 等)
这种方式通过继承 Android 系统提供的标准控件,重写其方法来实现自定义的功能或样式。继承现有控件时,可以复用已有的控件逻辑,同时在此基础上增加额外的功能或样式。
示例:创建一个自定义的 Button
,使按钮在点击时改变颜色和背景形状:
public class MyCustomButton extends Button {
public MyCustomButton(Context context) {super(context);}
public MyCustomButton(Context context, AttributeSet attrs) {super(context, attrs);}
public MyCustomButton(Context context, AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr);}
@Overridepublic boolean performClick() {// 在按钮点击时改变背景颜色和形状setBackgroundColor(Color.GREEN);setTextColor(Color.WHITE);setText("Clicked!");return super.performClick();}
}
2.2直接继承 View
类
这种方式适用于开发完全独立的控件,通常需要重写 onDraw()
方法来绘制控件的外观,并通过 onTouchEvent()
等方法来处理用户交互。这种方式提供了最大的灵活性,可以根据需求自定义控件的整个表现和交互方式。
示例:开发一个自定义的进度条控件,绘制进度条的背景和前景,处理进度更新:
public class CircleProgressBar extends View {private Paint paint;private int progress = 0; // 默认进度为0
public CircleProgressBar(Context context) {super(context);init();}
public CircleProgressBar(Context context, AttributeSet attrs) {super(context, attrs);init();}
public CircleProgressBar(Context context, AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr);init();}
private void init() {paint = new Paint();paint.setColor(Color.BLUE);paint.setStyle(Paint.Style.FILL);paint.setAntiAlias(true);}
@Overrideprotected void onDraw(Canvas canvas) {super.onDraw(canvas);
// 绘制背景圆paint.setColor(Color.GRAY);canvas.drawCircle(getWidth() / 2, getHeight() / 2, getWidth() / 2, paint);
// 绘制进度圆paint.setColor(Color.GREEN);RectF rectF = new RectF(0, 0, getWidth(), getHeight());canvas.drawArc(rectF, -90, 360 * progress / 100, true, paint);}
// 更新进度public void setProgress(int progress) {this.progress = progress;invalidate(); // 重新绘制控件}
}
2.3组合控件
通过将多个现有控件组合在一起,创建一个新的复合控件。这种方式适用于实现更复杂的 UI 组件,通常涉及多个子控件的组合。通过这种方式,可以轻松创建灵活且富有表现力的控件。
示例:自定义一个包含 ImageView
和 TextView
的控件,用于显示图文混排的内容:
public class ImageTextView extends RelativeLayout {private ImageView imageView;private TextView textView;
public ImageTextView(Context context) {super(context);init(context);}
public ImageTextView(Context context, AttributeSet attrs) {super(context, attrs);init(context);}
private void init(Context context) {LayoutInflater.from(context).inflate(R.layout.view_image_text, this, true);imageView = findViewById(R.id.imageView);textView = findViewById(R.id.textView);}
public void setImageResource(int resId) {imageView.setImageResource(resId);}
public void setText(String text) {textView.setText(text);}
}
XML 布局文件 view_image_text.xml
:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="wrap_content"android:layout_height="wrap_content"><ImageViewandroid:id="@+id/imageView"android:layout_width="50dp"android:layout_height="50dp"android:layout_alignParentLeft="true"/>
<TextViewandroid:id="@+id/textView"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_toRightOf="@id/imageView"android:layout_alignParentTop="true"android:text="Sample Text"/>
</RelativeLayout>
三、自定义控件的基本步骤
3.1创建一个继承自 View 或现有控件的类
首先,我们需要创建一个继承 View
或其他控件类(如 Button
、TextView
等)的类,并实现必要的方法。自定义控件的基础类通常需要一个或多个构造函数来支持不同的上下文和属性。
public class MyCustomView extends View {public MyCustomView(Context context) {super(context);}
public MyCustomView(Context context, AttributeSet attrs) {super(context, attrs);}
public MyCustomView(Context context, AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr);}
}
3.2重写 onDraw() 方法:
onDraw()
方法用于绘制控件的外观。你可以在此方法中使用 Canvas
和 Paint
来绘制控件的背景、文本或其他图形元素。
@Override
protected void onDraw(Canvas canvas) {super.onDraw(canvas);// 绘制控件背景、文本、图形等Paint paint = new Paint();paint.setColor(Color.RED);canvas.drawRect(0, 0, getWidth(), getHeight(), paint);
}
3.3处理用户交互:
如果控件需要响应用户的交互,可以通过 onTouchEvent()
来处理触摸事件,或使用 setOnClickListener()
来响应点击事件。
@Override
public boolean onTouchEvent(MotionEvent event) {switch (event.getAction()) {case MotionEvent.ACTION_DOWN:// 处理按下事件break;case MotionEvent.ACTION_MOVE:// 处理移动事件break;case MotionEvent.ACTION_UP:// 处理抬起事件break;}return true;
}
3.4在 XML 布局文件中使用自定义控件:
一旦你创建了自定义控件,就可以在 XML 布局文件中使用它,像使用系统控件一样引用它。确保使用完整的类路径(如 com.example.myapp.MyCustomView
)。
<com.example.myapp.MyCustomViewandroid:layout_width="wrap_content"android:layout_height="wrap_content" />
四、自定义控件的常见应用场景:
自定义按钮、文本框、标签:
通过继承现有控件,可以改变控件的样式(如圆角、渐变色、阴影等)或者增加新的行为(如点击反馈、长按事件)。
进度条和动画控件:
自定义控件常常用于实现一些复杂的进度条或动画效果。例如,创建一个圆形进度条、加载动画,或者自定义控件来显示不同的动画效果。
图表和数据展示控件:
例如,创建自定义的柱状图、饼图、折线图等。这些控件需要复杂的绘制逻辑和数据处理,往往需要自定义控件来实现。
复杂的交互控件:
如日历控件、评分控件、滑动菜单等,这些控件通常涉及到多个子控件的配合,且需要处理复杂的交互逻辑。
多状态控件:
比如一个控件根据不同的状态显示不同的内容、颜色或动画,可以通过自定义控件来实现。这种控件在交互过程中需要动态更新外观。
五、自定义控件的常见挑战
5.1性能问题:
自定义控件通常需要进行复杂的绘制操作,过多的 onDraw()
调用可能会影响性能。可以通过减少不必要的绘制操作、缓存绘制结果来优化性能。
5.2适配不同屏幕尺寸和分辨率:
需要确保自定义控件在不同设备上能够正确显示,使用 dp
和 sp
来处理尺寸,避免硬编码像素值。
5.3触摸事件的处理:
自定义控件在处理触摸事件时,可能涉及到多点触控、滑动、长按等多种交互方式,这需要精心设计和调试。
5.4维护和扩展:
随着项目的迭代和需求的变化,自定义控件的功能可能需要不断扩展和优化。因此,开发时需要考虑控件的可维护性和可扩展性。
六、总结
Android 自定义控件为开发者提供了高度灵活的 UI 开发能力,使得应用的界面设计能够更加独特和符合需求。通过继承现有控件或直接继承 View
类,开发者可以自由地控制控件的外观和行为,从而打造个性化的控件。这种技术不仅提升了应用的用户体验,也为开发者提供了更强的开发自由度。
创建自定义控件时,需要关注性能优化、屏幕适配、交互设计等方面,确保控件能够在不同设备上平稳运行,并满足用户的交互需求。
相关文章:
Android 自定义控件
目录 Android 自定义控件 一、什么是自定义控件 二、创建自定义控件的常见方式 2.1继承现有控件(如 Button、TextView 等) 2.2直接继承 View 类 2.3组合控件 三、自定义控件的基本步骤 3.1创建一个继承自 View 或现有控件的类 3.2重写 onDraw()…...
学习笔记 --C#基础其他知识点(同步和异步)
C#中的同步和异步《一》 以下理解借鉴博客:借鉴博客地址1 异步编程(Asynchronous) 允许任务在后台执行,而不会阻塞调用线程。C#使用async和await关键字 async Task AsynchronousMethod() {// 等待异步操作完成await Task.Dela…...
药片缺陷检测数据集,8625张图片,使用YOLO,PASICAL VOC XML,COCO JSON格式标注,可识别药品是否有缺陷,是否完整
药片缺陷检测数据集,8625张图片,使用YOLO,PASICAL VOC XML,COCO JSON格式标注,可识别药品是否有缺陷,是否完整 有缺陷的标注信息: 无缺陷的标注信息 数据集下载: yolov11:https://d…...
Hive如何创建自定义函数(UDF)?
目录 1 自定义UDF函数基础 2 自定义UDF函数案例 3 创建临时函数 4 创建永久函数 1 自定义UDF函数基础 1. 内置函数:Hive 自带了一些函数...
深入理解MVCC:快照读与当前读的原理及实践
一、引言 MVCC是数据库系统中一种常见的并发控制技术,它允许多个事务同时对同一数据进行读取和修改,而不会相互干扰。在MVCC中,数据行存在多个版本,每个版本对应一个事务。本文将重点讨论MVCC中的两种读取方式:快照读…...
活动预告 |【Part1】Microsoft Azure 在线技术公开课:数据基础知识
课程介绍 参加“Azure 在线技术公开课:数据基础知识”活动,了解有关云环境和数据服务中核心数据库概念的基础知识。通过本次免费的介绍性活动,你将提升在关系数据、非关系数据、大数据和分析方面的技能。 活动时间:01 月 07 日…...
小程序笔记
1.小程序全局配置app.json {"pages":["pages/index/index","pages/logs/logs"],"window":{"backgroundTextStyle":"light","navigationBarBackgroundColor": "#fff","navigationBarTit…...
linux安装nginxs报错:openssl not found
系统: linux 版本:centOS7 nginx版本:nginx-1.20.2 linux安装nginx时 执行下面命令时报错: ./configure --with-http_stub_status_module --with-http_ssl_module --prefix/usr/local/nginxchecking for OpenSSL library ... not …...
Vite内网ip访问,两种配置方式和修改端口号教程
目录 问题 两种解决方式 结果 总结 preview.host preview.port 问题 使用vite运行项目的时候,控制台会只出现127.0.0.1(localhost)本地地址访问项目。不可以通过公司内网ip访问,其他团队成员无法访问,这是因为没…...
地理数据库Telepg面试内容整理-如何在高并发情况下保证GIS服务的高可用性?
在高并发情况下,保证 GIS 服务的高可用性是一个重要的挑战,尤其是当空间数据量巨大、请求频繁时。为了确保 GIS 服务的高可用性和稳定性,需要考虑以下几个方面: 分布式架构设计 分布式架构通过将工作负载分配到多个服务器上,能够大大提高服务的可用性和扩展性。通过设计高…...
ES中查询中参数的解析
目录 query中参数match参数match_allmatch:匹配指定参数match_phrase query中其他的参数query_stringprefix前缀查询:wildcard通配符查询:range范围查询:fuzzy 查询: 组合查询bool参数mustmust_notshould条件 其他参数 query中参数 词条查询term:它仅匹配在给定字段…...
【Java 数据结构】合并两个有序链表
🔥博客主页🔥:【 坊钰_CSDN博客 】 欢迎各位点赞👍评论✍收藏⭐ 目录 1. 题目 2. 解析 3. 代码实现 4. 小结 1. 题目 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示…...
OpenCV-Python实战(8)——图像变换
一、缩放 cv2.resize() img cv2.resize(src*,dsize*,fx*,fy*,interpolation*) img:目标图像。 src:原始图像。 dsize:(width,height)图像大小。 fx、fy:可选参数,水平/垂直方向…...
深入浅出:从入门到精通大模型Prompt、SFT、RAG、Infer、Deploy、Agent
阅读原文 渐入佳境 我们都知道,通过编写一个提示词(prompt),我们可以引导大模型生成回答,从而开启愉快的人工智能对话,比如让模型介绍一下卡皮巴拉。上边简图描述了这个过程,我们拆成两部分 pr…...
GXUOJ-算法-第二次作业(矩阵连乘、最长公共子序列、0-1背包问题、带权区间调度)
1.矩阵连(链)乘 问题描述 GXUOJ | 矩阵连乘 代码解答 #include<bits/stdc.h> using namespace std;const int N50; int m[N][N]; int p[N]; int n;int main(){cin>>n;//m[i][j] 存储的是从第 i 个矩阵到第 j 个矩阵这一段矩阵链相乘的最小…...
生态碳汇涡度相关监测与通量数据分析实践技术应用
1.以涡度通量塔的高频观测数据为例,基于MATLAB开展上机操作: 2.涡度通量观测基本概况:观测技术方法、数据获取与预处理等 3.涡度通量数据质量控制:通量数据异常值识别与剔除等 4.涡度通量数据缺失插补:结合气象数据…...
使用OpenAI、LangChain、MongoDB构建一个AI agent
LangChain真是好起来了。24年中的时候用LangChain V2差点把我气死,现在V3用起来开始真香了~ 像 ChatGPT、Gemini 和 Claude 这样的大模型已成为企业必不可少的工具。如今,几乎每家公司都希望根据自己的需求或客户群体,开发一款定制化的AI Age…...
如何在 Ubuntu 22.04 上安装并开始使用 RabbitMQ
简介 消息代理是中间应用程序,在不同服务之间提供可靠和稳定的通信方面发挥着关键作用。它们可以将传入的请求存储在队列中,并逐个提供给接收服务。通过以这种方式解耦服务,你可以使其更具可扩展性和性能。 RabbitMQ 是一种流行的开源消息代…...
【ETCD】【实操篇(十九)】ETCD基准测试实战
目录 1. 设定性能基准要求2. 使用基准测试工具基准测试命令 3. 测试不同的负载和场景4. 监控集群性能5. 评估硬件和网络的影响6. 对比性能基准7. 负载均衡和容错能力测试8. 优化与调优9. 测试在高负载下的表现总结 1. 设定性能基准要求 首先,明确集群性能的目标&am…...
HTML——29. 音频引入二
<!DOCTYPE html> <html><head><meta charset"UTF-8"><title>音频引入</title></head><body><!--audio:在网页中引入音频IE8以及之前版本不支持属性名和属性值一样,可以只写属性名src属性:指定音频文件…...
【SQLi_Labs】Basic Challenges
什么是人生?人生就是永不休止的奋斗! Less-1 尝试添加’注入,发现报错 这里我们就可以直接发现报错的地方,直接将后面注释,然后使用 1’ order by 3%23 //得到列数为3 //这里用-1是为了查询一个不存在的id,好让第一…...
InnoDB存储引擎对MVCC的实现
多版本并发控制 (Multi-Version Concurrency Control) MVCC(Multi-Version Concurrency Control),即多版本并发控制,是一种并发控制方法,主要用于数据库管理系统中实现对数据库的并发访问。以下是MVCC的详细解释&#…...
3D线上艺术展:艺术与技术的完美融合
随着数字技术的飞速发展,未来的艺术展览正逐步迈向线上线下融合的新阶段。其中,3D线上展览以其独特的魅力,成为线下展览的延伸与拓展,为艺术爱好者们开辟了全新的观赏途径。 对于艺术家和策展人而言,3D线上展览不仅打…...
EasyExcel(读取操作和填充操作)
文章目录 1.准备Read.xlsx(具有两个sheet)2.读取第一个sheet中的数据1.模板2.方法3.结果 3.读取所有sheet中的数据1.模板2.方法3.结果 EasyExcel填充1.简单填充1.准备 Fill01.xlsx2.无模版3.方法4.结果 2.列表填充1.准备 Fill02.xlsx2.模板3.方法4.结果 …...
【CSS in Depth 2 精译_095】16.3:深入理解 CSS 动画(animation)的性能
当前内容所在位置(可进入专栏查看其他译好的章节内容) 第五部分 添加动效 ✔️【第 16 章 变换】 ✔️ 16.1 旋转、平移、缩放与倾斜 16.1.1 变换原点的更改16.1.2 多重变换的设置16.1.3 单个变换属性的设置 16.2 变换在动效中的应用 16.2.1 放大图标&am…...
目前最流行的 Rust Web 框架有哪些?
目前最流行的 Rust Web 框架有哪些? 1. Actix Web:高性能之王,老牌框架 特点: 高性能:基于 Actor 模型,是目前 Rust 生态中最成熟、性能最强的 Web 框架之一。功能强大:支持 HTTP/1.x、HTTP/2、WebSocket 等,内置中间件和多种插件。社区支持广泛:拥有大量使用者,资料…...
连锁餐饮行业数据可视化分析方案
引言 随着连锁餐饮行业的迅速发展,市场竞争日益激烈。企业需要更加精准地把握运营状况、消费者需求和市场趋势,以制定科学合理的决策,提升竞争力和盈利能力。可视化数据分析可以帮助连锁餐饮企业整合多源数据,通过直观、动态的可…...
如何通过采购管理系统提升供应链协同效率?
供应链是企业运营的命脉,任何环节的延迟或失误都会对企业造成严重影响。在采购环节中,如何保证与供应商的协同效率,避免因信息不对称而导致的决策失误,是企业面临的一大挑战。采购管理系统作为数字化供应链管理的重要工具…...
1、Jmeter、jdk下载与安装
1、访问官网,点击下载Jmeter http://jmeter.apache.org/ 2、在等待期间,下载对应的Java https://www.oracle.com/cn/java/technologies/downloads/#jdk23-windows 3、全部下载好,先安装JDK : ListBuffer[BookModel] {val books new ListBuffer[BookModel](…...
Java 类加载机制
什么是类 类是现实世界的实体在计算中的映射、它将数据以及对这些数据的操作封装在一起。 类加载的定义 类加载是 JVM 运行时的一个动作、支持将 class 动态加载到 JVM 中 类加载是一种懒加载模式、按需加载。 类加载到五个过程 加载验证准备解释初始化 提一点࿰…...
Lombok是银弹?还是陷阱?
Lombok 是一个 Java 库,它通过注解简化和减少了 Java 中的样板代码(boilerplate code),例如 getter/setter 方法、构造函数、equals 和 hashCode 方法等。 对于是否将 Lombok 视为“银弹”或“陷阱”,这实际上取决于你…...
大数据技术-Hadoop(四)Yarn的介绍与使用
目录 一、Yarn 基本结构 1、Yarn基本结构 2、Yarn的工作机制 二、Yarn常用的命令 三、调度器 1、Capacity Scheduler(容量调度器) 1.1、特点 1.2、配置 1.2.1、yarn-site.xml 1.2.2、capacity-scheduler.xml 1.3、重启yarn、刷新队列 测试 向hi…...
CentOS修改docker镜像存储位置并进行数据迁移
在 CentOS 上修改 Docker 镜像存储位置并进行数据迁移是一个常见的需求。以下是一个详细的步骤指南,帮助你完成这个任务。 1. 停止 Docker 服务 首先,确保 Docker 服务已经停止,以避免在迁移过程中出现数据损坏。 sudo systemctl stop doc…...
xterm + vue3 + websocket 终端界面
xterm.js 下载插件 // xterm npm install --save xterm// xterm-addon-fit 使终端适应包含元素 npm install --save xterm-addon-fit// xterm-addon-attach 通过websocket附加到运行中的服务器进程 npm install --save xterm-addon-attach <template><div :…...
解锁 CSS:网页美化与布局的艺术
目录 一、CSS 是什么 二、CSS 的作用 三、CSS 的应用方式(引用方式) 四、选择器:如何挑选要 “打扮” 的元素 五、CSS 属性:丰富多样的 “服装款式” 字体属性: 文本属性:只能控制文字的相关样式。 …...
AWS K8s 部署架构
Amazon Web Services(AWS)提供了一种简化的Kubernetes(K8s)部署架构,使得在云环境中管理和扩展容器化应用变得更加容易。这个架构的核心是AWS EKS(Elastic Kubernetes Service),它是…...
【鸿蒙NEXT】鸿蒙里面类似iOS的Keychain——关键资产(@ohos.security.asset)实现设备唯一标识
前言 在iOS开发中Keychain 是一个非常安全的存储系统,用于保存敏感信息,如密码、证书、密钥等。与 NSUserDefaults 或文件系统不同,Keychain 提供了更高的安全性,因为它对数据进行了加密,并且只有经过授权的应用程序才…...
电子电器架构 --- HUD的工作原理
我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 所谓鸡汤,要么蛊惑你认命,要么怂恿你拼命,但都是回避问题的根源,以现象替代逻辑,以情绪代替思考,把消极接受现实的懦弱,伪装成乐观面对不幸的…...
C# 窗体应用程序嵌套web网页,基于谷歌浏览器内核(含源码)
有一个winform项目,需要借助一个web项目来显示,并且对web做一些操作,web页目是需要用谷歌内核,基于谷歌 Chromium项目的开源Web Browser控件来开发写了一个demo。 安装步骤 第一步:右键项目,点击 管理NuGet程序包 , 输…...
FFmpeg 中 examples 使用教程
FFmpeg 中 examples FFmpeg 的 examples 目录包含了一系列示例程序,旨在展示如何使用 FFmpeg 的不同库和 API。这些示例涵盖了多种功能,包括音视频编解码、格式转换、过滤、网络传输等。以下是一些常见的示例程序及其功能介绍: 音频和视频解码: 示例程序展示了如何打开音视…...
自动化办公-合并多个excel
在日常的办公自动化工作中,尤其是处理大量数据时,合并多个 Excel 表格是一个常见且繁琐的任务。幸运的是,借助 Python 语言中的强大库,我们可以轻松地自动化这个过程。本文将带你了解如何使用 Python 来合并多个 Excel 表格&#…...
Docker搭建MySQL
Docker搭建MySQL 准备工作 先准备配置目录和持久化目录,举个栗子:mkdir -p /opt/module/mysql/{conf,data,log}准备配置文件*.cnf,放到/opt/module/mysql/conf目录下。当然不准备也没事,容器中有个默认配置:/etc/mysql/conf.d/m…...
亚马逊国际站商品爬虫:Python实战指南
在数字化时代,数据的价值不言而喻。对于电商领域而言,获取竞争对手的商品信息、价格、评价等数据,对于市场分析和策略制定至关重要。本文将带你了解如何使用Python编写爬虫,以亚马逊国际站为例,按照关键字搜索并获取商…...
pwntools用法
pwntools 是一个Python库, 用于编写二进制漏洞利用(exploitation)脚本 功能: 远程连接和本地连接: 支持通过TCP/UDP连接远程服务或与本地进程进行交互。Shellcode和ROP链构造: 提供了便捷的工具来生成和利…...
企业云盘怎么选?2024年免费版9款整理
文章介绍了以下9大企业云盘:1.亿方云;2.Worktile;3.百度网盘;4.腾讯云盘;5.阿里云盘;6.金山云盘;7.Dropbox;8.Box。 在企业日常管理中,文件存储和共享一直是个不小的难题…...
Linux之ARM(MX6U)裸机篇----5.仿stm32的LED驱动实验
一,启动文件 .global _start .global _bss_start /* 类似宏定义把__bss_start定义为_bss_start */ _bss_start:.word __bss_start.global _bss_end _bss_end:.word __bss_end_start:#设置处理器进入SVC模式mrs r0, cpsr /* 读取cpsr到r0 */bic r0, r0, …...
Qt从入门到入土(七)-实现炫酷的登录注册界面(下)
前言 Qt从入门到入土(六)-实现炫酷的登录注册界面(上)主要讲了如何使用QSS样式表进行登录注册的界面设计,本篇文章将介绍如何对登录注册界面进行整体控件的布局,界面的切换以及实现登录、记住密码等功能。…...
如何进行年度工作回顾?
发生了什么事? 什么事情进展顺利 ? 什么事情进展不顺利? 如何适应未来? 年度回顾的定义:这是一种战略工具,能帮助人们清晰看到过去一年对业务、职业或个人生活的影响,可用于明确关键事件、找出问…...
spring默认线程池SimpleAsyncTaskExecutor特点为什么要尽量避免使用
在 Spring Boot 中,默认的线程池配置由 TaskExecutionAutoConfiguration 类提供,使用的是 SimpleAsyncTaskExecutor。 SimpleAsyncTaskExecutor特点 每次调用创建新线程: SimpleAsyncTaskExecutor 每次执行任务时都会创建一个新线程…...