
android
文章平均质量分 92
古嘉明同学
不务正业的研究生,会安卓的程序员
展开
-
同学们上课,今天我们学习:UI 操作一定要在 UI 线程吗?
叮铃铃,叮铃铃,“今天没有BUG”小课堂打铃上课了,一位长相极其帅气的讲师进入教室,教室中间,路人甲、乙、丙三位同学头戴红领巾坐下,双手平放在桌上准备认真听课。老师在黑板写下今天的问题:“更新UI的操作,一定要在 UI 线程中进行吗?不在 UI 线程可不可以?”同学甲回答:众所周知,更新 UI 的操作一定要在 UI 线程进行,否则程序会崩溃。老师点点头,在黑板上奋笔疾书,让同学们检查下面这段代码:<RelativeLayout xmlns:android="http://schemas.and原创 2022-05-09 16:08:16 · 1129 阅读 · 4 评论 -
一个解决滑动冲突新思路,做到视图之间无缝地嵌套滑动
在此文章开始之前,我想抛出一个问题:如何解决滑动冲突?用传统的思路解决,你可能会从 View 的 onInterceptTouchEvent() 和 onTouchEvent() 方法入手,根据业务的情况以及手指滑动的方向,按需拦截事件来解决视图之间的滑动冲突。这种思路没有错,可以完美解决视图之间的滑动冲突。但这种思路有个局限,它无法解决嵌套滑动问题。为什么呢?因为目前绝大多数的滚动组件(RecyclerView,ScrollView,ListView等),我们翻看它们的源码,都可以看到它们在处理原创 2022-04-26 00:00:01 · 2975 阅读 · 3 评论 -
QQ主页抽屉效果实现,有趣的弹簧动效
最近在测试机玩QQ的时候,留意到QQ主页上抽屉的动画效果,觉得挺有意思,今天就来实现以下QQ主页的抽屉动效。抽屉打开的时候,可以看到主页是有两个动作:主界面收缩主界面四周圆角度数变大接下来就一步步实现QQ抽屉打开时的效果。原创 2022-01-21 10:50:36 · 3335 阅读 · 2 评论 -
实现项目组件化必经之路:解耦,再解耦!
一个组件化的项目,会将业务进行细化的拆分,通用的功能封装在通用的模块中,不同通用功能模块之间是平级的关系,不同的业务模块会按需依赖其中几个通用模块。如上图所示,业务A无法调用业务B中的API,同样业务B也无法打开业务A中的页面,这两个业务模块是独立的,通用模块之间也是如此。模块间如果需要访问API,得建立强依赖关系,项目的耦合度会变得非常高,通用模块因为需要多种依赖而失去了它通用的特性。因此我们需要一种松耦合的方式,建立平级模块间的通信方式,实现组件化。模块间需要通信的场景有很多种,例如访问页面,原创 2021-09-08 22:26:12 · 1259 阅读 · 0 评论 -
设置页布局神器!有了它,开发设置页简直是享受
背景故事最近写到一个设置页的需求,里面加起来有十多项设置,每一项设置都有相应的业务逻辑。刚开始,我说成,设置页嘛,简单,新建个布局文件,编写一个个layout,后来发现有很多设置项布局是一样的,可以直接复制之前的,但复制多几遍后,我感觉不对劲,这些View都是一样的,我感觉一直在写重复的代码。不止如此,在代码进行数据初始化时,还需要给每个设置项定义id,然后通过id获取到各个不同的设置项,再进行相应的赋值操作。比如,我们要为每个设置项定义点击事件:如果只是定义点击事件还好,如果还涉及设置项的显示和原创 2021-08-06 00:35:46 · 191 阅读 · 0 评论 -
高端操作!实现RecyclerView的上下拖拽
写在前面最近工作强度好大,一天能敲10小时以上的代码,敲的我头疼。代码写多了,突然想起来,好像真的很久没发技术文了,原因有很多,就不说了。。都是借口,今天分享内容也是工作时遇上的一个小需求,觉得挺有意思,那就写篇文章吧! 需求描述大概是这样,一个页面有一个列表,列表里有很多item,需要支持用户拖拽其中item到不同的位置,来对列表项进行重新排序。要实现的效果大概如下:除去与业务相关的部分,我们只需关注如何让列表item支持上下拖拽就行,这也是这个需求的关键。我们组安卓岗在半年前已经全部用k原创 2021-07-01 15:42:56 · 2512 阅读 · 0 评论 -
理解TextView三部曲之番外篇:或许这会是最终的进化
额,为什么会有番外篇呢。。因为新版本上线后,别的同学用我的这个控件,描边显示出问题了-_-!什么问题呢?我把问题抽出来,同时把问题放大点,给大家看看(抹眼泪.png) 好嘛,问题不大。。就是描边歪了一点点,对吧。可是怎么会这样!?,我自己测根本就没有问题,压根就没出现过这样的问题啊。。(抹眼泪.png)我又去检查了一遍计算描边位置那块的代码,最初是以为其他同学一不小心该了那块的代码,导致描边位置计算出错了,结果发现,代码丝毫没有动过的痕迹。那怎么会描边出错呢?而且他描边出问题的地方,在我这里原创 2021-01-26 22:00:40 · 332 阅读 · 0 评论 -
LRUCache最最zhui易懂的解析,你还不来看看?
最近在研究图片加载框架Glide,里面的代码真是非常复杂,它包括了网络请求,图片缓存、异步回调,线程池还有对图片的处理等等的内容,其中图片缓存机制用到了LRUCache和弱引用结合的方式来构建。 LRU算法大家都知道吧,它会丢弃最近,最少使用的项目,从而保留使用频率高的项目,达到一定的使用优化效果。那么LRUCache,因为其特性,特别适合在安卓中来决策图片的缓存策略,避免OOM。 在此之前我对LRUCache只有大概的了解,知道其特性,但其内部原理我却没有深入了解过,所以今天就让我们好好看看LRU原创 2020-12-28 15:20:48 · 638 阅读 · 0 评论 -
随心所欲!做一个你自己的号码检查控件~
最近项目有个需求,需要有一个弹窗验证手机号的中间四位,大概长这样:就是一个简单的校验手机号的控件,原以为项目中以前应该也有做过,会有现成的可以用。结果找了半天,没有~,好吧,再想想之前自己体验过的类似的控件,好像实现起来也比较简单,那就自己做一个吧。先做个简单的版本,能完成需求就行,这也是这一篇的主要内容。首先分析一下布局,上面一个TextView,下面四个文字框,底部的两个Button先不考虑。主要是这四个文字框要怎么实现?我们想要实现的效果是用户每输入一个数字,就会依次填充在对应的框框里,原创 2020-11-04 20:58:00 · 237 阅读 · 0 评论 -
理解TextView三部曲(三):倔强的StrokeTextView(我无论如何都要展示出来!)
理解TextView三部曲(三):倔强的StrokeTextView(我无论如何都要展示出来!而且要美美的!)上一篇我们让StrokeTextView支持padding描边,如果有同学没有看过或者对上一篇内容有遗忘的,可以移步上一篇 理解TextView三部曲(二):支持Padding的StrokeTextView 按照惯例,在本篇开头会抛出上一篇优化后的不足,看看是哪里还有问题首先看第一张图,宽、高都是wrap_content的情况下,“18”左边的描边显示正常,但是右边的描边显然就被切了一块,原创 2020-09-09 21:10:35 · 1114 阅读 · 4 评论 -
理解TextView三部曲(二):支持Padding的StrokeTextView
理解TextView三部曲(二):支持Padding的StrokeTextView上一篇,我们实现了一个基本的StrokeTextView,能支持各种Gravity,本篇,我们就要在上一篇的基础上进一步优化,让StrokeTextView可以支持各种Padding,而它的margin我们不需要关心,因为margin是由父容器控制的。如果有同学不记得上一篇的内容,或者是新同学还没看过我的三部曲序列,可以点击下面的传送门阅读~:理解TextView三部曲概览理解TextView三部曲(一):Text原创 2020-09-06 21:06:23 · 620 阅读 · 0 评论 -
理解TextView三部曲(一):TextView的文本绘制过程
在概览中,我们已经介绍过了安卓的文本是如何绘制的,这部分是前导知识,如果有同学还对此有疑惑的,可以返回上一篇概览阅读。本篇,我们就要利用我们上一篇所学的文本绘制知识来实现一个简单的StrokeTextView,还记得要实现的效果图吗? 要实现的目标就是能够让StrokeTextView在不同Gravity的情况下,正确给文本描边我们知道要自定义View,有4种方式:继承自View继承自ViewGroup继承自特定的View,如TextView继承自特定的ViewGroup,如FrameL原创 2020-09-03 22:42:13 · 995 阅读 · 0 评论 -
理解TextView三部曲概览
最近项目中用到一个StrokeTextView的组件,主要是给文本内容添加描边的效果,从开始可以“描边”满足需求,到最后一步步优化成一个成熟的控件,StrokeTextView就像从一块地基变成了我想要的一栋大别墅,真是有辛酸有喜悦。这一次的优化,也是让我对TextView的绘制有了更加深刻的理解,这里总结成三部曲来记录完整的从开发到优化的过程,相信读者看完后也会对TextView的绘制有了更进一步的理解和把握。先来看看三部曲所分别要达到的效果:三部曲(一):上面这张是当width = 20dp.原创 2020-09-02 23:19:13 · 437 阅读 · 0 评论 -
RecyclerView实现上拉加载更多的正确姿势
最近项目上的需求需要实现下拉刷新和上拉加载更多的功能,RecyclerView下拉刷新我相信安卓的同学都会做,无非是利用SwipeRefreshLayout,然后给swipeRefreshLayout设置刷新监听,非常简单,所以这里不作赘述。上拉加载更多,除了必要的逻辑,还需要自己控制loadingView的显示与隐藏,ListView中有一个方法addFooterView()可以轻松实现,在需要显示loadingView的时候设置view的可见性即可。而RecyclerView中没有相应的方法,因此还原创 2020-08-18 23:26:10 · 8178 阅读 · 5 评论 -
ViewPager两大弊端优化方案
ViewPager两大弊端优化方案对viewpager熟悉的同学都知道,viewpager有2个弊端:一是不能关闭预加载,二是PageAdapter.notifyDataSetChanged()无效问题其中第一个弊端,不能关闭预加载相信很多人都知道原因了,所以这里不在进行解释,直接将源码放出来估计也能看得懂:private static final int DEFAULT_OFFSCREEN_PAGES = 1;public void setOffscreenPageLimit(int limit原创 2020-08-07 10:07:36 · 855 阅读 · 0 评论 -
2020腾讯春招安卓客户端面经(IEG)
在我PCG面凉了之后的第四天,也就是6.8号,我收到了IEG部门面试官的面试邀请,从那以后…我尽量把我的面试过程都详细的分享出来,给大家留个参考先整理一些我这次面试的时间线:6-8号预约的初试,6.9号一面,时长近40分钟6.11号官网更新面试状态,进入复试,6.12号预约的14号复试,6.14号复试,复试时长27分钟6.15号官网更新面试状态,进入HR面,未预约面试时间,6.17号上午11点HR小姐姐突击面试,时长27分钟6.17号上午12点左右官网显示面试状态已完成6.19号,上午10.原创 2020-06-19 18:10:47 · 1618 阅读 · 3 评论 -
2020春招腾讯安卓客户端面经(PCG)
2020春招腾讯安卓客户端面经(PCG)本来原计划是这个春季多准备下面试,准备7月份左右的秋招,然后从三月份开始刷leetcode的算法题,一天1-2两道题目,准备稳扎稳打的来。一连准备到了4月多,力扣也刷了接近100道。这时看着我的其他同学都已经搭上了春招的快车,都已经进入了各自的面试状态,再加上一位高中好友的怂恿,我忍不住了,也从4月开始了我的春招之路,美团、京东、腾讯啥的都投了一遍,最先给我面试的腾讯,也就是下文要介绍的,因为是大学第一次实习面试,所以即使在牛经Buff的加持下,我依然没有把握住这原创 2020-06-18 22:24:33 · 949 阅读 · 0 评论 -
源码分析Android的消息机制
一、引言 Android消息机制主要指的是Handler的运行机制,是一块很有意思,也很有研究意义的内容。本文计划在较短的篇幅内,通过一定的源码,分析Android消息机制,并在结尾说点”题外话“,帮助我们理解消息机制在安卓应用中的作用。二、Android消息队列与四大组件的关系 Android的消息机制伴随着安卓四大组件的生命周期,Activity启动,Service绑...原创 2020-05-07 23:36:17 · 555 阅读 · 1 评论 -
Binder工作过程和源码解析
一. 前言Binder是个很深入的话题,上到应用层,下到linux kernel底层,都能见到Binder的身影。要想用一篇文章对整个Binder的原理叙述清楚,是不可能的。本文从应用层的角度出发,为大家剖析Binder的工作过程。为了避免深入代码细节无法自拔,本文的源码解析也是点到为止,从一个整体上,让大家对Binder有更进一步的理解。二. 什么是Binder?直观来说,Binder是A...原创 2020-04-03 18:13:47 · 443 阅读 · 0 评论