自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

chengkun_123的博客

Keep learning and connet dots.

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

原创 CoordinatorLayout源码解析之初识Behavior

说在前面CoordinatorLayout(下面简称CL)是Material Design中的明星控件了,学习它的源码不仅可以更好掌握这个控件的使用,而且可以更好地理解其他诸如AppbarLayout、FloatingActionButton等控件,还可以学习到一些有趣的思想。可是当我像看其他ViewGroup(下面简称VG)的源码一样去看CL的源码的时候,我却发现了一个CL和其他VG最大的不同:几

2017-08-01 16:36:08 3462 5

原创 CoordinatorLayout源码解析之从NestedScrolling说起

概述CoordinatorLayout(下面简称CL)出来也有很长时间了,平常也仅限于API的调用,如果不知道其中的原理,出了问题也不好去解决。所以今次决定深入其内部一探究竟(…)。相比于RecyclerView的1W+行的源码,CL包含的内容算是少的了。但是本系列文章并不想从CL作为一个ViewGroup的角度去分析它的onMeasure、onLayout、onDraw和滑动等等,而是想从比较有特

2017-07-30 20:59:16 1207 1

原创 图文助你理解Binder

概述本文尽量屏蔽不影响理解的底层细节,因为太过深入的底层细节会让人深陷其中无法自拔,造成不能很好地从整体上对Binder进行把握。The WhatAndroid是基于Linux系统进行开发的,采用了进程隔离机制,每个进程都有自己独立的地址空间即虚拟地址,每个进程似乎都可以占满所有的内存运行,而实际上却访问的是不同的物理内存。也就是说各个进程之间数据相互独立,互不影响,一个进程崩溃并不会影响到其他进程

2017-07-22 11:29:54 469

原创 RecycleView源码浅析之Recycler+滑动

概述Recycler解决了两个哲学问题,VH从哪里来以及VH到哪里去,前两篇讲到RV的绘制流程和动画都回避了View的获取以及回收问题,其实是因为Recycler帮我们完成了而且封装得很好。这一篇就来看看Recycler是如何帮我们做到这些的,顺带看一下RV这个ViewGroup对触摸事件的处理。onTouchEvent()和ViewPager差不多,RV分为拖动和fling,scrollByInt

2017-07-13 17:07:24 1437

原创 RecyclerView源码浅析之数据更改与动画

概述上一篇我们针对RecyclerView的绘制流程做了简单的分析,重点放在了dispatchLayoutStep2()这个真正对子View操作的函数上,它完成了:子View的添加(LinearLayoutManager通过ChildHelper添加)、测量、布局。绘制流程虽然有了大概的了解,但却引出了很多问题:dispatchLayoutStep1()和dispatchLayoutStep3()有

2017-07-11 17:54:14 1480

原创 RecyclerView源码浅析之测量与布局

概述源码一万多行,是ViewPager的三倍多,如果不能把握住主线,会很容易迷失在源码的海洋。RecyclerView做得比ViewPager好的地方在于,它进行良好的封装和解耦,每一个类完成自己的功能,结构十分清晰。但是对于我们来说,如果不能对这些模块先有一个大概的的了解,那么阅读源码的常常会因为不清楚一个类的作用而不知所云。所以这篇文章的主线是解读RecyclerView的测量、布局和绘制,同时

2017-07-03 21:11:29 926

原创 ViewPager源码解析之FragmentPagerAdapter和FragmentStatePagerAdapter

从FragmentPagerAdapter说起我们经常使用的是ViewPager和Fragment的配合。在第一篇中我们提到了如果ViewPager使用了FragmentPagerAdapter,ViewPager添加View的时机是在onMeasure()的populate()中。//ViewPager.java@Override protected void onMeasure(int

2017-06-24 21:16:15 4873 1

原创 ViewPager源码解析之拖动和滑动

概述一个ViewGroup的滑动肯定和它的dispatchTouchEvent()、onInterceptTouchEvent()、onTouchEvent()有关。ViewPager重写了后两者,我们一个个来看。首先说明一下,ViewPager根据手势产生视图移动的方式有两种,一种是MOVE的时候随手指的拖动,一种是UP之后滑动到指定页面,而滑动是通过Scroller + computeScrol

2017-06-24 19:06:04 1231

原创 ViewPager源码解析之ViewPager如何呈现

概述经过上一篇Fragment源码的分析,我发现想要完全弄懂源码中的每一个点是不可能的,而且会让自己陷入细枝末节无法自拔,所以我认为在整体上先有一个感性认识,细节问题遇到了再去有针对性的解决是一个比较好的阅读源码的姿势。经过思考,我觉得还是像Fragment一样从API的调用来分析ViewPager的运行过程 会比较清晰。平常我们使用到ViewPager,一般会调用下面几个方法,如果是配合Fragm

2017-06-16 11:59:12 851

原创 Fragment相关源码解析二——生命周期

上次说到BackStackRecord的一系列操作其实是在内部形成了一个Op双向链表,commit() 方法调用后被加入到了FragmentManagerImpl的List中,随后会调用BackStackRecord的run()方法。在看这个方法之前我们首先要明确几件事情。Fragment的mState它代表了Fragment的状态,可能被赋值为如下几个值,被初始化的时候默认是INITIALIZIN

2017-06-15 21:32:02 751

原创 Fragment相关源码解析三——状态保存与恢复

这一篇单独来说一说Fragment的状态保存和恢复。状态保存只要Activity不是被主动finish的,状态的保存与恢复机制就会被触发,包括 :Activity因为内存不足被killed、其他命令杀死进程、手机配置改变导致的Activity重建(用户没有手动处理配置改变的情况下)。导致onSaveInstanceState(在onStop之前)和onRestoreInstanceState(在on

2017-06-01 16:41:26 968

原创 Fragment相关源码解析一——FragmentManagerImpl和BackStackRecord

原来一直只是使用Fragment,除了对一些常用API很熟悉外,对Fragment的内部原理还是不清楚,索性花了几天的时间,去阅读了Fragment相关的源码,从整体上对Fragment的框架有了一定深度的认识。当然,Fragment相关的类很多,Fragment内部的成员也很多,我目前还无法弄清楚Fragment的每一个细节,但整体上的正确认识有助于我们对细节的把握,也能对问题的查找、定位以及解决

2017-05-19 17:21:02 2058

原创 仿知乎悬浮功能按钮FloatingActionButton

前段时间在看属性动画,恰巧这个按钮的效果可以用属性动画实现,所以就来实践实践。效果基本出来了,大家可以自己去完善。首先看一下效果图:我们看到点击FloatingActionButton后会展开一些item,然后会有一个蒙板效果,这都是这个View的功能。那么这整个View肯定是个ViewGroup,我们一部分一部分来看。首先是这个最小的Tag: 这个Tag带文字,可以是一个TextView,但为了

2017-04-09 22:36:09 6674 1

原创 BlockingQueue浅析

概述concurrent包中,BlockingQueue不光实现了一个完整队列所具有的基本功能,同时在多线程环境下,他还自动管理了多线间的自动等待于唤醒功能,从而使得程序员可以忽略这些细节,关注更高级的功能。 生产者线程向队列插入元素,消费者线程则取出它们,使用队列,可以优雅地从一个线程向另一个线程传递数据。BlockingQueue常用方法 方法 正常动作 特殊情况下动作 put

2017-03-18 19:47:27 483

原创 剑指offer学习笔记(Java实现)(31-40)

题目31:连续子数组的最大和在数组中找一个连续子数组,使它的和最大。我的方法:利用一个local维护局部子数组最大和,一个global维护全局子数组最大和。因为子数组要连续,local[i]只能出现两种情况:加上当前a[i],即local[i] = local[i-1]+a[i];重新开始,即local[i] = a[i]。我们取较大的作为局部最大和。global[i]的取值也有两种情况:原来的最大

2017-03-18 19:26:22 368

原创 剑指offer学习笔记(Java实现)(26-30)

题目26:复杂链表的复制。定义一个新的数据结构,每个节点除了具有普通链表的next域外,还有一个额外的引用指向任意节点。我们要对由该特殊数据结构形成的链表进行复制。我的方法:也就是克隆一个这种特殊链表,很快想到先不考虑原链表sibling域,复制出一个新的链表,然后再去给sibling域赋值。由于sibling可以指向任何节点,而且我们是根据原链表的sibling来确定新链表中的sibling,所以

2017-03-18 19:16:17 569

原创 剑指offer学习笔记(Java实现)(21-25)

题目21;定义一个具有min函数(返回栈内最小值)的栈数据结构。首先这个栈要具有普通栈所具有的push()和pop()方法,那么内部一定包含一个Stack。至于还要能实现min函数,而且还是在O(1)时间复杂度内,我们不得不考虑用额外的空间。如果直接使用一个int变量存储当前的最小值,我们的确可以获得最小值,但是当栈pop()了以后,我们无法获得次小值。我们需要一个数据结构来动态保存每个时刻的最小值

2017-03-18 19:11:07 269

原创 ThreadLocal浅析

概述这里是基于java JDK1.8源码分析的。首先从整体上描述一下ThreadLocal:ThreadLocal中的ThreadLocalMap静态内部类使用的是线性探测表(散列表)作为数据结构。每一个Thread对象都持有一个ThreadLocalMap,该Map以ThreadLocal对象的引用作为Key来查询/保存/删除Value。一个线程中可以使用多个ThreadLocal对象来保存

2017-03-10 10:32:40 422

转载 深入理解Java内存模型(二)——重排序

原文链接数据依赖性如果两个操作访问同一个变量,且这两个操作中有一个为写操作,此时这两个操作之间就存在数据依赖性。数据依赖分下列三种类型: 名称 代码示例 说明 写后读 a = 1;b = a; 写一个变量之后,再读这个位置。 写后写 a = 1;a = 2; 写一个变量之后,再写这个变量。 读后写 a = b;b = 1; 读一个变量之后,再写这个变量。

2017-01-24 21:35:56 317

原创 剑指offer学习笔记(Java实现)(1-10)

题目3:二维数组中的查找 (二维数组,每行递增,每列递增。输入二维数组,一个整数,判断数组中是否含有此数)我的方法:拿到题目,根据题目条件我提取出这样一个特性:一个数的右边和下面的数都比它大。于是就可以写出一种递归的方法:从左上角开始寻找,针对当前被检查的数字,如果相等返回true;如果小于target我们继续向右和向下寻找;如果大于target就不必继续寻找下去了(因为我们向右或向下寻找只会继续增

2016-12-18 12:03:00 439

原创 LinkedHashMap、LinkedHashSet源码学习笔记

一、LinkedHashMap概述理解LinkedHashMap的关键点在于清楚HashMap的迭代并没有顺序,LinkedHashMap利用了一个额外的双向链表来维护一个特定的迭代顺序,而存储键值和HashMap一样用的散列表作为数据结构。HashMap的遍历得到的key并不是有特定顺序的。稍微回顾一下keySet方法如何获得key的集合: public Set<K> keySet() {

2016-12-14 17:24:47 494

原创 HashMap、HashSet、Hashtable源码学习笔记

一、HashMap概述理解HashMap的关键是知道其底层使用拉链表作为数据结构存储数据的,所有的存储、读取、遍历等操作都是建立在这种数据结构之上。理解了这种数据结构时候会对源码的学习有很大帮助。HashMap线程不安全,可以存储null键和null值。数据结构理解HashMap的底层数据结构基本上可以帮助我们理解其所有的方法。我们看到HashMap的内部有一个Node[] table成员,接着我们

2016-12-12 21:59:49 406

原创 剑指offer学习笔记(Java实现)(11-20)

题目11:数值的整数次方 书中方法:这道题要注意底数为0的情况。double类型的相等判断。乘方的递归算法。 public double power(double base, int exponent){ //指数为0 if(exponent == 0){ return 1.0; } //底数为0

2016-12-12 21:40:51 385

原创 ArrayList、LinkedList学习笔记

ArrayList和LinkedList学习笔记一、ArrayList概述ArrayList实现List接口,底层用数组保存元素。元素数量趋向容量时,数组容量会动态增长,此时会带来数据的拷贝,允许包括null元素。线程不安全,如果多个线程同时访问一个 ArrayList 实例,而其中至少一个线程从结构上修改了列表,那么它必须保持外部同步。(结构上的修改是指任何添加或删除一个或多个元素的操作,或者显式

2016-12-09 22:36:27 456

原创 用数组和链表实现栈和队列

程序取自《算法第四版》官方网站,程序中的jar包看这里,也可以使用标准输入输出流测试。栈的实现:作为一种数据结构,我们要实现的接口有isEmpty()、size()、push()、pop()、peek()以及迭代。下面分别来看用数组和链表实现的栈。数组实现栈:构造器中我们创建固定大小的数组,维护一个整数n用于表示栈内元素的个数。私有方法resize()用于改变数组(栈)的大小。使用内部类继承Ite

2016-11-18 12:14:50 1201

原创 单例模式学习笔记

难道不能使用Java的静态变量来达到目的吗?是的,用静态变量有这样一个缺点,如果将对象赋值给一个静态变量,那么你必须在程序一开始就创建好对象,万一对象非常消耗资源,而程序在某次执行中又一直没用到,就形成了浪费。如果是一个公开类,我们可以多次实例化它;如果不是公开类, 只有同一个包内的类可以实例化它,也依然可以实例化它多次。于是我们想到将类的构造器私有化,这样类内的代码是唯一能调用此构造器的代码:

2016-11-17 17:41:58 478

原创 对Android中Touch事件分发机制的理解和总结

这篇文章是对他人文章的一个总结。 主要参考了郭霖大神的博客 http://blog.csdn.net/guolin_blog/article/details/9153747和国外一个哥们的视频 http://v.youku.com/v_show/id_XODQ1MjI2MDQ0.html水平太菜,从源码角度来看的话自己都被搞混乱了,所以就从“外在表现”的角度总结一些结论,这样能使自己清

2016-05-13 17:43:12 1374

原创 对Android中“回调”的理解

最近看书或者博客的时候老是遇到回调函数、回调接口,在没有搞懂的情况下继续学习,头都是大的。于是看了很多博客,现在总算是弄明白了一点,以下写出自己对Android中“回调”的很粗浅的理解。首先说一下最抽象的形式——2个类,A类和B类。A类含有1个接口、1个接口变量、(可能含有)1个为接口变量赋值的方法以及1个会使用接口变量的“地方”;B类实现A中的接口,(可能)含有1个A类实例的引用,并且(可能

2016-05-04 21:37:53 3652 2

空空如也

空空如也

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

TA关注的人

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