Android 开源项目源码解析(第二期)

时间:2022-08-17 00:11:55

Android 开源项目源码解析(第二期)

阅读目录

 

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。