Android 开源项目源码解析(第二期)
Android 开源项目源码解析(第二期)
阅读目录
- android-Ultra-Pull-To-Refresh 源码解析
- DynamicLoadApk 源码解析
- NineOldAnimations 源码解析
- SlidingMenu 源码解析
- Cling 源码解析
- BaseAdapterHelper 源码分析
- Side Menu.Android 源码解析
- DiscreteSeekBar 源码解析
- CalendarListView 源码解析
- PagerSlidingTabStrip 源码解析
- 公共技术点之 Android 动画基础
- 公共技术点之 Java 反射 Reflection
- Volley 源码解析
- Android Universal Image Loader 源码分析
- Dagger 源码解析
- EventBus 源码解析
- xUtils 源码解析
- ViewPagerindicator 源码解析
- HoloGraphLibrary 源码解析
- CircularFloatingActionMenu 源码解析
- PhotoView 源码解析
- Android Lock Pattern 源码解析
- 公共技术点之 Java 动态代理
- 公共技术点之 Java 注解 Annotation
- 公共技术点之 View 绘制流程
- 公共技术点之依赖注入
- 公共技术点之 View 事件传递
android-Ultra-Pull-To-Refresh 源码解析
一个强大的 Andriod 下拉刷新框架。主要特点:(1) 继承于 ViewGroup,Content 不仅可以是常用的 ListView、GridView,还可以是其他任何 View。(2) 简洁完善的 Header 抽象,方便进行拓展,构建符合需求的头部。UltraPTR 总体设计比较简单清晰,首先抽象出了两个接口,功能接口和 UI 接口。PtrHandler 代表下拉刷新的功能接口,包含刷新功能回调方法以及判断是否可以下拉的方法。用户实现此接口来进行数据刷新工作。
DynamicLoadApk 源码解析
DynamicLoadApk 是一个开源的 Android 插件化框架。插件化的优点包括:(1) 模块解耦,(2) 动态升级,(3) 高效并行开发(编译速度更快) (4) 按需加载,内存占用更低等等。原理是 DexClassLoader 加 Activity 代理,即在容器中注册几个代理的 Activity,启动插件的 Activity 时实际启动的都是代理的 Activity,从而解决 Activity 必须注册的问题。
NineOldAnimations 源码解析
NineOldAndroids 是一款支持在低版本(API 11 以下)使用 Android 属性动画以及 3D 旋转动画的框架,它提供了一系列如 ViewAnimator, ObjectAnimator, ViewPropertyAnimator 等 API 来完成这些动画,解决了 Android 动画框架在低版本的兼容性问题。在 API 11 (Honeycomb-Android 3.0)后 Android 推出了属性动画、X 轴翻转等动画效果,但是这些效果却不能运行在 API 11 以下,NineOldAndroids 的出现使得这些动画效果能够兼容低版本系统,保证动画在各个系统版本能够完美运行。
SlidingMenu 源码解析
SlidingMenu 是一个强大的侧边栏菜单,通过拖动屏幕边缘滑出菜单,支持屏幕左右划出,支持菜单 Zoom、Scale、Slide Up 三种动画样式出现。主要特点如下:(1) 侧边栏可以是一个 Fragment,包含任何 View;(2) 使用简单方便,支持左滑和右滑等;(3) 自定义侧边栏显示动画。
Cling 源码解析
Cling 类库是由 Java 实现的 DLNA/UPnP 协议栈。基于 DLNA/UPnP 可以开发出类似多屏互动、资源共享、远程控制等功能的应用,通过 Android 应用管理一个或多个设备,将音频、视频、图片推送到指定设备显示。UPnP 的工作过程大概分为 6 个步骤:寻址(Addressing)、发现(Discovery)、描述(Description)、控制(Control)、事件 (Eventing)、展现(Presentation)。
BaseAdapterHelper 源码分析
base-adapter-helper 是对传统的 BaseAdapter ViewHolder 模式的一个封装。主要功能就是简化我们书写 AbsListView 的 Adapter 的代码,如 ListView,GridView。优点 (1) 提供 QucikAdapter,省去类似 getCount() 等抽象函数的书写,只需关注 Model 到 View 的显示。(2) BaseAdapterHelper 中封装了大量用于为 View 操作的辅助方法。
Side Menu.Android 源码解析
Yalantis 开源动画体验很棒的 Side Menu,菜单打开为翻页效果。
DiscreteSeekBar 源码解析
DiscreteSeekBar 实现了类似 Material Design 风格的 SeekBar。DiscreteSeekBar 可以在 2.1 以上的应用中使用,可以在 XML 中配置显示的格式,也可以在代码中自定义显示的数字或者指定显示字符。使用方法类似 SeekBar,很简单。
CalendarListView 源码解析
CalendarListview 是一个可以方便从日历中选择日期的控件,支持到 API 10 以上,只需要在你的布局中添加 DayPickerView 即可。使用控件 RecycleView 实现的日期选择器,可以选择时间段。
PagerSlidingTabStrip 源码解析
PagerSlidingTabStrip 是配合 ViewPager 使用的 Indicator,支持 ViewPager Scroll 时 Indicator 联动。PagerSlidingTabStrip 实现联动效果的原理是调用 ViewPager 的 OnPageChangeListener。 但是 Viewpager 注册的 Listener 不是自身的 OnPageChangeListener,而是 PagerSlidingTabStrip 内部类 PageListener。 通过 PageListener 实现对 ViewPager 和 Tab 的封装。从而实现滑动联动效果。
公共技术点之 Android 动画基础
简单的介绍了 View 和 Property 动画的概念,如何在项目中创建资源文件,以及如何在代码中使用它们。
公共技术点之 Java 反射 Reflection
介绍了Java 反射,如何通过反射获取类、属性、方法、父类、接口、注解等等。
Volley 源码解析
Volley 是 Google 在 2013 I/O 大会上推出的 Android 异步网络请求框架和图片加载框架。特别适合数据量小,通信频繁的网络操作。Volley 主要是通过两种 Diapatch Thread 不断从 RequestQueue 中取出请求,根据是否已缓存调用 Cache 或 Network 这两类数据获取接口之一,从内存缓存或是服务器取得请求的数据,然后交由 ResponseDelivery 去做结果分发及回调处理。
Android Universal Image Loader 源码分析
Universal Image Loader 是一个强大的、可高度定制的图片缓存。整个库分为 ImageLoaderEngine,Cache及 ImageDownloader,ImageDecoder,BitmapDisplayer,BitmapProcessor 五大模块,其中 Cache 分为 MemoryCache 和 DiskCache 两部分。简单的讲就是 ImageLoader 收到加载及显示图片的任务,并将它交给 ImageLoaderEngine,ImageLoaderEngine 分发任务到具体线程池去执行,任务通过 Cache 及 ImageDownloader 获取图片,中间可能经过 BitmapProcessor 和 ImageDecoder 处理,最终转换为 Bitmap 交给 BitmapDisplayer 在 ImageAware 中显示。
Dagger 源码解析
Dagger 是一款 Java 平台的依赖注入库。Java 的依赖注入库中,最有名的应该属 Google 的 Guice,Spring 也很有名,不过是专注于 J2EE 开发。Guice 的功能非常强大,但它是通过在运行时读取注解来实现依赖注入的,依赖的生成和注入需要依靠 Java 的反射机制,这对于对性能非常敏感的 Android 来说是一个硬伤。基于此,Dagger 应运而生。Dagger 同样使用注解来实现依赖注入,但它利用 APT(Annotation Process Tool) 在编译时生成辅助类,这些类继承特定父类或实现特定接口,程序在运行时 Dagger 加载这些辅助类,调用相应接口完成依赖生成和注入。Dagger 对于程序的性能影响非常小,因此更加适用于 Android 应用的开发。
EventBus 源码解析
EventBus 是一个 Android 事件发布/订阅框架,通过解耦发布者和订阅者简化 Android 事件传递,这里的事件可以理解为消息,本文中统一称为事件。事件传递既可用于 Android 四大组件间通讯,也可以用户异步线程和主线程间通讯等等。传统的事件传递方式包括:Handler、BroadCastReceiver、 Interface 回调,相比之下 EventBus 的优点是代码简洁,使用简单,并将事件发布和订阅充分解耦。
xUtils 源码解析
xUtils一个 Android 公共库,主要包括 View,DB, Http, Bitmap 四个模块。View 模块主要的功能是通过注解绑定 UI,资源,事件。DB 模块是一个数据库 ORM 框架, 简单的语句就能进行数据的操作。Http 模块主要访问网络,支持同步,异步方式的请求,支持文件的下载。Bitmap 模块是加载图片以及图片的处理, 支持加载本地,网络图片,而且支持图片的内存和本地缓存。
ViewPagerindicator 源码解析
ViewPagerIndicator 常用语 ViewPager 的界面导航。主要特点:使用简单、样式全、易扩展。该项目总体设计非常简单,一个 PageIndicator 接口类,具体样式的导航类实现该接口,然后根据具体样式去实现相应的逻辑。 IcsLinearLayout:LinearLayout 的扩展,支持了 4.0 以上的 divider 特性。 CirclePageIndicator、LinePageIndicator、UnderlinePageIndicator、 TitlePagerIndicator 继承自 View。TabPageIndicator、IconPageIndicator 继承自 HorizontalScrollView。
HoloGraphLibrary 源码解析
HoloGraphLibrary 是一个可用于绘制图表的项目,支持绘制线状图、柱状图、饼状图。图形设计友好,使用方便。不过库本身代码一般,建议吸收原理重构而不要直接使用。
CircularFloatingActionMenu 源码解析
CircularFloatingActionMenu 是一个与著名应用 Path 菜单类似的(非完整)圆形弹出菜单。可方便的定制菜单以及动画。支持自定义动画、菜单、角度范围、半径等。源码主要分成两部分,一部分是构成菜单的 View 部分,另一部分是动画的操作类。
PhotoView 源码解析
PhotoView 是支持双击或双指缩放的 ImageView。支持 Pinch 手势自由缩放,支持双击放大/还原,支持平滑滚动,在滑动父控件下能够运行良好,支持基于 Matrix 变化(放大/缩小/移动)的事件监听。PhotoView 这个库实际上比较简单,关键点其实就是 Touch 事件处理和 Matrix 图形变换的应用。
Android Lock Pattern 源码解析
Lock Pattern 是 Android 的图案密码解锁库,通过手势连接 3 * 3 的点矩阵绘制图案表示解锁密码。支持 ACTION_CREATE_PATTERN、ACTION_COMPARE_PATTERN、ACTION_VERIFY_CAPTCHA 三种 Action 操作模式。
公共技术点之 Java 动态代理
在某些情况下,我们不希望或是不能直接访问对象 A,而是通过访问一个中介对象 B,由 B 去访问 A 达成目的,这种方式我们就称为代理。这里对象 A 所属类我们称为委托类,也称为被代理类,对象 B 所属类称为代理类。根据程序运行前代理类是否已经存在,可以将代理分为静态代理和动态代理。
公共技术点之 Java 注解 Annotation
注解指能够添加到 Java 源代码的语法元数据。类、方法、变量、参数、包都可以被注解,可用来将信息元数据与程序元素进行关联。Annotation 中文常译为“注解”,注解的主要作用包括 a. 标记,用于告诉编译器一些信息。b. 编译时动态处理,如动态生成代码。c. 运行时动态处理,如得到注解信息。
公共技术点之 View 绘制流程
当 Activity 接收到焦点的时候,它会被请求绘制布局,该请求由 Android framework 处理.绘制是从根节点开始,对布局树进行 measure 和 draw 。整个 View 树的绘图流程在 ViewRoot.java类的performTraversals() 函数展开,该函数所做的工作可简单概况为是否需要重新计算视图大小(measure)、是否需要重新安置视图的位置(layout)、以及是否需要重绘 (draw)。
公共技术点之依赖注入
如果在 Class A 中,有 Class B 的实例,则称 Class A 对 Class B 有一个依赖。非自己主动初始化依赖,而通过外部来传入依赖的方式,我们就称为依赖注入。简单的说依赖注入主要有两个好处:(1). 解耦,将依赖之间解耦。(2). 因为已经解耦,所以方便做单元测试,尤其是 Mock 测试。
公共技术点之 View 事件传递
所有 Touch 事件都被封装成了 MotionEvent 对象,包括 Touch 的位置、时间、历史记录以及第几个手指(多指触摸)等。事件类型分为 ACTION_DOWN, ACTION_UP, ACTION_MOVE, ACTION_POINTER_DOWN, ACTION_POINTER_UP, ACTION_CANCEL,每个事件都是以 ACTION_DOWN 开始,ACTION_UP 结束。对事件的处理包括三类,分别为传递——dispatchTouchEvent() 函数、拦截——onInterceptTouchEvent() 函数、消费——onTouchEvent() 函数和 OnTouchListener。
Android 开源项目源码解析(第二期)的更多相关文章
- [原创]android开源项目源码解析(一)----CircleImageView的源码解析
CircleImageView的代码很简洁,因此先将此工程作为源码解析系列的第一篇文章. 解析说明都在代码里了. /* * Copyright 2014 - 2015 Henning Dodenhof ...
- 开源项目源码解析-PhotoView 源码解析
1. 功能介绍 特性(Features): 支持 Pinch 手势自由缩放. 支持双击放大/还原. 支持平滑滚动. 在滑动父控件下能够运行良好.(例如:ViewPager) 支持基于 Matrix 变 ...
- 【Android】EventBus 源码解析
EventBus 源码解析 本文为 Android 开源项目实现原理解析 中 EventBus 部分项目地址:EventBus,分析的版本:ccc2771,Demo 地址:EventBus Demo分 ...
- 史上最详细的Android消息机制源码解析
本人只是Android菜鸡一个,写技术文章只是为了总结自己最近学习到的知识,从来不敢为人师,如果里面有不正确的地方请大家尽情指出,谢谢! 606页Android最新面试题含答案,有兴趣可以点击获取. ...
- Android MIFARE NFCA源码解析
Android MIFARE NFCA源码解析TagTechnology定义了所有标签的共有接口类BasicTagTechnology 实现了TagTechnology的一些接口 再有具体的标签协议继 ...
- 如何调试 Java 开源项目源码,记一种源码导入开发工具并调试的通用方法
楔子 说起读开源项目源码,很多朋友觉得高大上.大佬牛逼,云云~ 挡在很多人面前的不是源码怎么读,而是不知道如何导入源码到开发工具以及如何调试源码. 本文将以 spring-cloud-gateway ...
- Git8.3k星,十万字Android主流开源框架源码解析,必须盘
为什么读源码 很多人一定和我一样的感受:源码在工作中有用吗?用处大吗?很长一段时间内我也有这样的疑问,认为哪些有事没事扯源码的人就是在装,只是为了提高他们的逼格而已. 那为什么我还要读源码呢?一刚开始 ...
- Android 数据库 ObjectBox 源码解析
一.ObjectBox 是什么? greenrobot 团队(现有 EventBus.greenDAO 等开源产品)推出的又一数据库开源产品,主打移动设备.支持跨平台,最大的优点是速度快.操作简洁,目 ...
- tp6源码解析-第二天,ThinkPHP6编译模板流程详解,ThinkPHP6模板源码详解
TP6源码解析,ThinkPHP6模板编译流程详解 前言:刚开始写博客.如果觉得本篇文章对您有所帮助.点个赞再走也不迟 模板编译流程,大概是: 先获取到View类实例(依赖注入也好,通过助手函数也好) ...
随机推荐
- PHP - 判断php是否对表单数据内的特殊字符自动转义
get_magic_quotes_gpc 有两个返回值: 0:在php.ini文件中已经关闭自动转移. 1:在php.ini文件中已经开启自动转移. 由此函数进行判断表单是否转移: /** * * m ...
- mac下和windows下清空DNS缓存
在WIN下: > ipconfig /flushdns 在mac下: 对于低版本系统,在命令行窗口(terminal)输入 lookupd -flushcache 即可: $ sudo look ...
- 简单区分`:before`与`::before`的区别
简单区分:before与::before的区别 :hover我们都知道,称作伪类,英文名pseudo-class,而我们此处提到的:before以及:after也是伪类,属于css2的内容,在ie8下 ...
- 终于懂了:TWinControl主要是Delphi官方用来封装Windows的官方控件,开发者还是应该是有TCustomControl来开发三方控件
再具体一点,就是TWinControl一般情况下不需要Canvas和Paint(TForm是个例外),而TCustomControl自带这2个. 同时开发者应该使用TGraphicControl,而不 ...
- 学习算法-基数排序(radix sort)卡片分类(card sort) C++数组实现
基数排序称为卡片分类,这是一个比较早的时间越多,排名方法. 现代计算机出现之前,它已被用于排序老式打孔卡. 说下基数排序的思想.前面我有写一个桶式排序,基数排序的思想是桶式排序的推广. 桶式排序:ht ...
- lua 与 php 通过AES数据加密进行通讯
近期公司有款<围住神经猫>的微信小游戏火爆的不行!公司又决定开发一系列的神经猫的小游戏,于是,我被拉过来了. 后来使用cocos-2dx 开发一款小游戏,client用的是lua脚本,为了 ...
- 阿里巴巴 web前端性能优化进阶路
Web前端性能优化WPO,相信大多数前端同学都不会陌生,在各自所负责的站点页面中,也都会或多或少的有过一定的技术实践.可以说,这个领域并不缺乏成熟技术理论和技术牛人:例如Yahoo的web站点性能优化 ...
- C++学习之路—继承与派生(一):基本概念与基类成员的访问属性
(本文根据<c++程序设计>(谭浩强)总结而成,整理者:华科小涛@http://www.cnblogs.com/hust-ghtao,转载请注明) 1 基本思想与概念 在传统的程序设计 ...
- 使用SetLocaleInfo设置时间后必须调用广播WM_SETTINGCHANGE,通知其他程序格式已经更改
uses messages; Procedure SetDateFormat; //设置系统日期格式var buf:pchar; i:integer; p:DWORD;begin getmem(buf ...
- linux shell中的单引号与双引号的区别(看完就不会有引号的疑问了)(转)
tips: ============================= IFS - LINUX字段分隔符,内部字段分隔符 IFS(Internal Field Seperator)在Linux的she ...