Android 開源項目源碼解析(第二期)

jopen 9年前發布 | 43K 次閱讀 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。

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!