Android 纵向双选日历
这个日历的布局分两部分,一部分是显示星期几的LinearLayout,另外就是一个RecyclerView,负责纵向滚动了。
工具类:
implementation 'com.blankj:utilcode:1.17.3'
上activity_calendar代码:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"><LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="horizontal"><TextViewandroid:layout_width="0dp"android:layout_height="wrap_content"android:layout_weight="1"android:gravity="center"android:padding="5dp"android:text="日" /><TextViewandroid:layout_width="0dp"android:layout_height="wrap_content"android:layout_weight="1"android:gravity="center"android:padding="5dp"android:text="一" /><TextViewandroid:layout_width="0dp"android:layout_height="wrap_content"android:layout_weight="1"android:gravity="center"android:padding="5dp"android:text="二" /><TextViewandroid:layout_width="0dp"android:layout_height="wrap_content"android:layout_weight="1"android:gravity="center"android:padding="5dp"android:text="三" /><TextViewandroid:layout_width="0dp"android:layout_height="wrap_content"android:layout_weight="1"android:gravity="center"android:padding="5dp"android:text="四" /><TextViewandroid:layout_width="0dp"android:layout_height="wrap_content"android:layout_weight="1"android:gravity="center"android:padding="5dp"android:text="五" /><TextViewandroid:layout_width="0dp"android:layout_height="wrap_content"android:layout_weight="1"android:gravity="center"android:padding="5dp"android:text="六" /></LinearLayout><androidx.recyclerview.widget.RecyclerViewandroid:id="@+id/recycler_view"android:layout_width="match_parent"android:layout_height="match_parent"android:overScrollMode="never" />
</LinearLayout>
接下来是CalendarActivity
- 计算数据
- 可以扩展日历的点击事件和范围选择事件
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.GridLayoutManager;
import androidx.recyclerview.widget.RecyclerView;import com.blankj.utilcode.constant.TimeConstants;
import com.blankj.utilcode.util.TimeUtils;import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;
import java.util.Locale;public class CalendarActivity extends AppCompatActivity {private RecyclerView recyclerView;private CalendarRangeAdapter calendarRangeAdapter;/*** 最大月份数*/private int maxMonth = 12;private List<DateBean> dateList = new ArrayList<>();private List<DateBean> allDateList = new ArrayList<>();private Handler handler = new Handler(Looper.getMainLooper()) {@Overridepublic void handleMessage(Message msg) {initView();super.handleMessage(msg);}};@Overrideprotected void onCreate(@Nullable Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_calendar);recyclerView = findViewById(R.id.recycler_view);new Thread() {@Overridepublic void run() {initData();};}.start();}private void initView() {GridLayoutManager manager = new GridLayoutManager(CalendarActivity.this, 7);manager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {@Overridepublic int getSpanSize(int position) {return allDateList.get(position).getType() == 0 ? 7 : 1;}});recyclerView.setLayoutManager(manager);calendarRangeAdapter = new CalendarRangeAdapter(CalendarActivity.this, allDateList);recyclerView.setAdapter(calendarRangeAdapter);calendarRangeAdapter.setOnItemSelect(new CalendarRangeAdapter.OnItemSelect() {@Overridepublic void onItemClick(int position) {}@Overridepublic void onItemRangeSelect(String startDate, String endDate) {System.out.println(startDate + "~" + endDate);}});}private void initData() {for (int i = 0; i < maxMonth; i++) {Calendar calendar = Calendar.getInstance();calendar.add(Calendar.MONTH, i);int year = calendar.get(Calendar.YEAR);int month = calendar.get(Calendar.MONTH) + 1;int maxDays = calendar.getActualMaximum(Calendar.DAY_OF_MONTH);SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd", Locale.CHINA);String dateString = simpleDateFormat.format(calendar.getTime());DateBean monthBean = new DateBean();monthBean.setDate(dateString.substring(0, 7));monthBean.setCanSelect(false);monthBean.setType(0);dateList.clear();dateList.add(monthBean);calendar.set(Calendar.DAY_OF_MONTH, 1);//当月第一天是周几 0是周日,1是周一 以此类推int dayOfWeek = calendar.get(Calendar.DAY_OF_WEEK);//填充1号前面的空白for (int j = 0; j < dayOfWeek - 1; j++) {DateBean dateBean = new DateBean();dateBean.setCanSelect(false);dateBean.setType(1);dateBean.setDate("");dateList.add(dateBean);}for (int j = 0; j < maxDays; j++) {DateBean dateBean = new DateBean();dateBean.setType(1);dateBean.setCenterString(String.valueOf(j + 1));dateBean.setSelect(true);dateBean.setDate(year + "-" + addZero(month) + "-" + addZero(j + 1));//今天之前不可选中if (TimeUtils.getTimeSpanByNow(dateBean.getDate(), new SimpleDateFormat("yyyy-MM-dd", Locale.CHINA), TimeConstants.DAY) < 0) {dateBean.setCenterString(String.valueOf(j + 1));dateBean.setCanSelect(false);} else {if (TimeUtils.getTimeSpanByNow(dateBean.getDate(), new SimpleDateFormat("yyyy-MM-dd", Locale.CHINA), TimeConstants.DAY) > 0) {dateBean.setCenterString(String.valueOf(j + 1));} else {dateBean.setCenterString("今天");}dateBean.setCanSelect(true);}dateList.add(dateBean);}allDateList.addAll(dateList);}Message msg = handler.obtainMessage();handler.sendMessage(msg);}private String addZero(int text) {if (text < 10) {return "0" + text;} else {return "" + text;}}
}
上CalendarRangeAdapter代码(根据bean属性操作):
- 根据类型,填充月布局和日布局。
- 包含点击、范围选择的方法
public class CalendarRangeAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {private Context context;private List<DateBean> list;private int[] selectRange = new int[2];private final int TYPE_MONTH = 0;private final int TYPE_DAY = 1;public CalendarRangeAdapter(Context context, List<DateBean> list) {this.context = context;this.list = list;initSelect();}public void initSelect() {clearSelect();}public void clearSelect() {for (int i = 0; i < list.size(); i++) {list.get(i).setSelect(false);list.get(i).setSelectRange(false);list.get(i).setBottomString("");}selectRange[0] = -1;selectRange[1] = -1;}public void notifySelect() {notifyDataSetChanged();}public void setData(List<DateBean> list) {this.list = list;notifyDataSetChanged();}@NonNull@Overridepublic RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {RecyclerView.ViewHolder holder = null;if (viewType == 0) {//月份View view = LayoutInflater.from(context).inflate(R.layout.item_month,parent, false);holder = new MonthViewHolder(view);} else {//日期View view = LayoutInflater.from(context).inflate(R.layout.item_day,parent, false);holder = new DayViewHolder(view);}return holder;}@Overridepublic void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {final int fPosition = holder.getAdapterPosition();if (holder instanceof MonthViewHolder) {((MonthViewHolder) holder).tvMonth.setText(list.get(position).getDate().replace("-", "年") + "月");} else {final DayViewHolder viewHolder = (DayViewHolder) holder;viewHolder.tvCenter.setText(list.get(fPosition).getCenterString());viewHolder.tvBottom.setText(list.get(fPosition).getBottomString());if (viewHolder.llDay.getTag() instanceof View.OnClickListener){viewHolder.llDay.setOnClickListener( null);}if (list.get(fPosition).isCanSelect()) {//今天之前(不可选)if (TimeUtils.getTimeSpanByNow(list.get(position).getDate(), new SimpleDateFormat("yyyy-MM-dd", Locale.CHINA), TimeConstants.DAY) < 0) {viewHolder.tvCenter.setTextColor(ContextCompat.getColor(context, R.color.color_calendar_can_not_select));} else {if (TimeUtils.getTimeSpanByNow(list.get(position).getDate(), new SimpleDateFormat("yyyy-MM-dd", Locale.CHINA), TimeConstants.DAY) > 0) {viewHolder.tvCenter.setTextColor(ContextCompat.getColor(context, R.color.color_calendar_can_select));} else {viewHolder.tvCenter.setTextColor(ContextCompat.getColor(context, R.color.color_calendar_today));}if (list.get(fPosition).isSelect()) {viewHolder.llDay.setBackgroundColor(ContextCompat.getColor(context, R.color.color_calendar_background_select));viewHolder.tvCenter.setTextColor(ContextCompat.getColor(context, R.color.color_calendar_select));viewHolder.tvBottom.setTextColor(ContextCompat.getColor(context, R.color.color_calendar_select));} else if (list.get(fPosition).isSelectRange()) {viewHolder.llDay.setBackgroundColor(ContextCompat.getColor(context, R.color.color_calendar_background_select_range));viewHolder.tvCenter.setTextColor(ContextCompat.getColor(context, R.color.color_calendar_select));viewHolder.tvBottom.setTextColor(ContextCompat.getColor(context, R.color.color_calendar_select));} else {viewHolder.llDay.setBackgroundColor(ContextCompat.getColor(context, R.color.color_calendar_background_normal));}if (onItemSelect != null) {View.OnClickListener clickListener = new View.OnClickListener() {@Overridepublic void onClick(View v) {if (selectRange[0] == -1 && selectRange[1] == -1) {selectRange[0] = fPosition;list.get(fPosition).setSelect(true);list.get(fPosition).setBottomString("开始");onItemSelect.onItemClick(fPosition);notifyDataSetChanged();} else if (selectRange[0] != -1 && selectRange[1] == -1) {onItemSelect.onItemClick(fPosition);if (fPosition < selectRange[0]) {clearSelect();selectRange[0] = fPosition;list.get(fPosition).setSelect(true);list.get(fPosition).setBottomString("开始");} else if (fPosition > selectRange[0]) {selectRange[1] = fPosition;list.get(fPosition).setSelect(true);list.get(fPosition).setBottomString("结束");for (int i = selectRange[0] + 1; i < selectRange[1]; i++) {list.get(i).setSelectRange(true);list.get(i).setBottomString("");}onItemSelect.onItemRangeSelect(list.get(selectRange[0]).getDate(), list.get(selectRange[1]).getDate());} else {clearSelect();}notifyDataSetChanged();} else {clearSelect();selectRange[0] = fPosition;list.get(fPosition).setSelect(true);list.get(fPosition).setBottomString("开始");onItemSelect.onItemClick(fPosition);notifyDataSetChanged();}}};viewHolder.llDay.setOnClickListener(clickListener);viewHolder.llDay.setTag(clickListener);}}} else {viewHolder.llDay.setBackgroundColor(ContextCompat.getColor(context, R.color.color_calendar_background_normal));viewHolder.tvCenter.setTextColor(ContextCompat.getColor(context, R.color.color_calendar_can_not_select));}}}public OnItemSelect onItemSelect;public void setOnItemSelect(OnItemSelect onItemSelect) {this.onItemSelect = onItemSelect;}public interface OnItemSelect {void onItemClick(int position);void onItemRangeSelect(String startDate, String endDate);}@Overridepublic int getItemViewType(int position) {return list.get(position).getType() == 0 ? TYPE_MONTH : TYPE_DAY;}@Overridepublic int getItemCount() {return list == null ? 0 : list.size();}class MonthViewHolder extends RecyclerView.ViewHolder {TextView tvMonth;public MonthViewHolder(View itemView) {super(itemView);tvMonth = itemView.findViewById(R.id.tv_month);}}class DayViewHolder extends RecyclerView.ViewHolder {LinearLayout llDay;TextView tvCenter;TextView tvBottom;public DayViewHolder(View itemView) {super(itemView);llDay = itemView.findViewById(R.id.ll_day);tvCenter = itemView.findViewById(R.id.tv_center);tvBottom = itemView.findViewById(R.id.tv_bottom);}}
}
DateBean代码(中间文字,底部文字,是否可选等属性):
public class DateBean {/*** 日期*/private String date;/*** 底部文字*/private String bottomString;/*** 中间文字*/private String centerString;/*** 是否可以选择*/private boolean canSelect;/*** 是否选中*/private boolean isSelect;/**是否在选中范围*/private boolean isSelectRange;/*** item type 0月份 1日期*/private int type;public String getDate() {return date == null ? "" : date;}public void setDate(String date) {this.date = date;}public String getCenterString() {return centerString == null ? "" : centerString;}public void setCenterString(String centerString) {this.centerString = centerString;}public boolean isCanSelect() {return canSelect;}public void setCanSelect(boolean canSelect) {this.canSelect = canSelect;}public boolean isSelect() {return isSelect;}public void setSelect(boolean select) {isSelect = select;}public boolean isSelectRange() {return isSelectRange;}public void setSelectRange(boolean selectRange) {isSelectRange = selectRange;}public int getType() {return type;}public void setType(int type) {this.type = type;}public String getBottomString() {return bottomString == null ? "" : bottomString;}public void setBottomString(String bottomString) {this.bottomString = bottomString;}
}
上color.xml(可以自己换):
<resources><color name="color_calendar_can_not_select">#dedede</color><color name="color_calendar_can_select">#505050</color><color name="color_calendar_select">#ffffff</color><color name="color_calendar_today">#F67332</color><color name="color_calendar_background_select">#F3BE30</color><color name="color_calendar_background_select_range">#7DF3BE30</color><color name="color_calendar_background_normal">#00000000</color>
</resources>
OK,完毕!
相关文章:
Android 纵向双选日历
这个日历的布局分两部分,一部分是显示星期几的LinearLayout,另外就是一个RecyclerView,负责纵向滚动了。 工具类: implementation com.blankj:utilcode:1.17.3上activity_calendar代码: <?xml version"1.0&…...
电流电压;为什么用铜线作为导体
目录 电流电压 为什么用铜线作为导体 电流:电是怎么流动的 电压:储存压力...
(2024,扩展Transformer和数据,SDXL,SD2,DiT与 UNet)基于扩散的文本到图像生成的可扩展性
On the Scalability of Diffusion-based Text-to-Image Generation 公和众和号:EDPJ(进 Q 交流群:922230617 或加 VX:CV_EDPJ 进 V 交流群) 目录 0. 摘要 3. 扩展 Denoising 骨干 3.1. 现有的 UNet 设计 3.2. UNe…...
redis_watchDog机制
文章目录 介绍机制介绍任务开始任务释放 介绍 redis的watchDog机制实现了超时续约的功能,简单来说就是在获取锁成功以后,开启一个定时任务,这个任务每隔一段时间(relaseTime / 3),重置超时时间,避免的因业务阻塞导致锁…...
浏览器跨标签页通信的方式都有哪些
跨标签页的实际应用场景: 1. 共享登录状态: 用户登录后,多个标签页中需要及时获取到登录状态,以保持一致的用户信息。这种情况,可以使用浏览器的 localStorage 或者 sessionStorage 来存储登录状态,并通过…...
Javascript 无处不在的二分搜索
我们知道二分查找算法。二分查找是最容易正确的算法。我提出了一些我在二分搜索中收集的有趣问题。有一些关于二分搜索的请求。我请求您遵守准则:“我真诚地尝试解决问题并确保不存在极端情况”。阅读完每个问题后,最小化浏览器并尝试解决它。 …...
JavaScript 流程控制-分支
一、流程控制 流程控制主要有三种结构,分别是顺序结构、分支结构和循环结构。 二、顺序流程控制 顺序结构,没有特定的语法结构,程序会按照代码的先后顺序,依次执行, 三、分支流程控制 if 语句 1、分支结构 由上到下…...
ctfhub-ssrf(2)
1.URL Bypass 题目提示:请求的URL中必须包含http://notfound.ctfhub.com,来尝试利用URL的一些特殊地方绕过这个限制吧 打开环境发现URL中必须包含http://notfound.ctfhub.com,先按照之前的经验查看127.0.0.1/flag.php,发现没什么反应,按照题…...
python中中英文打印对齐解决方案
在python中,有时候会出现中英文混合输出的情形,但是由于中文默认是全角格式(一个中文字符占用两个字符宽度),这会对python原生的print函数带来一些障碍。尤其是用户用print对齐输出的时候,这种差异会导致文…...
Objective-C网络数据捕获:使用MWFeedParser库下载Stack Overflow示例
概述 Objective-C开发中,网络数据捕获是一项常见而关键的任务,特别是在处理像RSS源这样的实时网络数据流时。MWFeedParser库作为一个优秀的解析工具,提供了简洁而强大的解决方案。本文将深入介绍如何利用MWFeedParser库,以高效、…...
MATLAB数据类型和运算符+矩阵创建
个人主页:学习前端的小z 个人专栏:HTML5和CSS3悦读 本专栏旨在分享记录每日学习的前端知识和学习笔记的归纳总结,欢迎大家在评论区交流讨论! 文章目录 ✍一、MATLAB数据类型和运算符💎1 MATLAB的数据类型🌹…...
UE5下载与安装
官方网站:https://www.unrealengine.com/zh-CN 1、下载启动程序安装包。 登录官网后,点击首页右侧下载按钮下载Epic Games启动程序的安装包,如下图: 2、安装启动程序。 双击步骤1所下载安装软件,如下图:…...
RabbitMQ和Minio实现头像存储
使用 RabbitMQ 处理用户头像上传任务,同时将用户头像存储在 Minio 中是一个常见的应用场景。该示例将展示如何在 Spring Boot 项目中使用 RabbitMQ 和 Minio 实现此功能。示例包括两个部分:一是将头像上传任务推送到 RabbitMQ 队列中;二是从队…...
react结合Redux实现全局状态管理
React与Redux结合使用,可以为React应用提供集中式的状态管理和复杂的业务逻辑处理能力。以下是React中使用Redux的基本步骤和关键概念: 安装所需库 确保已经安装了React和ReactDOM。然后安装Redux及其配套库: npm install redux react-redu…...
2024面试软件测试,常见的面试题(上)
一、综合素质 1、自我介绍 面试官您好,我叫XXX,一直从事车载软件测试,负责最多的是中控方面。 以下是我的一些优势: 车载的测试流程我是熟练掌握的,且能够独立编写测试用例。 平时BUG提交会使用到Jira,类似…...
【VUE】Vue项目打包报告生成:让性能优化触手可及
Vue项目打包报告生成:让性能优化触手可及 Vue.js是一款流行的前端框架,开发者在使用Vue.js构建项目时,生产环境的性能优化尤为重要。为了帮助开发者分析和优化打包出来的资源,生成打包报告是一个不可或缺的步骤。本文将介绍几种在…...
git简单实践
拉取远程仓库 git clone -b main gitgithub.com:xianbingC/MultiQueueThreadpool.git创建开发分支 git checkout -b c11 # 创建本地分支C11并切换过去 git push origin c11 # 提交到远程,并在远程仓库创建该分支提交代码 第一次提交会提示设置邮箱和用户名&am…...
华为云服务镜像手动更换
操作步骤: 1、进入华为云首页点击云容器引擎CCE; 2、选择你所要更换镜像的环境【这里以dev环境演示】; 3、点击dev环境后选择顶部的命名空间,点击【工作负载】中右侧栏的【升级】按钮; 4、点【更换镜像】选择你在test…...
Python 天气预测
Python天气预测通常涉及到数据采集、数据预处理、选择和训练模型、以及预测和可视化等步骤。以下是使用Python进行天气预测的一般流程: 数据采集 使用爬虫技术从天气网站(如Weather Underground、中国天气网等)爬取历史天气数据,…...
计算机视觉——基于OpenCV和Python进行模板匹配
模板匹配? 模板匹配是它允许在一幅较大的图像中寻找是否存在一个较小的、预定义的模板图像。这项技术的应用非常广泛,包括但不限于图像识别、目标跟踪和场景理解等。 目标和原理 模板匹配的主要目标是在一幅大图像中定位一个或多个与模板图像相匹配的…...
2024-Java-Maven学习笔记
Maven Maven是一个Java项目管理和构建工具,作用:定义(规范)项目结构、项目依赖、使用统一的方式自动化构建(clean、compile)。 提供了一套依赖管理机制:利用仓库统一管理jar包,利用…...
【HCIP学习】OSPF协议基础
一、OSPF基础 1、技术背景(RIP中存在的问题) RIP中存在最大跳数为15的限制,不能适应大规模组网 周期性发送全部路由信息,占用大量的带宽资源 路由收敛速度慢 以跳数作为度量值 存在路由环路可能性 每隔30秒更新 2、OSPF协议…...
elmentui树形表格使用Sortable拖拽展开行时拖拽bug
1、使用elemntui的el-table使用Sortable进行拖拽,如下 const el this.$el.querySelector(.el-table__body-wrapper tbody) Sortable.create(el, {onEnd: (event) > {const { oldIndex, newIndex } event//拿到更新前后的下标即可完成数据的更新} })2、但是我这…...
【笔试训练】day6
1.大数加法 思路: 高精度板子,停留一下都是罪过! 代码: class Solution { public:string solve(string s, string t) {vector<int> a;vector<int> b;for(int is.size()-1;i>0;i--)a.push_back(s[i]-0);for(int …...
标准版uni-app移动端页面添加/开发操作流程
页面简介 uni-app项目中,一个页面就是一个符合Vue SFC规范的.vue文件或.nvue文件。 .vue页面和.nvue页面,均全平台支持,差异在于当uni-app发行到App平台时,.vue文件会使用webview进行渲染,.nvue会使用原生进行渲染。…...
VMware 安装配置 Ubuntu(最新版、超详细)
Linux 系列教程: VMware 安装配置 Ubuntu(最新版、超详细)FinalShell 远程连接 Linux(Ubuntu)系统Ubuntu 系统安装 VS Code 并配置 C 环境 文章目录 1. 下载安装 VMware2. 检查网络适配器3. Ubuntu 下载4. 创建虚拟机5…...
clickhouse ttl不生效
现象: 日志保留31天, 但是发现1年前的数据还有。 表结构: CREATE TABLEads_xxxx_metrics_1m_local (static_time String COMMENT 统计时间,......) ENGINE ReplacingMergeTree (process_time) PARTITION BYtoYYYYMMDD (toDate (static_tim…...
前端打包webpack vite
起步 | webpack 中文文档 | webpack中文文档 | webpack中文网 npm run build 1webpack: mkdir webpack-demo cd webpack-demo npm init -y npm install webpack webpack-cli --save-dev vite : 快速上手 | Vue.js...
Cesium之home键开关及相机位置设置
显隐控制 设置代码中的homeButton var TDT_IMG_C "https://{s}.tianditu.gov.cn/img_c/wmts?servicewmts&requestGetTile&version1.0.0" "&LAYERimg&tileMatrixSetc&TileMatrix{TileMatrix}&TileRow{TileRow}&TileCol{TileCol}…...
nginx根据二级目录转发服务以及带/和不带/的区别
在nginx中配置proxy_pass代理转发时,如果在proxy_pass后面的url加/,表示绝对根路径;如果没有/,表示相对路径,把匹配的路径部分也给代理走。具体实例如下 1.配置文件location带/且proxy_pass带/ server {listen 80;se…...
JVM 性能调优命令(jps,jinfo,jstat,jstack,jmap)
常用命令:jps、jinfo、jstat、jstack、jmap jps jps查看java进程及相关信息 jps -l 输出jar包路径,类全名 jps -m 输出main参数 jps -v 输出JVM参数jps命令示例 显示本机的Java虚拟机进程: # jps 15729 jar 92153 Jps 90267 Jstat显示主类…...
探索 IntelliJ IDEA 2024.1最新变化:全面升级助力编码效率
探索 IntelliJ IDEA 2024.1最新变化:全面升级助力编码效率 文章目录 探索 IntelliJ IDEA 2024.1最新变化:全面升级助力编码效率摘要引言 IntelliJ IDEA 2024.1 最新变化关键亮点全行代码补全 Ultimate对 Java 22 功能的支持新终端 Beta编辑器中的粘性行 …...
【Kafka】Zookeeper集群 + Kafka集群
Zookeeper 概述 Zookeeper是一个开源的分布式的,为分布式框架提供协调服务的Apache项目。 Zookeeper 工作机制★★★ Zookeeper从设计模式角度来理解: 1)是一个基于观察者模式设计的分布式服务管理框架; 它负责存储和管理大家都关…...
递归 python
↵一、简单理解 解决问题的一种方法,它将问题不断的分成更小的子问题,直到子问题可以用普通的方法解决。通常情况下,递归会使用一个不停调用自己的函数。 【注】:每一次递归调用都是在解决一个更小的问题,如此进行下…...
解读科技智慧公厕改变生活的革命性创新之路
公共厕所,作为城市基础设施的一部分,一直以来都备受人们诟病。脏乱差、设施老旧、管理混乱,成为公共厕所长期存在的问题。然而,随着科技的不断进步,智慧公厕应运而生,为解决公厕难题,智慧公厕源…...
鸿蒙ArkTS小短剧开源项目进行中
鸿蒙小短剧开源项目进行中 短剧项目名称:CCShort-TV 短剧项目名称:CCShort-TV 使用ArtTS语言,API9以上,HarmonyOS系统的短剧开源代码,使用GSYVideoPlayer作为核心播放器的小短剧。主要以ArkTS,ArkUI编写为…...
基于STM32的RFID智能门锁系统
本文针对RFID技术,着重研究了基于单片机的智能门锁系统设计。首先,通过链接4*4按键模块与主控STM32,实现了多种模式,包括刷卡开锁、卡号权限管理、密码开锁、修改密码、显示实时时间等功能。其次,采用RC522模块与主控S…...
消息队列的简介
什么是消息队列? 消息队列就是用于不同系统 不同服务之间异步地传递信息,就是不用生产者和消费者同时在线或者直接连接,消息存储在队列中,直到消费者准备处理 消息队列的核心概念: 生产者:发送消息的一方 消费者:处理消息的一方 队列:存储队列的一方 优点: 1解耦: 生产者和消费…...
一个开箱即用的物联网项目,开源免费可商用
一、平台简介 今天给大家推荐一款开源的物联网项目,简单易用,非常适合中小团队和个人使用,项目代码和文档完全开源,个人和公司都可以应用于商业项目,只需要保留开源协议文件即可。 本项目可应用于智能家居、农业监测…...
成为程序员后你都明白了什么呢?
成为程序员后你都明白了什么? 简介:探讨成为程序员后的收获和体会,以及对未来的展望。 方向一:技术成长 在技术成长方面,我认识到编程不仅仅是一种技能,更是一种思维方式。在不断地学习和实践中…...
Rust常见陷阱 | 算术溢出导致的 panic
Rust作为一种内存安全性语言,对于算术运算中的溢出处理特别严格。由于Rust默认会在debug模式下进行算术操作的溢出检查,任何溢出行为都会导致panic,这样能够帮助开发者在调试阶段发现潜在的溢出错误。尽管在release模式下,溢出会导致值的截断,并不会引起panic,但忽视这一…...
SRS服务接入华为云CDN
一、srs配置 正常的标准配置即可,需打开hls推流即可,一般配置中默认打开 二、华为云cdn配置 1.登录华为云,找内容分发网络cdn 2.点击域名管理,点击添加域名 3.配置加速域名 4.选择点播加速 5.添加源站 配置源站地址…...
微信小程序----微信小程序基础
能够知道如何创建小程序项目能够清楚小程序项目的基本组成结构能够知道小程序页面由几部分组成能够知道小程序中常见的组件如何使用能够知道小程序如何进行协同开发和发布 一.小程序简介 1. 小程序与普通网页开发的区别 1. 运行环境不同 网页运行在浏览器环境中小程序运行在…...
牛客周赛 Round 39(A,B,C,D,E,F,G)
比赛链接 官方题解(视频) B题是个贪心。CD用同余最短路,预处理的完全背包,多重背包都能做,比较典型。E是个诈骗,暴力就完事了。F是个线段树。G是个分类大讨论,出题人钦定的本年度最佳最粪 题目…...
性能优化工具
CPU 优化的各类工具 network netperf 服务端: $ netserver Starting netserver with host IN(6)ADDR_ANY port 12865 and family AF_UNSPEC$ cat netperf.sh #!/bin/bash count$1 for ((i1;i<count;i)) doecho "Instance:$i-------"# 下方命令可以…...
【简单介绍下R-Tree】
🌈个人主页: 程序员不想敲代码啊 🏆CSDN优质创作者,CSDN实力新星,CSDN博客专家 👍点赞⭐评论⭐收藏 🤝希望本文对您有所裨益,如有不足之处,欢迎在评论区提出指正,让我们共…...
比特币叙事大转向
作者:David Lawant 编译:秦晋 要理比特币解减半动态,最关键的图表是下面这张,而不是价格图表。它显示了自 2012 年以来,矿业总收入与比特币现货交易量的比例,并标注了三个减半日期。 虽然矿工仍然是比特币生…...
Spring的事务传播机制有哪些
Spring的事务传播机制有哪些? Spring的事务传播机制用于控制在多个事务方法相互调用时事务的行为。 在复杂的业务场景中,多个事务方法之间的调用可能会导致事务的不一致,如出现数据丢失、重复提交等问题,使用事务传播机制可以避…...
【Linux系统】地址空间 Linux内核进程调度队列
1.进程的地址空间 1.1 直接写代码,看现象 1 #include<stdio.h>2 #include<unistd.h>3 4 int g_val 100;5 6 int main()7 {8 int cnt 0;9 pid_t id fork();10 if(id 0)11 {12 while(1)13 {14 printf(&…...
centos搭建yum源
目录 1.createrepo简介 2.repo搭建思路 3.安装 4.使用 1.createrepo简介 createrepo 是一个用于创建 RPM 包的工具,它可以帮助你创建一个本地的 YUM 仓库。createrepo 并不是用于运行 YUM 仓库服务的软件,而是用来生成仓库的元数据,使得 YUM 可以理解和使用这个仓库。 …...
jvisualvm安装Visual GC插件
给jdk自带的jvisualvm安装Visual GC插件,遇到We’re sorry the java.net site has closed(我们很抱歉java.net网站已经关闭) 1、找到新的更新地址 visualvm新访问地址:https://visualvm.github.io/index.html 进入“Plugins”&am…...
ATA-2021B高压放大器在光纤超声传感器中的应用
实验名称:超声传感性能研究 测试目的: 光纤马赫-曾德尔干涉仪是一种灵敏度高、结构灵活的传感结构。当在MZI上施加超声波信号时,会影响所涉及的干涉光之间的光程差,并导致干涉光谱的漂移。由于模式耦合是基于MZI的光纤传感器的关键…...
Visual Studio Code 扩展程序Text Edits
需求 比如把Scarzombie_Monster全部转换为大写或者小写 安装 Text Edits 直接搜索安装即可 使用 假如要把Scarzombie_Monster全部转为大写,选中右键选中 To Upper Case或者直接快捷键shiftAltU即可...
AI学习指南概率论篇-条件概率和独立性
AI学习指南概率论篇-条件概率和独立性 概述 在人工智能领域,概率论是一项至关重要的工具。概率论不仅仅是用于量化不确定性,还在AI系统中扮演着关键角色。其中,条件概率和独立性是概率论中重要的概念之一,它们在AI领域有着广泛的…...
代码随想录算法训练营第二十九天 | 39. 组合总和、40.组合总和II、131.分割回文串
39. 组合总和 题目链接/文章讲解: 代码随想录 视频讲解:带你学透回溯算法-组合总和(对应「leetcode」力扣题目:39.组合总和)| 回溯法精讲!_哔哩哔哩_bilibili 解题思路 这里和组合不同的是元素可以重复选取…...
C# 使用SendMessage进行进程通信,可发送字符串,结构体
发送时只能以结构体形式发送,类的话会提示“指定结构必须能直接复制到本机结构中,或是具有布局信息 ”的错误提示 以下两种结构体示例都可以被发送 public struct A{public A(int a){name "heow";array new double[3] { 1, 2, 5.6 };}strin…...
MyBatis操作数据库(动态SQL)
1 动态SQL 动态SQL是MyBatis的特征之一,能够完成不同条件下不同的SQL拼接 1.1 <if>标签 在注册用户的时候,可能会有这样一个问题,由于注册分为两种字段:必填字段和非必填字段,如果在添加用户的时候有不确定的…...
VUE中,图片正常显示但是触发了@error
我的项目中图片是从后端获取的,不能确定后端返回的图片链接是否能正常访问,并且希望当链接异常时直接不显示图片,而不是裂口的图片,所以我的代码如下: <img :src"logoUrl" class"logo" id&quo…...
Docker部署nacos集群
前提: 购买一台服务器 虚拟机也行 ,无论是哪一个内存都要足够 阿里:https://ecs-buy.aliyun.com/ecs?spm5176.8789780.J_4267641240.2.1e7e39fbopfoRn#/custom/prepay/cn-hangzhou 腾讯 、华为。。。。我目前只使用过这三个。 下载 Xshell …...
ControlNet 学习笔记
ControlNet根据一些额外的信息控制扩散生成走向 在作用原理上,ControlNet和LoRA是有许多相似之处的,定位都是对大扩散模型做微调的额外网络。 Annotator(预处理器):从图片中提取对ControlNet有用的额外信息 Diffusion:在ControlN…...
Jvppeteer生成PDF文件保存
Jvppeteer生成PDF文件保存 需求背景项目准备代码示例完结 需求背景 项目中有报表功能,报表由前端渲染生成,后台需要按需求将报表生成pdf进行邮件发送,前端的报表完全是动态生成的,后台不能完美的复刻前端的报表渲染,所…...
DDNS配置详解
正文共:1111 字 8 图,预估阅读时间:1 分钟 前面配置了DDNS(拨号有公网IP地址了,肯定要通过DDNS用起来啊!),有不少小伙伴咨询具体的配置问题。为了方便大家深入理解DDNS的技术原理&am…...