自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

非猿

为什么溪水会认为他只有沿着小溪一直流淌??

  • 博客(105)
  • 收藏
  • 关注

原创 鸿蒙app开发覆盖安装

勾选 keep application data ,就可实现保留数据的覆盖安装。

2024-03-18 10:19:14 394

原创 一个Flutter BLoC入门的简单 demo

通过一个非常简单的计数器示例来演示如何使用BLoC模式。这个计数器将有增加和减少两个功能。

2024-03-08 16:03:17 668

原创 git上传了一个文件到远程仓库里面,之后如何忽略它

我们可能会遇到这种情况,因为一些失误或者别人的粗心,将一些本地的文件上传到了远程仓库,而且这个文件是环境相关的,随着不同开发者的环境,编译器会动态修改,从而导致每个人都不同。如果你之前已经将文件上传到了远程仓库,你需要使用 Git 命令从远程仓库中删除该文件。这将从 Git 索引中删除该文件,并阻止 Git 跟踪它。但是请注意,这不会删除实际的文件。在提交过程中相互覆盖,而且影响运行,应该怎么做呢,现在提供解决方案。现在你的远程仓库应该已经忽略了该文件。的文件,可以在文件中添加一行。文件提交到远程仓库。

2024-02-27 17:42:23 581

原创 LiveData底层实现

提供了一个简单而强大的机制,使得数据在组件之间的通信变得更加容易和可靠。同时,它也遵循了生命周期的管理,避免了内存泄漏和不必要的数据更新。这样可以确保观察者能够接收到最新的数据,即使它们在数据变化之后才注册。使用了弱引用来引用观察者,这意味着如果观察者没有被其他引用持有,它将会被垃圾回收,避免了内存泄漏。是一个可观察的数据持有类,它可以在数据变化时通知注册的观察者。会确保通知观察者是在主线程执行的,以保证 UI 更新操作在主线程进行。的生命周期状态,并在相应的生命周期状态下决定是否分发数据更新通知。

2023-09-19 12:47:03 181

原创 ArrayMap 和 HashMap的区别

都是在 Android 开发中常用的数据结构,用于存储键值对。它们之间的主要区别在于内部实现和适用场景。在 Android 开发中,根据具体的场景和需求选择合适的数据结构非常重要。可能是一个更好的选择。但如果你处理的是大规模数据集,并且需要高效的查询操作,那么。总的来说,如果你处理的是小型数据集,并且对内存占用有较高要求,那么。

2023-09-19 12:41:25 383

原创 lock和synchronized的区别

综上所述,选择使用Lock还是取决于具体的需求和场景。通常来说,如果只需要简单的同步控制,已经足够了。如果需要更高级的锁定机制、性能优化或者其他特殊需求,可以考虑使用Lock接口。

2023-09-19 12:32:15 191

原创 基于ConstraintLayout的增强布局,专注于过渡动画实现的动画框架:MotionLayout

继承自,布局内容的写法就完全遵循ConstraintLayout,布局就交给了ConstraintLayout是一个动画框架,专注于实现过渡动画Android动画分类:View 动画API 1 加入帧动画补间动画属性动画API 11 加入调用方式:使用 ObjectAnimator 或 ValueAnimator 来对布局的属性进行动画处理也可以使用 View 的 animate() 方法来执行动画。这是一种更简洁的方式,但背后实际上也是在使用属性动画过渡动画API 18 加入。

2023-09-15 17:59:12 137

原创 Android 拖拽的两种方式以及他们的区别

可以不需要自定义view,只需要设在这个监听,以外挂的形式实现,

2023-09-14 19:05:58 229

原创 View绘制流程的源码所得

子线程不是不能更新UI,而是谷歌工程师不让我们在子线程更新UI,是一种代码级别的约定,因为如果任意线程都能更新UI,那么系统工程师就需要做线程安全,每次更新UI都得执行加锁、解锁操作,浪费性能,还得考虑各种意外情况出于成本考虑,强制让开发者在主线程更新UI,能解决掉非常大的性能问题和巨量的工作,所以说不允许在子线程更新UI。

2023-09-12 22:50:15 198

原创 布局过程的完全解析

那么为什么要分为两个流程呢因为测量流程是一个复杂的流程,有时候不一定一遍就能得出测量结果,可能需要2 - 3次甚至更多需求:实现一个正方形的ImageView这样可以实现我们的效果,但是为什么不能这样写呢?因为这是父View在他的OnLayout方法中会调用字view的layout,让子view将自己的尺寸保存下来,而我们在这个过程中修改了自己的尺寸,父view是不知道的,后续的过程中父view会一直认为我们的尺寸是他传给我们的那个,会发生意想不到的效果。

2023-09-10 23:14:00 105

原创 Xfermode的完全使用解析

然后再绘制一个圆形,重叠在一起,圆形之外的部分透明显示。作用:将不同的绘制内容结合到一起。

2023-09-09 14:14:25 126

原创 一:图形的位置和尺寸测量

如果要确定一个点是在内部还是外部,那么就从这个点像任意方向发送一条射线,这条线遇到左旋(逆时针)路径就+1,右旋路径就-1,最终结果无论正负,只要不为0,那么这就是一个在内部的点。,Direction主要是用来处理两个图形相交处的样子,通过Direction的配合使用,可以使图形相交地方之处实现实心还是镂空的效果,这里有一个标准。第二个参数的作用是是否要自动闭合,如果一个图形假设是个半圆,那么测量的就是这个半圆的长度,如果是true就是半圆+起始点连接线的长度。举个例子,一个圆和一个方相交。

2023-09-08 15:18:22 229

原创 自定义 View:多点触控 (三)-- 各自为战

这种情况不是很少的奇葩使用场景,只是比较少而已,还是有这种需求的,比如说一个画板功能,就需要每个手指去做自己的事情。接下来就是记录手指移动的路径,在落下、移动时记录下,仅做演示使用,在手指抬起的时候进行清空。OK,以上就完成了,接下来我们实现多指的效果。多指就意味着需要记录多指的路径,这里使用。那好,我们就来一步步实现一个画板的功能。来记录,比较简单,直接贴最终代码。,还有经过的路径要记录下来。我们先来实现一个单指的效果。既然是画线,那我们需要。

2023-09-06 14:50:01 94

原创 自定义View:多点触控(二)-- 多指协作

以上就是计算一个焦点的过程,可以发现,焦点计算出来之后,本质是View跟随这个焦点移动,具体有多少个手指都没有关系了,所以说又成了最初的单指操作。如果不处理的话,在有新的手指按下的时候,会瞬间改变焦点的位置,会导致图片瞬间移动,所以说我们还是需要处理多指的。但是这里的处理就不需要那么复杂了,不管是第几根手指按下还是抬起,都只需要做相同的事情,也是之前单点触摸的逻辑:重置焦点坐标。,之前我们讲过,这个获取的数量是包括正在抬起的手指的,所以说我们手指抬起的时候,返回的数量和实际的数量是对应不上的。

2023-09-06 12:26:31 113

原创 自定义 View:多点触控 (一)-- 手指接力

这里面没有处理多指操作,当我们两个手指同时进行操作的时候,会发现效果是这样:第一个手指正常操作,第二个手指放上去开始滑动但是没有反应,只有当第一个手指移除,才会响应第二个手指的操作,当第一个手指放回时,第二个手指立即失效,直接响应第一个手指的操作。每一个事件都会对应一个坐标,而事件是由手指触发的,也就是对应一个point, 也是站在View的角度来说,是针对View的。那么,默认的多指操作是上面的哪一种呢,很遗憾,都不是,我们可以运行我们上一篇文章讲的,获取的,这也就解释了事件序列集中的所有参数的作用。

2023-09-06 00:06:14 118

原创 一个跟随手指滑动的图片 -- 单点触摸

运行以上代码,会发现在第二次进行拖动操作的时候,图片会跳到左上角,开始跟随手指移动,并不是从上一次拖动的结束位置继续的,所以说我们还要计算下结束时的位置,在移动的时候加上上次的位置。但是实际运行中会发现,拖动刚开始会闪一下,而且总是图片的左上角在我们手指的位置跟随手指移动,而不是我们按下的位置跟随手指移动。在上面代码中,我们在移动事件中,将移动的坐标实时保存在变量当中,然后触发重绘,在绘制方法中,也配合使用更改后的坐标变量。这是因为我们的手指坐标传递给的是图片的左上角,如果要实现按下的位置跟随手指移动,

2023-09-05 21:10:21 110

原创 Android 小组件功能开发

Android小组件(App Widgets)是从Android 1.5(API级别 3)开始引入的特性。它们是一种用于在Android设备的桌面上显示简单信息和提供有限交互的功能组件。小组件允许开发者将应用的部分内容或功能以简洁的形式展示在设备的桌面上,而无需用户打开整个应用。用户可以通过长按桌面来添加、移动和删除小组件。自从Android 1.5引入小组件以来,它们一直是Android系统的一项重要特性,让用户更轻松地访问常用信息和快速执行操作。

2023-08-07 09:43:07 1987

原创 Git fork了别人的仓库,别人的仓库有更新,我们如何同步这个更新

现在,你的GitHub仓库应该与原始仓库保持同步了。重复上述步骤,以后都可以保持同步。记住,定期拉取上游仓库的更新是很有必要的,这样你的代码库将与原始仓库保持最新。

2023-07-24 18:16:39 4762

原创 在android开发环境中,gradle 版本和 java 版本的对应关系

在android开发环境中,gradle 版本和 java 版本的对应关系。

2023-06-01 16:45:27 6222 1

原创 Unsupported Java. Your build is currently configured to use Java 17.0.6 and Gradle 6.8.3.

关键是知道发生了啥,精准的结果,然后才能知道可能的解决方案。

2023-06-01 16:43:23 22073 5

原创 Android 事件分发机制

这里的事件指的是 View 对手势的响应,这里的手势包含四种事件说明手指初次触摸屏幕时触发手指在屏幕滑动时触发,会多次触发ACTION_UP手指离开屏幕时触发事件被上层拦截时触发一次 ACTION_DOWN --> ACTION_UP 流程称为一次事件一次事件的消费 View 只有一个。

2023-05-24 02:58:42 426

原创 Android 历代版本主要变化

这里只站在开发者的角度,谈论一下 Android 5.0 之后的版本的主要变化。

2023-05-06 00:13:50 1463

原创 HashMap 的特点及其优缺点以及底层实现

Hash:散列Map:映射顾名思义,是以 key-value 的形式存储数据通过源码可知,他是一个类型为 key-value 形式的数组,key 的 hash(不仅仅是取hash这么简单,后续会讲)值决定了数据应该存放在数组的哪个下标里面,存放在数组里面的数据格式为链表,在 jdk1.8 中极其之后,数据格式引入了树型结构,会在一些特殊情况下发生链表与红黑树的相互转换。

2023-04-21 00:22:18 634

原创 LinkedList 的特点及优缺点

在 LinkedList 中,使用 first 来记录第一个节点,使用 last 来记录第二个节点,当只有一个元素的时候,两个节点的值一样。LinkedList 的优点:增删快,不需要考虑扩容,只需要记住前一个和后一个节点就可以了。因为以上继承实现关系,所以说 LinkedList 的方法特别多,但是主要的有9个常用方法。LinkedList 的缺点:查询慢,即便是知道索引,也得从头或者从尾一个个查询。LinkedList 是链表集合,基于链表去存储数据,每一个数据视作一个节点。

2023-04-20 18:34:16 1025

原创 ArrayList 的特点及优缺点

前面讲过,数组有很多缺点且使用不太方便,但是我们存储数据的时候很多情况又不得不使用它,那么有没有对数组封装一下的类,让我们更方便呢?ArrayList 的特点:有序、可重复、可存 null 值ArrayList 的优点:查询快,知道索引瞬间查到,他是所有集合当中查询速度最快的ArrayList 的缺点:增删慢,因为之前提到过数组一旦创建长度就固定了,在使用的过程中,不能更改,所以说数组一旦满了就得扩容,扩容的操作是先创建一个原来容量1.5倍的新数组,然后将之前数组的元素拷贝到新数组中来,再添加新数据。

2023-04-20 16:14:52 1035

原创 集合的设计

为了防止读起来特别痛苦,我们把以上方法做一些分类,大约可分为三类:修改操作、查询操作、批量操作。

2023-04-20 15:42:10 92

原创 集合存在的意义是什么

如果给你一堆数据,你如何保存呢?可以给每一个数据声明一个变量保存,数据量少的时候是可以的,多了就疯了,而且也不便于计算,还需要每一个开发者记住每一个数据的变量名称,说明这样是不可取的。那么使用数组呢?数组有一个致命的特点就是创建的时候需要指定其长度,并且在使用时长度不可改变,我们的数据量是根据现实时间及业务发展的,不可能是不变的,所以说我们需要一个拥有可变长度的容器来存储这些数据,那么,集合的概念就顺理成章了。

2023-04-20 15:15:36 106

原创 Java 线程安全(四)-- ReentrantLock

两个线程就有四种情况,两个线程随机进行操作的时候,哪些组合是被允许同时存在,哪些是不行的呢?,Java中还有别的方式来保证数据资源安全。之间的代码不会抛出异常,如果抛出异常,则。的时候,他就没必要加锁,加了锁性能就降低了。永远得不到执行,就会永远处于锁住的状态。来执行加锁和解锁来保证数据安全。...

2022-07-29 15:16:33 151

原创 设计模式之 -- 单例模式

单例的意义是保证每次拿到的都是同一个对象

2022-07-29 14:43:59 154

原创 Java 线程安全(三)锁的几种情况

读出一个数据,对这个数据进行运算操作,然后将此数据写回到数据库中,假如说在读出和写回期间,有人修改了这条数据,如果我们之间将结果写回的话,那么就肯定不准确了,只能再读出来再运算后写回去。我们判定这种情况不会经常出现,采用以上乐观的方式去处理这个问题,提高性能,这种情况我们称之为乐观并发控制。...

2022-07-29 14:14:53 163

原创 Java 线程安全(二)-- synchronized

方法可以很清楚的看到跟另外两个方法没有关系,我想在另外两个方法当中的一个被调用的时候,这个方法也能被同时调用,应该怎么做呢?不管跟当前方法中的变量有没有关系,都不能被调用了,为的就是防止出现以上加法和减法同时操作相同的变量时导致的数据不同步的问题。如代码所示,三个方法有可能同时被不同线程调用,尤其是加法和减法,同时被调用会导致数据同步异常。,创建标记的原因,因为只起到标记的作用,所以说用任何对象来标记都行,使用。方法的原因,首先是,刚刚已经说过这样做的好处了,那是如何实现的呢?方法被调用了,剩下的所有的。.

2022-07-29 11:44:17 115

原创 Java 线程安全(一)-- volatile

而在这里,主线程持有此变量,子线程在执行时候,将值拷贝了一份到自己的内存中,然后子线程并没有做值的修改,并不存在将值同步给主线程的过程,而此值的持有线程是主线程,主线程在更改完此值之后只会同步给自己,并不会同步给子线程,所以说子线程的值永远为最初拷贝走的值,永远为true,就永远不会停下来了。从代码来看,两个线程分别对同一个数进行一百万次从自增操作,无论谁最后执行完成,理论上来讲,总有一个线程打印出来的结果是两百万,但实际的运行效果,无论执行多少次都没有两百万的结果出来。到目前为止,线程安全除了加。....

2022-07-28 18:17:32 769

原创 Java 多线程的几种实现方式(三)-- Callable

那么现在就有一个问题,子现场是耗时操作的,他的返回值返回给谁用呢,主线程如何不阻塞的情况下拿到子线程的返回值呢?()去取值,这里的取值,是阻塞式的,能保证我们值的可靠性,这是Java在API层能做到的上限了。其中,future提供一种方法让主线程能够主动去询问后台线程是否执行完毕,他就是future.(callable)中,executor调用的不是。首先,executorService.(callable)而是。然后配合future.我们接下来解释这个问题。......

2022-07-27 17:43:13 536

原创 Java 多线程的几种实现方式(二)-- Executor

Executor给他一个Runnable,他就能自动很安全的帮你把这个线程执行完毕Executor是一种非常简单的线程池创建方式Executor并且有两种结束方式,shutDown()和shutDown会将当前正在执行的和排队中的线程执行完毕后结束,并且不允许有新的线程加入到待执行队列中Executor有五种创建线程的方式.........

2022-07-27 16:18:48 908

原创 Java 多线程的几种实现方式(一)

但在主流方式中,以上两种都不推荐使用,主要的原因是,线程的管理不方便,造成线程混乱等现象。

2022-07-27 15:46:51 471

原创 ConstraintLayout 几种复杂布局的实现

特殊的布局,layout_constrainedWidth

2022-07-18 17:05:35 236

原创 ConstraintLayout 简介

Android第六大布局,约束布局,一定程度替代了前五大布局。使用原则线性布局的效率还是值得肯定的,在不嵌套的前提下,如果用鲜血布局更简单还是推荐使用;完全代替相对布局。

2022-07-18 16:21:47 231

原创 APK解析签名错误 无法获取签名信息,请上传有效包

现象国内上架应用市场,新版本的 Android Studio (白狐之后的版本)出来的包在有的应用市场会出现以上的问题,但是我们自己查看包信息的时候都是有的,这是什么情况呢?原因新版本的 Android Studio (白狐之后的版本)没有签名选项了,出来的包只包含了v2的签名,本质是其实是配合 Google Play 的应用开发工具,所以说他的标准是对应的 Google 市场。锅由于一些国内市场没有及时跟进,只支持v1的验证,导致了新出来的包无法解析签名,从而爆出以上问题解决方案使用老版本

2022-03-09 15:15:38 5105

原创 Chronometer 倒计时控件,你搜到的用法可能全是错的

Chronometer 是 android 官方推出的计时控件,用法非常简单 <Chronometer android:id="@+id/tvCountTime" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textColor="#F

2022-02-17 18:13:28 3141 3

原创 Kotlin 的几个常用标准函数

kotlin 的标准函数指的是 Standard.kt 文件中定义的函数,任何 Kotlin 代码都可以自由的调用标准函数letlet 配合 ?. 来使用进行判空辅助,表示如果目标变量不为空,则执行括号中的内容val str: String? = "abc"str?.let{ -> it it.toString()}withwith 同时接收两个参数,第一个参数可以是任意类型的对象,第二个参数是一个 Lambda 表达式with 函数会中 Lambda 表达式中提供第一个参数对象

2021-10-06 18:55:55 248

空空如也

空空如也

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

TA关注的人

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