對比現(xiàn)在主流圖片框架的優(yōu)勢和缺點,在實際項目中如何選擇適合自己的框架;
長沙縣ssl適用于網(wǎng)站、小程序/APP、API接口等需要進行數(shù)據(jù)傳輸應(yīng)用場景,ssl證書未來市場廣闊!成為成都創(chuàng)新互聯(lián)的ssl證書銷售渠道,可以享受市場價格4-6折優(yōu)惠!如果有意向歡迎電話聯(lián)系或者加微信:13518219792(備注:SSL證書合作)期待與您的合作!
Glide、Fresco、Picasso、ImageLoader
共同優(yōu)點:
以上名詞介紹
在分析他們的差異、優(yōu)缺點之前,我們先了解圖片緩存通用的概念:
以上概念在不同框架之間可能不同,比如Displayer在ImageLoader中叫做ImageAware,在Picasso和Glide中叫做Target。
以上為Glide的總體設(shè)計圖。
整個庫分為RequestManager(請求管理器)、Engine(數(shù)據(jù)獲取引擎)、Fetcher(數(shù)據(jù)獲取器)、MemoryCache(內(nèi)存緩存)、DiskLRUCache(本地緩存)、Transformation(圖片處理)、Encoder(編碼處理)、Registry(圖片類型以及解析器配置)、Target(目標)等模塊。
簡單流程: Glider收到加載及顯示資源任務(wù),創(chuàng)建Request并將它交給RequestManager,Request啟動Engine去數(shù)據(jù)源獲取資源,得到資源后通過Transformation處理后交給Target.
Glide依賴DiskLRUCache、GifDecoder等開源庫去完成本地緩存和Gif圖片解密工作;
為Bitmap 維護一個BitmapPool對象池, 對象池的主要目的是通過減少大對象的分配以重用來提高性能!
缺點 :
①圖片質(zhì)量低:因為機制不同,速度快,但是圖片的質(zhì)量降低了RGB565;
②多尺寸緩存導致內(nèi)存和磁盤占用多:根據(jù)ImageView大小來緩存,可能會導致一張圖片可能根據(jù)展示情況來緩存不同尺寸的幾份;
擴展理解參考:
以上為Picasso的總體設(shè)計圖。
整個庫分為Dispatcher、RequestHandler以及Downloader、PicassoDrawable等模塊。
簡單流程: Picasso收到加載顯示圖片任務(wù)后,創(chuàng)建Request并將它交給Dispatcher,Dispatcher分發(fā)任務(wù)到具體RequestHandler,任務(wù)通過MemoryCache及Handler(數(shù)據(jù)獲取接口)獲取圖片,圖片獲取成功后通過PicassoDrawable顯示到Target中;
上面Data的File system部分,Picasso沒有自定義本地緩存的接口,默認使用http的本地緩存,API19以上使用okhttp,一下使用UrlConnection,所以如果需要自定義本地緩存就需要自定義Downloader;
缺點 :加載速度沒有其他框架快;
特點 :只緩存一個全尺寸的圖片,根據(jù)需求的大小在壓縮轉(zhuǎn)換;
以上為Fresco的總體設(shè)計圖
整個庫分為UI:DraweeView(View控件)、Drawable(圖片數(shù)據(jù))、DraweeController(圖片控制器)、DraweeHiierarchy(圖片體系);Core:DataSource(數(shù)據(jù)源)、ImagePipeline(圖像管道)、Producer(生產(chǎn)者)、ProducerFacotry(生產(chǎn)工廠)、Subcriber(訂閱)、Supplier(供應(yīng)者)、Consumer(消費者);IO/Data:MemoryCache(內(nèi)存緩存)、Network、DiskCache(磁盤緩存)、Recourse(本地資源)
簡單流程: 從上面的結(jié)構(gòu)可以看出,fresco主要采用了工廠+建造者的模式實現(xiàn)功能,邏輯劃分比較清楚;Fresco框架整體是一個MVC模式,DrawableView---View用來顯示頂層視圖、DrawableController---Control控制加載圖片的配置 事件的分發(fā)、DrawableHierarchy---Model 用于存儲和描述圖片信息,同時也封裝了一些圖片的顯示和視圖層級的方法;ImagePipeline模塊負責從網(wǎng)絡(luò)、本地文件系統(tǒng)、本地資源加載圖片
缺點:
①框架大,影響Apk體積;
②一定的學習成本,使用比較繁瑣,需要使用內(nèi)部提供的ImageView控件,使用起來比較復雜;
1.Side-Menu.Android
分類側(cè)滑菜單 , Yalantis 出品。
項目地址:
2.Context-Menu.Android
可以方便快速集成漂亮帶有動畫效果的上下文菜單, Yalantis 出品。
項目地址:
3.Pull-to-Refresh.Rentals-Android
提供一個簡單可以自定義的 下拉刷新 實現(xiàn),Yalantis 出品。
項目地址:
4.Titanic
可以顯示水位上升下降的TextView
項目地址:
5.AndroidSwipeLayout
滑動Layout ,支持單個View,ListView,GridView
項目地址:
Demo地址: Download Demo
6.Android Typeface Helper
可以幫你輕松實現(xiàn)自定義字體的庫
項目地址:
7.android-lockpattern
Android的圖案密碼解鎖
項目地址:
Demo地址:
文檔介紹:
APP示例:Android開機的圖案密碼解鎖,支付寶的密碼解鎖
8.ToggleButton
狀態(tài)切換的 Button,類似 iOS,用 View 實現(xiàn)
項目地址:
9.WilliamChart
繪制圖表的庫,支持LineChartView、BarChartView和StackBarChartView三中圖表類型,并且支持 Android 2.2及以上的系統(tǒng)。
項目地址:
Demo地址:
Demo項目:
10.實現(xiàn)滑動ViewPager漸變背景色
項目地址:
11.Euclid
用戶簡歷界面, Yalantis 出品。
項目地址:
12. InstaMaterial
Instagram的一組Material 風格的概念設(shè)計
項目地址:
13. SpringIndicator
使用bezier實現(xiàn)粘連效果的頁面指示
項目地址:
14. BezierDemo
仿qq消息氣泡拖拽 消失的效果。
項目地址:
15. FoldableLayout
折疊的信紙被打開一樣的動畫效果
項目地址:
16.Taurus
下拉刷新,Yalantis 出品。(是不是有點似曾相識呢?)
項目地址:
17. PersistentSearch
在點擊搜索的時候控件在原有位置顯示輸入框。
項目地址:
18. circular-progress-button
帶進度顯示的Button
項目地址:
19. discrollview
當上下滾動的時候子元素會呈現(xiàn)不同動畫效果的scrollView,網(wǎng)頁上稱之為:視差滾動
項目地址:
20. sweet-alert-dialog
一個帶動畫效果的 自定義對話框樣式
項目地址:
21. android-floating-action-button
Material Desig風格的 浮動操作按鈕
項目地址:
22. android-collapse-calendar-view
可以在月視圖與周視圖之間切換的calendar控件
項目地址:
22. android-collapse-calendar-view
可以在月視圖與周視圖之間切換的calendar控件
項目地址:
23. NumberProgressBar
個簡約性感的數(shù)字進度條
項目地址:
24. CircularProgressView
CircularProgressView 是通過自定義view的方式實現(xiàn)的Material風格的加載提示控件,兼容任何版本。
項目地址:
25. OriSim3D-Android
opengl 實現(xiàn)了各種折紙效果,模擬了從一張紙折疊成一條船的整個過程
項目地址:
26、萬能日歷控件:CalendarView
GitHub:
中文使用文檔:
27、大圖查看器: BigImage ImageView ViewPager
Github:
地址:
支持超長圖、超大圖的圖片瀏覽器,優(yōu)化內(nèi)存,支持手勢放大、下拉關(guān)閉、查看原圖、加載百分比、保存圖片等功能?,F(xiàn)已支持androidx。
28、安卓工具包androidUntilCode(安卓必備)
Github:
29、萬能適配器-BRAVH
官網(wǎng):
GitHub:
RecyclerView
作為Android最常用的控件之一,是否常常為“她”操碎了心
BRVAH受益群體是所有Android開發(fā)者,希望更多開發(fā)者能夠一起來把這個項目做得更好幫助更多人
30、智能刷新控件--SmartRefreshLayout
GitHub:
中文:
SmartRefreshLayout以打造一個強大,穩(wěn)定,成熟的下拉刷新框架為目標,并集成各種的炫酷、多樣、實用、美觀的Header和Footer。 正如名字所說,SmartRefreshLayout是一個“聰明”或者“智能”的下拉刷新布局,由于它的“智能”,它不只是支持所有的View,還支持多層嵌套的視圖結(jié)構(gòu)。 它繼承自ViewGroup 而不是FrameLayout或LinearLayout,提高了性能。 也吸取了現(xiàn)在流行的各種刷新布局的優(yōu)點,包括谷歌官方的 SwipeRefreshLayout , 其他第三方的 Ultra-Pull-To-Refresh 、 TwinklingRefreshLayout 。 還集成了各種炫酷的 Header 和 Footer。
31、內(nèi)存泄漏檢測工具--leakcanary
使用方式:
LeakCanary是Square公司基于MAT開源的一個工具,用來檢測Android App中的內(nèi)存泄露問題。官方地址:
32、 1218683832 / AndroidSlidingUpPanel
SlidingUpPanelLayout:可以上下滑動的菜單布
android應(yīng)用開發(fā)框架是ApplicationFramework.其系統(tǒng)架構(gòu)由5部分組成,分別是:LinuxKernel、AndroidRuntime、Libraries、ApplicationFramework、Applications。第二部分將詳細介紹這5個部分。下面自底向上分析各層。Android架構(gòu)1、LinuxKernelAndroid基于Linux2.6提供核心系統(tǒng)服務(wù),例如:安全、內(nèi)存管理、進程管理、網(wǎng)絡(luò)堆棧、驅(qū)動模型。LinuxKernel也作為硬件和軟件之間的抽象層,它隱藏具體硬件細節(jié)而為上層提供統(tǒng)一的服務(wù)。如果你學過計算機網(wǎng)絡(luò)知道OSI/RM,就會知道分層的好處就是使用下層提供的服務(wù)而為上層提供統(tǒng)一的服務(wù),屏蔽本層及以下層的差異,當本層及以下層發(fā)生了變化不會影響到上層。也就是說各層各盡其職,各層提供固定的SAP(ServiceAccessPoint),專業(yè)點可以說是高內(nèi)聚、低耦合。如果你只是做應(yīng)用開發(fā),就不需要深入了解LinuxKernel層。2、AndroidRuntimeAndroid包含一個核心庫的集合,提供大部分在Java編程語言核心類庫中可用的功能。每一個Android應(yīng)用程序是Dalvik虛擬機中的實例,運行在他們自己的進程中。Dalvik虛擬機設(shè)計成,在一個設(shè)備可以高效地運行多個虛擬機。Dalvik虛擬機可執(zhí)行文件格式是.dex,dex格式是專為Dalvik設(shè)計的一種壓縮格式,適合內(nèi)存和處理器速度有限的系統(tǒng)。大多數(shù)虛擬機包括JVM都是基于棧的,而Dalvik虛擬機則是基于寄存器的。兩種架構(gòu)各有優(yōu)劣,一般而言,基于棧的機器需要指令,而基于寄存器的機器指令更大。dx是一套工具,可以將Java.class轉(zhuǎn)換成.dex格式。一個dex文件通常會有多個.class。由于dex有時必須進行最佳化,會使文件大小增加1-4倍,以O(shè)DEX結(jié)尾。Dalvik虛擬機依賴于Linux內(nèi)核提供基本功能,如線程和底層內(nèi)存管理。3、LibrariesAndroid包含一個C/C++庫的集合,供Android系統(tǒng)的各個組件使用。這些功能通過Android的應(yīng)用程序框架(applicationframework)暴露給開發(fā)者。下面列出一些核心庫:系統(tǒng)C庫--標準C系統(tǒng)庫(libc)的BSD衍生,調(diào)整為基于嵌入式Linux設(shè)備媒體庫--基于PacketVideo的OpenCORE。這些庫支持播放和錄制許多流行的音頻和視頻格式,以及靜態(tài)圖像文件,包括MPEG4、H.264、MP3、AAC、AMR、JPG、PNG界面管理--管理訪問顯示子系統(tǒng)和無縫組合多個應(yīng)用程序的二維和三維圖形層LibWebCore--新式的Web瀏覽器引擎,驅(qū)動Android瀏覽器和內(nèi)嵌的web視圖SGL--基本的2D圖形引擎3D庫--基于OpenGLES1.0APIs的實現(xiàn)。庫使用硬件3D加速或包含高度優(yōu)化的3D軟件光柵FreeType--位圖和矢量字體渲染SQLite--所有應(yīng)用程序都可以使用的強大而輕量級的關(guān)系數(shù)據(jù)庫引擎4、ApplicationFramework通過提供開放的開發(fā)平臺,Android使開發(fā)者能夠編制極其豐富和新穎的應(yīng)用程序。開發(fā)者可以自由地利用設(shè)備硬件優(yōu)勢、訪問位置信息、運行后臺服務(wù)、設(shè)置鬧鐘、向狀態(tài)欄添加通知等等,很多很多。開發(fā)者可以完全使用核心應(yīng)用程序所使用的框架APIs。應(yīng)用程序的體系結(jié)構(gòu)旨在簡化組件的重用,任何應(yīng)用程序都能發(fā)布他的功能且任何其他應(yīng)用程序可以使用這些功能(需要服從框架執(zhí)行的安全限制)。這一機制允許用戶替換組件。所有的應(yīng)用程序其實是一組服務(wù)和系統(tǒng),包括:視圖(View)--豐富的、可擴展的視圖集合,可用于構(gòu)建一個應(yīng)用程序。包括包括列表、網(wǎng)格、文本框、按鈕,甚至是內(nèi)嵌的網(wǎng)頁瀏覽器內(nèi)容提供者(ContentProviders)--使應(yīng)用程序能訪問其他應(yīng)用程序(如通訊錄)的數(shù)據(jù),或共享自己的數(shù)據(jù)資源管理器(ResourceManager)--提供訪問非代碼資源,如本地化字符串、圖形和布局文件通知管理器(NotificationManager)--使所有的應(yīng)用程序能夠在狀態(tài)欄顯示自定義警告活動管理器(ActivityManager)--管理應(yīng)用程序生命周期,提供通用的導航回退功能5、ApplicationsAndroid裝配一個核心應(yīng)用程序集合,包括電子郵件客戶端、SMS程序、日歷、地圖、瀏覽器、聯(lián)系人和其他設(shè)置。所有應(yīng)用程序都是用Java編程語言寫的。更加豐富的應(yīng)用程序有待我們?nèi)ラ_發(fā)!從上面我們知道Android的架構(gòu)是分層的,非常清晰,分工很明確。Android本身是一套軟件堆迭(SoftwareStack),或稱為「軟件迭層架構(gòu)」,迭層主要分成三層:操作系統(tǒng)、中間件、應(yīng)用程序。從上面我們也看到了開源的力量,一個個熟悉的開源軟件在這里貢獻了自己的一份力量。
Android系統(tǒng)是Google公司在2008年推出的一款智能移動設(shè)備操作系統(tǒng),通過不斷地版本迭代,目前已經(jīng)推出到Android 11版本了。Android系統(tǒng)廣泛應(yīng)用在手機、平板、電視等各種電子設(shè)備上,已經(jīng)成為全球第一大智能移動操作系統(tǒng)。
下面我們就先看看Android系統(tǒng)的框架:
?
Android系統(tǒng)框架圖
從上圖可以看到,Android系統(tǒng)被分為了5層,從上到下依次為:
APP層
顧名思義,這一層就是應(yīng)用層,無論是系統(tǒng)預(yù)置應(yīng)用還是從應(yīng)用商店下載安裝的應(yīng)用都運行在這一層,目前大部分的Android開發(fā)者都集中在這一層,主要為各種Android設(shè)備開發(fā)各種應(yīng)用APP。
Framework層
這一層就是系統(tǒng)框架層,主要運行著系統(tǒng)的各種服務(wù),例如ActivityManagerService,PackageManagerService等,以及對APP提供各種標準接口。對APP開發(fā)的人來說需要熟悉各種系統(tǒng)API接口,對系統(tǒng)開發(fā)的人來說,需要熟悉系統(tǒng)服務(wù)的運行機制。
本地C/C++庫和Android虛擬機層
Android 5.0(API 21)之前使用的是Dalvik虛擬機,之后被ART所取代。
ART是Android操作系統(tǒng)的虛擬機運行環(huán)境,通過運行虛擬機來執(zhí)行dex文件。其中,dex文件是專為Android設(shè)計的的字節(jié)碼格式。
C/C++庫層就是為虛擬器和Framework層服務(wù)運行提供必需的依賴庫。
HAL硬件抽象層
硬件抽象層是用來隔離底層硬件的,它對上提供標準的硬件操作接口,讓Android系統(tǒng)不用在意底層使用的是什么硬件。
Linux驅(qū)動層
Linux驅(qū)動層主要和硬件打交道,硬件驅(qū)動、進程管理、內(nèi)存管理、網(wǎng)絡(luò)管理等功能在這里實現(xiàn)。底層驅(qū)動開發(fā)人員必需熟悉該層的業(yè)務(wù)邏輯和原理
DRM 是目前主流的圖形顯示框架,Linux 內(nèi)核中已經(jīng)有Framebuffer 驅(qū)動用于管理顯示設(shè)備的 Framebuffer, Framebuffer 框架也可以實現(xiàn)Linux 系統(tǒng)的顯示功能,但是缺點如下:
下面是Linux graphic system 的框架,基于Wayland的Windowing system,在DRI框架下,通過兩條路徑(DRM和KMS),分別實現(xiàn)Rendering和送顯兩個顯示步驟,注意觀察 DRM 框架在其中的作用
DRM 框架的基本流程框圖如下:
軟件角度框圖:
DRM框架涉及到的元素很多,大致如下:
KMS: CRTC,ENCODER,CONNECTOR,PLANE,F(xiàn)B,VBLANK,property
GEM: DUMB、PRIME、Fence
下面一一介紹
libdrm:
應(yīng)用層的一個動態(tài)鏈接庫,對底層接口進行封裝,向上層提供通用的API接口,主要是對各種IOCTL接口進行封裝。
KMS:
Kernel mode setting 簡而言之做兩件事:更新畫面 + 設(shè)置顯示參數(shù)
更新畫面: 顯示buffer 的切換,多圖層之間的合成方式,每個圖層的顯示位置
設(shè)置顯示參數(shù):包含 刷新率,分辨率,電源狀態(tài) 休眠喚醒等等。
GEM:
Graphic Execution Manager,主要負責顯示buffer的分配和釋放,也是GPU唯一用到DRM的地方。
學習 drm 就是學習上面這些概念的用法和實現(xiàn)。
MPAndroidChart,支持API8及以上版本。它能實現(xiàn)Android與IOS跨平臺開發(fā)。github鏈接:網(wǎng)頁鏈接
HelloCharts,該開源庫可完成線形圖、柱狀圖、餅狀圖等等,動畫效果還算可以,github鏈接:網(wǎng)頁鏈接
自定義圖表,比如客戶需要定制一些特殊的圖表,例如熱力圖,漏斗圖之類的,兩種方法實現(xiàn):一種用H5實現(xiàn),像百度的ECharts并沒有開放android api,所以只能用H5來實現(xiàn)高逼格的圖表;第二種大神自繪view控件