自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(28)
  • 收藏
  • 关注

原创 启动动效流程梳理(一)

因为项目涉及一些启动相关的方案,以及平常处理问题的时候会遇到很多启动响应的问题,所以对启动动效的拉起流程进行一个全面的梳理,同时也借此即会对U版本的动效流程做一个初步的了解吧。启动的流程就先不展开细说了,直接跳到开启启动动效处理的地方。在代码(1)处,创建了一个动效的Transition类的对象,这个Transition类表示的是视图树中,从一种状态过渡到另一种状态的过渡动画。

2024-09-10 08:00:00 991 1

原创 Binder(一):概述

其实现在的Binder封装的都比较完善,我们在系统侧都是直接通过一个封装好的类去调用就行,基本都是封装成了Aidl接口,一般就是Server侧实现一下Aidl的stub类的方法,然后Client侧调用代理类,代理类虽然和Server侧的类的方法啥的名字都一样,但是代理侧肯定是不能真的实现函数的,代理类的主要功能就是将参数啥的统统打包,然后发送给Server侧,等Server侧调用对应的方法,再将处理完的数据返回就好了。不过看了这个简易的流程,就会有一个疑问,进程A为什么就跟进程B通信,不能是进程C、D呢?

2024-09-06 10:00:00 833

原创 WCT系列(五):addTransactionCommittedListener

可以看到在构造函数中只有一行代码(9),这里其实就是给Transaction赋了一个id,如(11)处所示,其实和我们的上层代码中的SyncGroup的构造有点相似,不过他加入了线程的pid,放在了64位int数据的高32位,低32位则是一个自增的idCounter。此方法是类SurfaceComposerClient的一个内部类Transaction的构造方法,查看其定义在SurfaceComposerClient.cpp中,这些类的声明在对应的.h文件中,就不去一个一个说了。

2024-09-01 03:56:01 870

原创 WCT系列(四):BLASTSyncEngine

***/根据定义,BLASTSyncEngine有这五个功能:1)开启一个syncset,同时传递一个listener,int id startSyncSet(TransactionReadyListener) 这里的ID将会被放在一组准备好的WindowContainer中传递给TransactionListener。而这就意味着这些WindowContainer已经调用了onTransactionReady。

2024-08-30 19:00:41 392

原创 WCT系列(三):WindowOrganizerController

在上一篇代码分析中,知道了在应用侧创建的WindowContainerTransaction会通过WindowOrganizer中的applySyncTransaction方法发送到系统侧,然后再系统侧维护的窗口管理库中应用这些修改。方法有点长,但是其实一大半都是注释,首先还记的在WindowOrganizer中调过来时,这个参数列表中的Callback和t分别是什么吗?答案是SyncCallback中的mWCT和SyncCallback的this。

2024-08-21 01:57:29 1011

原创 牛客岛屿数量

这题比较简单,就是一个递归调用的问题,1代表陆地,相邻的1属于同一个岛屿,也就是要找到一个为1的点a,然后向其四周进行搜索,找到为1的点b,然后继续由b点向四周搜索。于是就可以开始着手实现代码了,不过还有一个问题,就是搜索的时候得保证每个点都在矩阵范围内,同时因为搜索的方式是固定的朝向四个方向,操作就是坐标(x,y)分别和{0,1}, {0,-1}, {1,0}, {-1,0}这四个组合进行运算。题干:给一个01矩阵,1代表是陆地,0代表海洋, 如果两个1相邻,那么这两个1属于同一个岛。

2024-08-20 23:14:50 306

原创 WCT系列(二):SyncTransactionQueue类详解

1)、根据需要修改的地方构建WindowContainerTransaction类对象wct;2)、通过wct构建SyncCallback类对象cb,然后将cb放入SyncTransactionQueue类的对象mQueue中;3)、调用cb的send()方法,通过WindowOrganizer的applySyncTransaction方法,将wct传送到系统侧;

2024-08-18 21:01:13 785

原创 买卖股票的最佳时机

不过如果在n 和 m点之间有一个极大值p点,能让f§ - f(n)很大,以至于m点之后,没有哪一天卖出的利润能比f§ - f(n)更大,那么在以n点为买入点,且p点为卖出点这一情况的值其实已经被记录到res中了,后面再以m点为买入点,计算利润时也会以此为对比,看是否需要更新res的值。这里也画了一个图,m点后的黄色那一段,就表示了,没有卖出点能让利润比p点更大了。你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。

2024-08-18 15:31:07 274

原创 牛客 BM70 兑换零钱

题目:给定数组arr,arr中所有的值都为正整数且不重复。每个值代表一种面值的货币,每种面值的货币可以使用任意张,再给定一个aim,代表要找的钱数,求组成aim的最少货币数。如果无解,请返回-1.数据范围:数组大小满足 0≤n≤100000≤n≤10000 , 数组中每个数字都满足 0

2024-08-18 00:15:20 652

原创 WCT系列(一):WindowContainerTransaction类详解

windowContainerTransaction类的对象是用来存储对windowContainer的修改的一个集合,windowContainer。因为应用侧是无法直接操作windowContainer的,如果应用侧需要修改windowContainer的话,需要通过系统侧对windowContainer进行修改,这就涉及了信息的跨进程传输了。所以首先,WindowContainerTransaction类应该是一个磕跨进程传输的类。看到定义:也证实了这个猜测,其实现了Parcelable接口。

2024-08-16 01:28:31 1047

原创 Android帧绘制流程深度解析 (二)

整个帧绘制的流程还是比较复杂的,但是我也在这个过程中,对消息机制等知识点,在流程中进行更加详细的分析和讲解。其中可能也存在理解不到位的地方,还希望大家多多指正。

2024-06-13 00:00:36 967 1

原创 Android帧绘制流程深度解析 (一)

本文重点记录代码的学习笔记。

2024-06-12 01:15:09 896

原创 理解lambda表达式

这里就是一个场景加一个方法的组合,场景是有困难,然后方法时去找师兄师姐,但是场景很多啊,你可能刚上手就不会,也可能是做到一半遇到问题,亦或者是做到最后一步,不知道怎么总结,那你请教的内容必然也不会相同。这里的talks方法是无参函数,所以就直接传一个 () 再加上符号 -> 然后通过{}将方法体包含住,所以在看到lambda表达式的时候,如果还不熟悉,不理解其含义,可以先将其逆转为匿名内部类,这样就会好理解很多。这里反而是到使用的时候再定义,这不就可以根据我们的场景来定义方法的功能了嘛。

2024-05-31 23:15:49 667

原创 WindowManager相关容器类

窗口中容器类介绍:本节内容较多,建议结合前面的内容一起阅读:1、2、3、

2024-05-31 00:39:03 971 1

原创 addWindow的宏观概念

3、 然后在屏幕上显示窗口的时候需要有一个先后顺序,所以对WindowState也会有一定的排序,而且在使用窗口的时候,还会把相同类型的窗口聚类到一块,通过一个WindowState的容器进行统一的管控,即统一的类WindowToken,不过WindowToken是系统窗口的聚类,应用窗口的聚类则是ActivityRecord。在前一节讲了窗口的排序逻辑,分别是应用窗口、系统窗口、和子窗口,但是这里讲的比较散,没有一个宏观的概念。关于DisplayContent中排序的算法,最好的方法就是直接看代码。

2024-05-10 23:56:56 742 1

原创 WindowManager#addView_1

在详解。

2024-05-10 02:15:50 948 1

原创 WindowManager#addView_2

WindowManagerService是SystemServer中的一个服务,主要功能是管控窗口的服务,在各个应用进程中都有自己的代理,WindowManager(也可以说WindowManagerGlobal), WindowManager和WindowManagerService之间的沟通则是通过IWindowSession的子类Session类完成,在ViewRootImpl类中会持有一个IWindowSession类型的对象mWindowSession。

2024-05-09 01:30:40 1840

原创 Java继承学习笔记

静态类是在类加载的时候就会初始化,static方法会存放在静态区,这个方法是属于类的,可以通过类名去访问。深入点的解释就是,通过super调用到父类方法后,其实栈帧还是在子类对象中,所以在父类方法中调用到其他方法时,查寻方法表的时候,查的还是子类的方法表。Java中规定,实例化子类对象的时候,必须调用父类的构造方法,再调用子类的构造方法,所以其实在子类的构造方法的第一行是有一个隐式的调用super()的, 我理解的应该是子类要想继承父类的方法和属性,所以必须先有一个父类,所以必须先初始化父类?

2024-05-07 01:16:27 288

原创 Android消息机制

综上,举个例子,再线程A中希望发送一个消息给到线程B,那需要做什么呢?1、 创建一个Handler,关联到线程B的Looper,这里有两个方案:直接再Handler构造函数中传入B的looper、 再线程B中创建Looper再从线程A中获取到该Handler B;2、 生成需要的Message消息;3、 通过和线程B的Looper关联的Handler B,将消息发送出去;

2024-05-04 01:52:28 603 1

原创 addView方法的不同实现

关于addView方法,我说下我的理解,首先说明下这个方法的起源,addView方法的声明在ViewManager.java中。这里插入一个类图,方便起见我就用自己之前画的一张图,可以看到,有两个类都继承自ViewManager类,分别是ViewGroup和WindowManager。根据子类的实现分别看下他们继承了addView之后是怎么实现该方法的。

2024-04-30 02:19:54 486

原创 连续调用两次setContentView操作UI界面

其实这个问题从trace文件就可以看出来了,再onCreate方法,其实在perffeto中就很容易就看到了,在启动的trace中onCreate这个Tag是在帧绘制之前就完成的,那我们看到界面的前提不是得是帧绘制完成了嘛,所以在onCreate方法中的setContentView是可以修改应用界面的布局,但是他只是修改界面的布局的参数,这时候界面还没绘制,界面最终的显示,还需要将这个布局参数交付给doFrame流程进行绘制和SF进行合成渲染最后送显完成显示。

2024-04-27 16:56:17 196 3

原创 WindowManager家族的复杂关系

这是因为Window就是一个抽象的类,我们要管理Window,自然就想到了WindowManager了,顾名思义嘛,window的管理者。所以这里也有个addView方法是从ViewGroup这里继承来的,所以ViewGroup其实和WindowManager的addView方法都继承自ViewManager,他们就像兄弟一样的关系,只不过ViewGroup里的addView方法添加的是View,WindowManager里的addView方法添加的是Window罢了。这里方法实现太长,只看关键部分。

2024-04-27 16:30:21 939

原创 一文搞懂Activity、Window和View的关系

对了,那window就可以类比成一张纸,在纸上我们就可以画画了,那画是不是就可以比作我们看到的手机界面了。那这里就涉及到了一个管理的类了,WindowManager,WindowManager是接口,所以需要实现后才能实例化,而唯一实现这个接口的就是WindowManagerImpl类,不过WindowManagerImpl类其实就是你那个什么都不会的领导,最后的活都是苦*的你来干,也就是WindowManagerGlobal,这里要是再详细说就要一点功夫了,今天先说到这。理解了这些概念就该看代码了。

2024-04-26 01:45:10 1129 1

原创 ViewRootImpl到底是什么

看这里,FrameLayout就是继承自ViewGroup,而ViewGroup又实现了ViewParent,其实我们常见的View都是继承自View并且实现了ViewParent,所以这里就可以看到ViewRootImpl和View是不一样的东西,而ViewRootImpl之所以能作为DecorView的ParentView就是因为他实现了ViewParent,所以他是可以作为View的父节点的,因为父节点的类型只要是ViewParent就行。然后再看到这里,很明显了吧,已经把view赋值给root了。

2024-04-24 01:16:26 347

原创 2020-12-01

写代码时碰到一个问题,想问问各位大佬为什么,下面的步骤是U的行列式是-1,V是-1, 2U*2V却等于3? Eigen::JacobiSVD<Eigen::Matrix3d> svd_slover(covge,Eigen::ComputeFullU | Eigen::ComputeFullV); MatXX U = svd_slover.matrixU(); MatXX V = svd_slover.matrixV(); MatXX D = svd_slover.singularValu

2020-12-01 11:09:38 121

原创 Jetson Xavier刷机以及安装ros

Jetson Xavier刷机以及安装sdkmanager最近入手一个xavier,刚到手随意弄了下,然后不知道怎么了就出了问题,sudo apt-get update报错,问了技术人员他们也不清楚,所以推荐我刷机…(很无语,如同网管的重启).于是我开启了自己的刷机之路,不断摸索花了我三天时间(主要是慢,而且报错,客服不理…)所以这里把自己踩得坑说一下,防止大家踩坑.这里参考了两篇博客,很不错的https://zhenkai.blog.csdn.net/article/details/1007023

2020-08-14 14:51:04 551

原创 在ubuntu16.04中通过vins-fusion跑含有gps信号的kitti数据集

在ubuntu16.04中通过vins-fusion跑含有gps信号的kitti数据集安装vins-fusion这里是vins-fusion的github连接:https://github.com/HKUST-Aerial-Robotics/VINS-Fusion这里没有什么问题,按照连接的指示来就行运行kitti数据集首先是下载kitti数据集,这部分必须翻墙,如果不想翻墙也可以通过我分享的百度云链接:复制这段内容后打开百度网盘手机App,操作更方便哦 链接:https://pan.baidu.

2020-07-23 21:00:41 4671 35

原创 用小觅双目相机跑ORB-SLAM2

用小觅双目相机跑ORB-SLAM2首先是安装ros和小觅相机的SDK,安装ros这里就不再说明,其他博客都有,SDK也是在小觅官网上的,安装好了以后,创建工作空间,随意在一个文件夹下打开终端,输入mkdir catkin_wscd catkin_wsmkdir srccd srcgit clone https://github.com/slightech/MYNT-EYE-ORB-SL...

2019-12-05 14:14:53 1821

空空如也

空空如也

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

TA关注的人

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