自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(174)
  • 问答 (1)
  • 收藏
  • 关注

原创 iOS与android坐标映射不一致问题

为什么同一份着色器代码、同样的cvmat数据,Android和iOS两个平台处理之后会得到不一样的结果呢?

2024-05-08 12:27:13 533

原创 动画法则与动画曲线解析

先介绍一些和代码关系不大的动画常识。

2024-02-26 11:32:36 844

原创 Leetcode每日一题:使括号有效的最少添加(括号匹配)

题目难度其实配不上中等二字,栈 or 贪心都可以解决,本篇博客旨在记录评论区中见到的一个有趣想法。中的匹配括号,剩下的当然是不匹配的括号,也就是需要加多少个括号才能让它们匹配啦~返回 为使结果字符串 s 有效而必须添加的最少括号数。输入:s = “())”输入:s = “(((”

2022-10-04 22:16:19 449 2

原创 Android |双锁单例模式中使用Context如何避免内存泄露的 Warning 提示

在Android开发中,经常会将工具类以单例模式的方法实现,而工具类中又总不可避免的用到。查阅了大量资料后,解决方法如文中所示。值得注意的是,在我查阅的所有资料中,基本所有解决方法有内存泄漏的风险。包括 Google 自己的。

2022-09-21 15:18:57 1402

原创 OpenGL | 通过绘制一个三角形来入门 OpenGL 图形渲染管线

OpenGL只是一种规范,严格意义上来讲不能视为库,不同的显卡生产商在OpenGL的API提供上有着细微的差距,而OpenGL的核心代码和显卡核心技术绑定因此是非开源的,使用时通常仅能对厂商提供的API进行操作。OpenGL优势在于它是跨平台的,一份代码可以在Mac、Windows、Linux,甚至移动端的iOS、Android上运行。(比为不同平台专门编写不同API的Direct3D更适合懒人,当然在iOS上可能更多还是选择苹果专用的Metal)。...

2022-08-21 12:13:38 951

原创 Windows 下 VS 配置 OpenGL 环境

感谢B站同学搬运YouTube上的教学视频。从官网上下载GLFW macOS下64位二进制文件从下载好的 文件夹中找到最新版链接文件和 文件,将它们移动到 路径下:但 文件夹中的东西并不都是我们需要的,我们仅需要 库文件,对于其他三个文件删除即可。这里有个很有意思的地方,视频中 cherno大佬 直接把VS自带的默认依赖项都删了,然后 时编译器报错——缺少依赖,而解决方法就是:选取缺少的依赖名称:Google一下,你就知道:根据 MSDN 文档的提示,在 中的 添加 对应的依赖文件

2022-08-20 17:39:29 776

原创 Google 开源项目风格指南学习笔记——C++篇

虽然在 YuleFox、Yang.Y、acgtyrant等诸位大佬的努力下,Google 开源项目风格指南——中文版已经大幅减轻了我们的学习成本,但是文中部分专业的术语或者表达方式还是让过于萌新的读者(比如说我)在流畅的阅读过程中突遇卡顿,不得不查阅各种资料理清原委,这也是写学习笔记的初衷。

2022-08-20 12:08:15 1366

原创 Mac 下 CMake 的配置与使用

安装完成后,从菜单栏选择Tools–HowtoInstallForCommandLineUse。在多个目录下有着多个源文件的情况下,需要在每个目录中都编写一个。这个宏,倘若在源码中也想使用它,那么需要由。为例,演示如何导入一个本地的第三方库,(在红圈中根据自己的Mac版本任选一个。当命令执行成功后,就会在当前目录下生成。与编译单个源文件相比,难点主要是对。是默认安装的根目录,可以通过修改。命令来进行相关测试,项目根目录的。里的文件编译为一个静态库再通过。版本开始提供的功能,只需要一个。...

2022-07-26 10:08:20 8042

原创 初识贝塞尔(bezier)曲线

经过对一阶、二阶贝塞尔曲线的研究学习,我们能知道贝塞尔曲线通过在两点之间再采点的方式实现降阶,每一次选点都是一次的降阶。两点构成了一条线段,而我们可以通过一个函数——,它们构成了绿色线段,值得注意的是,构成了新的线段,我们得到两个。而此时我们在绿色线段上生成一个。(图中一直在滑动的点)。的运动轨迹(红线),便是。那么该点的运动轨迹就是。......

2022-07-20 18:28:31 2289 4

原创 Android入门(17)| 百度提供的 Android定位SDK

版本起,全新升级了全球定位能力,在海外地区定位所获得的经纬度,

2022-07-15 18:24:59 828

原创 保姆级教学!Xcode 配置 OpenGL 环境

不同于Windows下的操作习惯,在macOS中尽量在访达中对文件进行移动、删除等操作,而非直接拖拽到Xcode的树形目录中进行移动,亦或直接在树形目录中进行删除。PS还遇到过删除OpenGL目录下的test文件夹,结果导致与OpenGL同级的test文件夹也被删除的情况,但后来无法复现,因此在这里无法贴图证明。对于开发人员而言,每使用一个函数就要经历这样的寻址过程无疑是极其痛苦的,因此需要通过GLAD库加载所有OpenGL函数指针,来简化使用函数的流程。.........

2022-07-15 17:32:56 1844 9

原创 Android | 再探 RecyclerView 之名词解析

文章目录Adapter、ViewHolderPositionlayout position 和 adapter position浏览本文前推荐先阅读 Android入门(九)| 滚动控件 ListView 与 RecyclerViewAdapter、ViewHolderAdapter: A subclass of RecyclerView.Adapter responsible for providing views that represent items in a data set.翻

2022-07-06 11:08:54 591

原创 【JAVA 开发小问题】 | String操作合集

JAVA开发中遇见的问题

2022-06-13 19:45:14 178

原创 Android | Sensor.TYPE_ORIENTATION被废弃后的解决办法

文章目录概述getOrientation 方法根据 旋转矩阵R 获取 设备旋转弧度getRotationMatrix 方法根据 地磁场、加速度传感器对象 获取 旋转矩阵R代码参考资料概述Sensor.TYPE_ORIENTATION 常数在 API 8 中已弃用,官方推荐使用 SensorManager.getOrientation() 替代。关于 Orientation Sensor(被弃用的方向传感器) 在官方文档中的概述里有这样一句话:The orientation sensor is

2022-05-11 23:41:50 2784

原创 Android入门(16)| 服务

文章目录概念Android 多线程继承 Thread继承 Runable 接口匿名类异步消息处理AsyncTask概念服务(Service)用于执行无需和用户交互但需要长期运行的任务,其不是独立进程,而是依赖于创建服务时所在的应用程序进程。应用程序进程死亡时,所有依赖于该进程的服务也都将停止运行。Android 多线程服务不会自动开启线程,因此为了防止主线程被阻塞,应该在服务内部手动创建子线程。通常有三种线程的使用方式:继承 Thread新建一个类继承 Thread ,然后重写 run()

2022-03-14 20:42:12 3431 1

原创 Android入门(15)| 网络

文章目录WebViewHTTP使用HttpURLConnectionWebViewWebView 可以在**应用程序中(而不是浏览器)**展示一些网页。布局文件 web_layout.xml:<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_pa

2022-03-08 16:12:13 2876

原创 Android开发(4) | 系统权限、MediaPlayer类 和 VideoView类 的应用——播放多媒体文件

文章目录MediaPlayer类播放音频的实例MediaPlayer类对多种格式的音频文件提供了全面的控制方法:如何获得MediaPlayer实例?通过构造函数:MediaPlayer mp = new MediaPlayer();调用 MediaPlayer.create() 方法:MediaPlayer mp = MediaPlayer.create(this, R.raw.test);由于 create 方法内会调用 setDataSource 和 prepare,

2022-03-06 18:30:42 2573

原创 Android开发(3) | 权限和内容提供器的应用——调用相机和相册

文章目录布局文件 notice_layout.xml:活动代码: public static final int TAKE_PHOTO = 1; private ImageView picture; private Uri imageUri; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState)

2022-03-05 12:33:19 1777

原创 Android入门(14)| 通知

文章目录创建通知点击效果实例创建通知创建通知的步骤:管理通知的 NotificationManager,通常通过当前 Context 的 getSystemService() 获取实例。它接受一个字符串参数用于确定获取系统的什么服务。Android 8.0(O) 版本后需要通知通道(通知类别) Notificationchannel 以细致化管理通知。使用 Builder构造器 来创建 Notification对象。可以使用 support库 提供的 NotificationCompat类 中

2022-03-04 17:29:03 3203

原创 Android入门(13)| Android权限 与 内容提供器

文章目录普通权限与危险权限运行时申请权限内容提供器普通权限与危险权限主要用于不同应用程序之间在保证被访数据的安全性的基础上,实现数据共享的功能。在 Android 6.0 开始引入了运行时权限的功能,用户在安装软件时不需要一次性授权所有的权限,而是在软件的使用过程中再对某一项权限进行申请。Android 将权限分为两类:普通权限: 不会直接影响到用户的安全和隐私的权限,对于这部分权限,系统自动授权。危险权限: 可能会涉及到用户的隐私或者对设备安全性造成影响的权限。危险权限如下,这些权限需要

2022-03-03 13:41:13 612

原创 Android入门(12)| 数据持久化

文章目录数据持久化文件存储将数据存储进文件实例从文件中读取数据实例SharedPreferences存储数据持久化保存在内存中的数据是属于瞬时状态的,而保存在存储设备中的数据上处于持久状态的,持久化技术提供了一种可以让数据在瞬时状态和持久状态之间转换的机制。Android系统中主要提供了3种常用方式用于简单地实现数据持久化功能,即文件存储、SharedPreference存储以及数据库存储。文件存储将数据存储进文件Context类 中提供了一个 openFileOutput 方法,用于将数据

2022-03-01 15:03:51 1577

原创 Android开发(2) | 广播 Broadcast 的应用——强制下线功能

文章目录功能简介关闭所有活动登陆界面发送强制下线的广播功能简介强制下线功能只需要弹出一个对话框,让用户只能点击确定按钮,回到登录界面。如果在每一个活动中添加一个对话框的话太过繁琐,用广播实现是一个好办法。关闭所有活动强制下线功能需要先关闭所有的活动,我们只需要用 AcitivityCollector 类来管理所有的活动,然后用 BaseActivity 类作为所有活动的父类,如此一来即可通过 ActivityCollector.finishAll() 退出所有程序。AcitivityCollec

2022-02-24 16:46:31 1048

原创 Android入门(11)| 全局广播与本地广播

文章目录广播概念接收广播动态注册实例静态注册实例发送广播发送标准广播广播概念Android 中的每个应用程序都可以对自己感兴趣的广播进行注册,这样该程序就只会接收到自己所关心的广播内容,这些广播可能是来自系统的,也可能是来自于其他应用程序的。广播有两种类型——有序广播和标准广播:标准广播: 一种完全异步执行的广播,在广播发出去之后,所有的广播接收器几乎都会同一时刻接收到这条广播消息,没有任何的先后顺序可言,这种广播的效率比较高,但是无法被截断。有序广播: 是一种同步执行的广播,在广播发出

2022-02-23 15:41:08 2446 2

原创 Android开发(1) | Fragment 的应用——新闻应用

文章目录news_item.xml:<TextView xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/news_title" android:layout_width="match_parent" android:layout_height="wrap_content" android:lines="1" android:ellipsize="

2022-02-21 19:12:23 3621

原创 Android入门(10)| Fragment碎片详解

文章目录为什么要使用碎片(Fragment)实例布局文件Fragment为什么要使用碎片(Fragment)我们在手机上看新闻可能是这样的:RecyclerView 显示了一组新闻标题点击一个新闻后会跳转到新界面显示详细内容但当设备屏幕很大时,我们完全可以将 RecyclerView 和 详细内容 分别放在两个 碎片 中,然后引入同一个 活动:Fragment 的定义为小活动,同样具有生命周期,但比一个 Activity 更细化的管理空间。实例布局文件定义两个布局文件:lef

2022-02-18 20:28:10 1385

原创 关于“三门问题”的一些想法

三门问题(Monty Hall problem)亦称为蒙提霍尔问题、蒙特霍问题或蒙提霍尔悖论,大致出自美国的电视游戏节目Let’s Make a Deal。问题名字来自该节目的主持人蒙提·霍尔(Monty Hall)。参赛者会看见三扇关闭了的门,其中一扇的后面有一辆汽车,选中后面有车的那扇门可赢得该汽车,另外两扇门后面则各藏有一只山羊。当参赛者选定了一扇门,但未去开启它的时候,节目主持人开启剩下两扇门的其中一扇,露出其中一只山羊。主持人其后会问参赛者要不要换另一扇仍然关上的门。问题是:换另一扇门是否会增加参

2022-02-17 20:10:33 426

原创 Android入门(九)| 滚动控件 ListView 与 RecyclerView

文章目录ListViewListView由于手机屏幕空间有限,能够一次性在屏幕上显示的内容不多,当我们的程序有大量数据需要显示的时候就可以借助 ListView 来实现。布局文件 listview_layout.xml :<?xml version="1.0" encoding="utf-8"?><androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android

2022-02-14 23:15:33 1211

原创 Android入门(八) | 常用的界面布局 及 自定义控件

文章目录LinearLayout :线性布局android:layout_gravity :控件的对齐方式android:layout_weight:权重LinearLayout :线性布局线性布局有水平、垂直两种排列方式:android:orientation="vertical" :垂直方向排列,此时高度不可被指定为 match_parent。android:orientation="horizontal":水平方向排列,此时不能将宽度指定为 match_parent。android:l

2022-02-05 16:21:33 3000 2

原创 Android入门(七) | 常用控件

文章目录TextView 控件Button 控件EditText 控件TextView 控件TextView 是 Android 中较常用的一个控件。主要用于在界面上显示一段文本信息,配置在每个活动的 xml 文件中。除了之前用到的 android:id、android:layout_width 、android:layout_height 三种属性,下面三种属性也比较常用:android:gravity :文字对齐方式,可选值有 top、bottom、left、right、center 等,可以

2022-01-28 17:42:09 6409

原创 Android入门(六) | Activity 的启动模式 及 生产环境中关于 Activity 的小技巧

文章目录提要standardsingleTopsingleTasksingleInstance提要standard:默认的启动方式,每次启动一个活动都会重新创建singleTop:如果改活动处于栈顶,则不会创建新活动,不处于栈顶则创建新活动singleTask:如果返回栈中存在该活动,那么将该活动之上的所有活动统统出栈,将该活动置于栈顶,如果不存在该活动则创建singleInstance:会重新启用一个新的返回栈来创建该活动,通常用于共享活动的实例standardstandard 是 A

2022-01-26 20:18:31 2073

原创 Android入门(五) | Activity 的生命周期

文章目录管理 Activity管理 ActivityAndroid 的应用程序运用 栈(Back Stack) 的思想来管理 Activity:每创建一个新活动,就会覆盖在旧活动之上,相当于压入栈。每当按下 返回键(Back) 或者调用 finish() ,就会销毁栈顶的 Activity,相当于弹出栈。Activity 有四种状态:运行:在栈顶时运行。暂停:不再处于栈顶、但屏幕上可见时暂停。停止:不再处于栈顶且屏幕上不可见时停止。销毁:弹栈后销毁。...

2022-01-25 23:11:57 1186 3

原创 Android入门(三) | Android 的日志工具 Logcat

文章目录Android 的日志工具 LogAndroid 的日志工具 LogLog 从属日志工具类 android.util.Log ,该类提供了五个方法供我们打印日志:Log.v() :用于打印那些最为琐碎的、意义最小的日志信息。对应级别 verbose,是 Android 日志里面级别最低的一种。Log.d() :用于打印一些调试信息,这些信息对你调试程序和分析问题应该是有帮助的。对应级别 debug,比 verbose 高一级。Log.i() : 用于打印一些比较重要的数据,这些数据应该

2022-01-24 11:44:23 1517

原创 Android入门(二) | 项目目录及主要文件作用分析

文章目录项目目录分析app目录分析AndroidManifest.xml 分析MainActivity.kt 分析build.gradle 分析最外层目录下的 build.gradleapp 目录下的 build.gradle项目目录分析我们来看一下 src/main/res 下的一些文件:.gradle 和 .idea :这两个目录下放置的都是 Android Studio 自动生成的一些文件,我们无须关心,也不要去手动编辑。.app:项目中的代码、资源等内容几乎都是放置在这个目录下的,我

2022-01-23 20:59:03 2232

原创 Android 入门(四) | Intent 实现 Activity 切换

文章目录使用Intent在活动之间穿梭定义两个 xml 文件android:orientationmatch_parent 和 wrap_contentIntent函数的定义使用Intent在活动之间穿梭如何在切换 Actiity 时携带数据是一个重要问题。我们定义两个 xml 文件,通过 Intent 实现在活动间穿梭。什么是 xml 文件?xml 即可扩展标记语言,是互联网数据传输的重要工具,它可以跨越互联网任何的平台,在服务器之间穿梭结构化数据,不受编程语言和操作系统的限制,可以说它是一

2022-01-22 21:37:34 1546

原创 Android入门(一) | Android Studio的配置与使用

文章目录安装+配置Android Studio使用Android Studio安装+配置Android Studio从这一步开始:一直点 next 即可,直到存储路径的选择上,可以放到非 C 盘,这里我放到 D 盘了(截图中没改):是否要添加到开始菜单栏:直到完成:是否继承旧有配置,第一次安装的选第二个就行:谷歌问你能不能在不侵犯你隐私的前提下获取些帮助改进的信息……我选的 send:这个问题详见这篇博客:配置,第一个是标准常规配置,第二个是自定义配置,选择第一个即可:

2022-01-15 17:17:11 1740

原创 字符串匹配之KMP(KnuthMorrisPratt)算法(图解)

文章目录最长相等前后缀next数组最长相等前后缀给出一个字符串 ababa前缀集合:{a, ab, aba, abab}后缀集合:{a, ba, aba, baba}相等前后缀 即上面用同样颜色标识出来的集合元素,最长相等前后缀 也就是所有 相等前后缀 中最长的那一个,也就是上面的 aba 。用图片举例:最长相等前后缀 就是 KMP 算法滑动的依据。我们用 next 数组存储 最长相等前后缀,以避免每次需要用到 最长相等前后缀 时都需要遍历寻找的繁琐。next数组next[i]=j 的

2021-12-23 23:42:43 790

原创 香农信息熵之可怜的小猪

文章目录题目解析题目有 n 桶液体,其其中 正好 有一桶含有毒药,其装的都是水。它们从外观看起来都一样。为了弄清楚哪只水桶含有毒药,你可以喂一些猪喝,通过观察猪是否会死进行判断,实验对象的反应时间为 d 。不幸的是,你只有 t 时间来确定哪桶液体是有毒的。解析根据题意,最大测试次数为 num = ∣td∣\vert\frac{t}{d}\vert∣dt​∣考虑 num=1 时,也就是只进行一轮测试,容易想到可以使用与水同等数量的小猪来进行测试,n 个小猪喝 n 桶液体,哪个死翘翘哪一桶水有问题。

2021-12-01 23:42:11 470

原创 Linux服务器 | 服务器模型与三个模块、两种并发模式:半同步/半异步、领导者/追随者

文章目录C/S模型P2P模型C/S模型即常说的 客户端/服务器 模型,将资源(视频、文本、图片、软件等)提供者视作服务器,资源请求者视为客户端。由于客户端连接请求(connect函数)是随机到达的异步事件,服务器需要使用某种 I/O模型 来监听这一事件。例如 I/O复用技术之一的 select系统调用:当监听到连接请求后,服务器就调用 accept函数 接收它,并分配一个 逻辑单元(新创建的子进程、子线程等) 管理这个新连接。工作流程如下图所示:服务器在处理一个客户请求的同时还要继续监听其他客

2021-11-21 23:26:55 1160

原创 Linux服务器 | 事件处理模式:Reactor模式、Proactor模式

文章目录Reactor模式Proactor模式同步I/O模型模拟Proactor模式两者的优缺点ReactorProactor同步I/O模型通常用于实现 Reactor 模式,异步I/O模型通常用于实现 Proactor 模式。(不是绝对的,同步I/O也可模拟出 Proactor 模式)Reactor模式原理Reactor 模式要求主线程(I/O处理单元)只负责监听文件描述符上是否有事件就绪,如果有则将该就绪事件通知给工作线程(逻辑单元)。除此之外主线程不会进行其他实质性的工作,读写数据、接收

2021-11-20 01:08:38 1475

原创 IO模型 :阻塞IO、非阻塞IO、信号驱动IO、异步IO、多路复用IO

文章目录IO模型阻塞IO非阻塞IO信号驱动IO多路复用IO异步IOIO模型根据各自的特性不同,IO模型被分为阻塞IO、非阻塞IO、信号驱动IO、异步IO、多路复用IO五类。最主要的两个区别就是阻塞与非阻塞,同步与异步。阻塞与非阻塞阻塞与非阻塞最主要的区别就是程序在等待调用结果时的状态。阻塞: 为了完成一个功能发起调用,如果不具备完成功能的条件,则调用会一直等待非阻塞: 为了完成一个功能发起调用,如果不具备完成功能的条件,则立即报错返回同步与异步同步与异步最主要的区别就是功能完

2021-11-09 22:46:07 777

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除