ios鏈式編程
㈠ C#的優勢。
理解C#,也要明白誕生C#的.NET的一些東西。
在一個軟體系統中,電腦硬體+操作系統提供基本的功能,而我們代碼開發出來的程序,都是基於操作系統提供的基本功能上做進一步的邏輯設計。不同的操作系統提供的基本功能是有差異的,所以針對一款操作系統開發的軟體,一般都不能在其他系統中運行。打個比方來說吧,為iPhone開發的程序,不能直接在安卓的手機上用,Linux上開發的東西,也不能直接在Windows上用。
但是JAVA就是一個異類。JAVA通過在操作系統之上再架構一層中間層(也就是虛擬機概念),將多種不同的操作系統的有差異的基礎操作規范成一種統一模式,所以JAVA的軟體一旦開發,可以在多達N中的不同系統中運行。手機種類繁多的時代,軟體開發商不可能為每種OS都開發一版本軟體,多數選擇JAVA就是這個原因。JAVA的跨平台虛擬機概念使之廣為流行。
微軟早先作為操作系統的龍頭老大,本不在意跨平台問題,但是隨著地位受沖擊,也意識到跨平台的重要性,這也怪微軟自己,單就Windows家族,前後版本就出現了一些不兼容。為了能學習JAVA的經驗,微軟推出了自己的操作系統之上的跨平台統一中間層系統.NET,試圖通過捆綁到個版本Windows中,提供一致的應用介面,這樣,只要是.NET開發人員,不必擔心自己的產品最終應用在什麼操作系統中,只要目標操作系統裝了.NET,就OK.
C#是推出.NET的時候一並誕生的,可以說是單就語言技術、風格、嚴謹等特點上來說,編程語言中最為優秀的一種語言,甚至由它而引發出計算機語言界中的多種新的規范和特徵。我們知道多數C#編譯器都只是運作於.NET平台上的,但並不是說C#只能運作於.NET平台上,只要有人願意,就可以開發一個運作於非.NET平台上的C#編譯器。只是C#還有一個很特殊的問題,即它仍然在不斷的發展中,新的語言細節不斷地推出,比如直接支持SQL的LINQ語法等等,除了設計該語言的微軟,其他公司很難有這個實力開發其它平台的C#開發環境。
微軟是做Windows的,在他眼中,其他操作系統都是敵人。敵人如果想要加入微軟陣營,享用Windows程序,就只有選擇讓微軟給他們的系統中套上.NET的頭套;微軟是不肯直接把開發寶器C#隨便給他們的。Linux顯然目前並不支持.NET平台(主要還有個原因就是Linux是免費的,.NET上的產品多是收費的,不融洽),所以就現狀而言,C#在Linux上暫時無法使用(不是不能)。
真正意義上的跨平台是說類似於JAVA虛擬機,.NET平台這樣的中間層產品,或者是某種軟體,有多種客戶端在不同的平台上但是卻都可以工作。簡言之,跨平台是指一種軟體產品的特性。而語言只是一種開發產品的工具。你可以用這種工具去開發一個跨平台的產品,可以用多種不同的工具,卻只開發出同樣一種平台的產品。。。
C#優勢其他兩位也都說了,智能,強大(就是高級了)。最NB的還在於這個語言仍然在進化中,而很多其他語言已經基本上成型,以後不再會有什麼改進了。C#鍛煉人邏輯思維的能力最好。雖然它目前仍然主要被綁在.NET平台中使用,如果你要做一些iOS,Linux開發可能還用不上,執行效率也不是最高的,但是從軟體開發者角度而言,開發一款軟體,開發效率最高的選擇!(底層驅動這樣軟體例外)
㈡ ios 怎樣實現masonry中的點語法
鏈式編程的應用,這種編程範式的特點是在函數內部使用block處理業務邏輯,block中必須要有返回值,且這個返回值必須是self!
- (CalculatorMaker *(^)(int))sub {
return ^(int num){
self.result -= num;
return self;
};
}
㈢ 幾種編程思想在iOS中的實現:(一)鏈式編程
編程思想就是你把現實問題轉化為程序的一種思維模式.....
㈣ 怎樣導入ReactiveCocoa
1.ReactiveCocoa
ReactiveCocoa(簡稱為RAC),是由Github開源的一個應用於iOS和OS開發的新框架,Cocoa是蘋果整套框架的簡稱,因此很多蘋果框架喜歡以Cocoa結尾。
2.ReactiveCocoa作用
在我們iOS開發過程中,經常會響應某些事件來處理某些業務邏輯,例如按鈕的點擊,上下拉刷新,網路請求,屬性的變化(通過KVO)或者用戶位置的變化(通過CoreLocation)。但是這些事件都用不同的方式來處理,比如action、delegate、KVO、callback等。
其實這些事件,都可以通過RAC處理,ReactiveCocoa為事件提供了很多處理方法,而且利用RAC處理事件很方便,可以把要處理的事情,和監聽的事情的代碼放在一起,這樣非常方便我們管理,就不需要跳到對應的方法里。非常符合我們開發中高聚合,低耦合的思想。
3.編程思想
在開發中我們也不能太依賴於某個框架,否則這個框架不更新了,導致項目後期沒辦法維護,比如之前Facebook提供的Three20框架,在當時也是神器,但是後來不更新了,也就沒什麼人用了。因此我感覺學習一個框架,還是有必要了解它的編程思想。
先簡單介紹下目前咱們已知的編程思想。
3.1 面向過程:處理事情以過程為核心,一步一步的實現。
3.2 面向對象:萬物皆對象
3.3 鏈式編程思想:是將多個操作(多行代碼)通過點號(.)鏈接在一起成為一句代碼,使代碼可讀性好。a(1).b(2).c(3)
鏈式編程特點:方法的返回值是block,block必須有返回值(本身對象),block參數(需要操作的值)
代表:masonry框架。
模仿masonry,寫一個加法計算器,練習鏈式編程思想。
Snip20150925_2.png
Snip20150925_1.png
Paste_Image.png
3.4 響應式編程思想:不需要考慮調用順序,只需要知道考慮結果,類似於蝴蝶效應,產生一個事件,會影響很多東西,這些事件像流一樣的傳播出去,然後影響結果,借用面向對象的一句話,萬物皆是流。
代表:KVO運用。
3.5 函數式編程思想:是把操作盡量寫成一系列嵌套的函數或者方法調用。
函數式編程特點:每個方法必須有返回值(本身對象),把函數或者Block當做參數,block參數(需要操作的值)block返回值(操作結果)
代表:ReactiveCocoa。
用函數式編程實現,寫一個加法計算器,並且加法計算器自帶判斷是否等於某個值.
Paste_Image.png
Paste_Image.png
4.ReactiveCocoa編程思想
ReactiveCocoa結合了幾種編程風格:
函數式編程(Functional Programming)
響應式編程(Reactive Programming)
所以,你可能聽說過ReactiveCocoa被描述為函數響應式編程(FRP)框架。
以後使用RAC解決問題,就不需要考慮調用順序,直接考慮結果,把每一次操作都寫成一系列嵌套的方法中,使代碼高聚合,方便管理。
5.如何導入ReactiveCocoa框架
通常都會使用CocoaPods(用於管理第三方框架的插件)幫助我們導入。
PS:CocoaPods教程
注意:
podfile如果只描述pod 'ReactiveCocoa', '~> 4.0.2-alpha-1',會導入不成功。
Snip20150926_1.png
報錯提示信息
Snip20150926_2.png
需要在podfile加上use_frameworks,重新pod install 才能導入成功。
Snip20150926_3.png
6.ReactiveCocoa常見類。
學習框架首要之處:個人認為先要搞清楚框架中常用的類,在RAC中最核心的類RACSiganl,搞定這個類就能用ReactiveCocoa開發了。
6.1RACSiganl:信號類,一般表示將來有數據傳遞,只要有數據改變,信號內部接收到數據,就會馬上發出數據。
注意:
信號類(RACSiganl),只是表示當數據改變時,信號內部會發出數據,它本身不具備發送信號的能力,而是交給內部一個訂閱者去發出。
默認一個信號都是冷信號,也就是值改變了,也不會觸發,只有訂閱了這個信號,這個信號才會變為熱信號,值改變了才會觸發。
如何訂閱信號:調用信號RACSignal的subscribeNext就能訂閱。
RACSiganl簡單使用:
// RACSignal使用步驟:
// 1.創建信號 + (RACSignal *)createSignal:(RACDisposable * (^)(id<RACSubscriber> subscriber))didSubscribe
// 2.訂閱信號,才會激活信號. - (RACDisposable *)subscribeNext:(void (^)(id x))nextBlock
// 3.發送信號 - (void)sendNext:(id)value
// RACSignal底層實現:
// 1.創建信號,首先把didSubscribe保存到信號中,還不會觸發。
// 2.當信號被訂閱,也就是調用signal的subscribeNext:nextBlock
// 2.2 subscribeNext內部會創建訂閱者subscriber,並且把nextBlock保存到subscriber中。
// 2.1 subscribeNext內部會調用siganl的didSubscribe
// 3.siganl的didSubscribe中調用[subscriber sendNext:@1];
// 3.1 sendNext底層其實就是執行subscriber的nextBlock
// 1.創建信號
RACSignal *siganl = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
// block調用時刻:每當有訂閱者訂閱信號,就會調用block。
// 2.發送信號
[subscriber sendNext:@1];
// 如果不在發送數據,最好發送信號完成,內部會自動調用[RACDisposable disposable]取消訂閱信號。
[subscriber sendCompleted];
return [RACDisposable disposableWithBlock:^{
// block調用時刻:當信號發送完成或者發送錯誤,就會自動執行這個block,取消訂閱信號。
// 執行完Block後,當前信號就不在被訂閱了。
NSLog(@"信號被銷毀");
}];
}];
// 3.訂閱信號,才會激活信號.
[siganl subscribeNext:^(id x) {
// block調用時刻:每當有信號發出數據,就會調用block.
NSLog(@"接收到數據:%@",x);
}];
6.2 RACSubscriber:表示訂閱者的意思,用於發送信號,這是一個協議,不是一個類,只要遵守這個協議,並且實現方法才能成為訂閱者。通過create創建的信號,都有一個訂閱者,幫助他發送數據。
6.3 RACDisposable:用於取消訂閱或者清理資源,當信號發送完成或者發送錯誤的時候,就會自動觸發它。
使用場景:不想監聽某個信號時,可以通過它主動取消訂閱信號。
6.4 RACSubject:RACSubject:信號提供者,自己可以充當信號,又能發送信號。
使用場景:通常用來代替代理,有了它,就不必要定義代理了。
6.5 RACReplaySubject:重復提供信號者,RACSubject的子類。
使用場景:如果一個信號每被訂閱一次,就需要把之前的值重復發送一遍,使用重復提供信號類。
RACSubject和RACReplaySubject簡單使用:
// RACSubject使用步驟
// 1.創建信號 [RACSubject subject],跟RACSiganl不一樣,創建信號時沒有block。
// 2.訂閱信號 - (RACDisposable *)subscribeNext:(void (^)(id x))nextBlock
// 3.發送信號 sendNext:(id)value
// RACSubject:底層實現和RACSignal不一樣。
// 1.調用subscribeNext訂閱信號,只是把訂閱者保存起來,並且訂閱者的nextBlock已經賦值了。
// 2.調用sendNext發送信號,遍歷剛剛保存的所有訂閱者,一個一個調用訂閱者的nextBlock。
// 1.創建信號
RACSubject *subject = [RACSubject subject];
// 2.訂閱信號
[subject subscribeNext:^(id x) {
// block調用時刻:當信號發出新值,就會調用.
NSLog(@"第一個訂閱者%@",x);
}];
[subject subscribeNext:^(id x) {
// block調用時刻:當信號發出新值,就會調用.
NSLog(@"第二個訂閱者%@",x);
}];
// 3.發送信號
[subject sendNext:@"1"];
// RACReplaySubject使用步驟:
// 1.創建信號 [RACSubject subject],跟RACSiganl不一樣,創建信號時沒有block。
// 2.可以先訂閱信號,也可以先發送信號。
// 2.1 訂閱信號 - (RACDisposable *)subscribeNext:(void (^)(id x))nextBlock
// 2.2 發送信號 sendNext:(id)value
// RACReplaySubject:底層實現和RACSubject不一樣。
// 1.調用sendNext發送信號,把值保存起來,然後遍歷剛剛保存的所有訂閱者,一個一個調用訂閱者的nextBlock。
// 2.調用subscribeNext訂閱信號,遍歷保存的所有值,一個一個調用訂閱者的nextBlock
// 如果想當一個信號被訂閱,就重復播放之前所有值,需要先發送信號,在訂閱信號。
// 也就是先保存值,在訂閱值。
// 1.創建信號
RACReplaySubject *replaySubject = [RACReplaySubject subject];
// 2.發送信號
[replaySubject sendNext:@1];
[replaySubject sendNext:@2];
// 3.訂閱信號
[replaySubject subscribeNext:^(id x) {
NSLog(@"第一個訂閱者接收到的數據%@",x);
}];
// 訂閱信號
[replaySubject subscribeNext:^(id x) {
NSLog(@"第二個訂閱者接收到的數據%@",x);
}];
RACSubject替換代理// 1.創建命令
RACCommand *command = [[RACCommand alloc] initWithSignalBlock:^RACSignal *(id input) {
NSLog(@"執行命令");
// 創建空信號,必須返回信號
// return [RACSignal empty];
// 2.創建信號,用來傳遞數據
return [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
[subscriber sendNext:@"請求數據"];
// 注意:數據傳遞完,最好調用sendCompleted,這時命令才執行完畢。
[subscriber sendCompleted];
return nil;
}];
}];
// 強引用命令,不要被銷毀,否則接收不到數據
_conmmand = command;
// 3.訂閱RACCommand中的信號
[command.executionSignals subscribeNext:^(id x) {
[x subscribeNext:^(id x) {
NSLog(@"%@",x);
}];
}];
// RAC高級用法
// switchToLatest:用於signal of signals,獲取signal of signals發出的最新信號,也就是可以直接拿到RACCommand中的信號
[command.executionSignals.switchToLatest subscribeNext:^(id x) {
NSLog(@"%@",x);
}];
// 4.監聽命令是否執行完畢,默認會來一次,可以直接跳過,skip表示跳過第一次信號。
[[command.executing skip:1] subscribeNext:^(id x) {
if ([x boolValue] == YES) {
// 正在執行
NSLog(@"正在執行");
}else{
// 執行完成
NSLog(@"執行完成");
}
}];
// 5.執行命令
[self.conmmand execute:@1];
6.9RACMulticastConnection:用於當一個信號,被多次訂閱時,為了保證創建信號時,避免多次調用創建信號中的block,造成副作用,可以使用這個類處理。
使用注意:RACMulticastConnection通過RACSignal的-publish或者-muticast:方法創建.
RACMulticastConnection簡單使用:
// RACMulticastConnection使用步驟:
// 1.創建信號 + (RACSignal *)createSignal:(RACDisposable * (^)(id<RACSubscriberwww.DDTSOFT.COM?subscriber))didSubscribe
// 2.創建連接 RACMulticastConnection *connect = [signal publish];
// 3.訂閱信號,注意:訂閱的不在是之前的信號,而是連接的信號。 [connect.signal subscribeNext:nextBlock]
// 4.連接 [connect connect]
// RACMulticastConnection底層原理:
// 1.創建connect,connect.sourceSignal -> RACSignal(原始信號) connect.signal -> RACSubject
// 2.訂閱connect.signal,會調用RACSubject的subscribeNext,創建訂閱者,而且把訂閱者保存起來,不會執行block。
// 3.[connect connect]內部會訂閱RACSignal(原始信號),並且訂閱者是RACSubject
// 3.1.訂閱原始信號,就會調用原始信號中的didSubscribe
// 3.2 didSubscribe,拿到訂閱者調用sendNext,其實是調用RACSubject的sendNext
// 4.RACSubject的sendNext,會遍歷RACSubject所有訂閱者發送信號。
// 4.1 因為剛剛第二步,都是在訂閱RACSubject,因此會拿到第二步所有的訂閱者,調用他們的nextBlock
// 需求:假設在一個信號中發送請求,每次訂閱一次都會發送請求,這樣就會導致多次請求。
// 解決:使用RACMulticastConnection就能解決.
// 1.創建請求信號
RACSignal *signal = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
NSLog(@"發送請求");
return nil;
}];
// 2.訂閱信號
[signal subscribeNext:^(id x) {
NSLog(@"接收數據");
}];
// 2.訂閱信號
[signal subscribeNext:^(id x) {
NSLog(@"接收數據");
}];
// 3.運行結果,會執行兩遍發送請求,也就是每次訂閱都會發送一次請求
// RACMulticastConnection:解決重復請求問題
// 1.創建信號
RACSignal *signal = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
NSLog(@"發送請求");
[subscriber sendNext:@1];
return nil;
}];
// 2.創建連接
RACMulticastConnection *connect = [signal publish];
// 3.訂閱信號,
// 注意:訂閱信號,也不能激活信號,只是保存訂閱者到數組,必須通過連接,當調用連接,就會一次性調用所有訂閱者的sendNext:
[connect.signal subscribeNext:^(id x) {
NSLog(@"訂閱者一信號");
}];
[connect.signal subscribeNext:^(id x) {
NSLog(@"訂閱者二信號");
}];
// 4.連接,激活信號
[connect connect];
6.10 RACScheler:RAC中的隊列,用GCD封裝的。
6.11 RACUnit :表?stream不包含有意義的值,也就是看到這個,可以直接理解為nil.
6.12 RACEvent: 把數據包裝成信號事件(signal event)。它主要通過RACSignal的-materialize來使用,然並卵。
7.ReactiveCocoa開發中常見用法。
7.1 代替代理:
rac_signalForSelector:用於替代代理。
7.2 代替KVO :
rac_valuesAndChangesForKeyPath:用於監聽某個對象的屬性改變。
7.3 監聽事件:
rac_signalForControlEvents:用於監聽某個事件。
7.4 代替通知:
rac_addObserverForName:用於監聽某個通知。
7.5 監聽文本框文字改變:
rac_textSignal:只要文本框發出改變就會發出這個信號。
7.6 處理當界面有多次請求時,需要都獲取到數據時,才能展示界面
rac_liftSelector:withSignalsFromArray:Signals:當傳入的Signals(信號數組),每一個signal都至少sendNext過一次,就會去觸發第一個selector參數的方法。
使用注意:幾個信號,參數一的方法就幾個參數,每個參數對應信號發出的數據。
7.7 代碼演示
// 1.代替代理
// 需求:自定義redView,監聽紅色view中按鈕點擊
// 之前都是需要通過代理監聽,給紅色View添加一個代理屬性,點擊按鈕的時候,通知代理做事情
// rac_signalForSelector:把調用某個對象的方法的信息轉換成信號,就要調用這個方法,就會發送信號。
// 這里表示只要redV調用btnClick:,就會發出信號,訂閱就好了。
[[redV rac_signalForSelector:@selector(btnClick:)] subscribeNext:^(id x) {
NSLog(@"點擊紅色按鈕");
}];
// 2.KVO
// 把監聽redV的center屬性改變轉換成信號,只要值改變就會發送信號
// observer:可以傳入nil
[[redV rac_valuesAndChangesForKeyPath:@"center" options:NSKeyValueObservingOptionNew observer:nil] subscribeNext:^(id x) {
NSLog(@"%@",x);
}];
// 3.監聽事件
// 把按鈕點擊事件轉換為信號,點擊按鈕,就會發送信號
[[self.btn rac_signalForControlEvents:UIControlEventTouchUpInside] subscribeNext:^(id x) {
NSLog(@"按鈕被點擊了");
}];
㈤ iOS中圖表要怎麼畫
我所用到的最好的 iOS 圖表庫有兩個一個是 Swift 版本的 Charts 不過混編起來有點操蛋.另外一個就是國人寫的AAChartKit ,幾乎支持所有主流類型(柱狀圖、條形圖、折線圖、曲線圖、折線填充圖、曲線填充圖、雷達圖、極地圖、扇形圖、氣泡圖)的數據圖表,配置也非常簡單.
在此附上 AAChartKit 鏈接地址 網頁鏈接,下面是他的官方介紹
環境友好,兼容性強. 適配iOS 6 +, 支持ARC,支持Objective-C語言,配置簡單.同時更有 Swift 版本AAInfographics可供使用.
功能強大,類型多樣. 支持柱狀圖、條形圖、折線圖、曲線圖、折線填充圖、曲線填充圖、雷達圖、極地圖、扇形圖、氣泡圖、散點圖、區域范圍圖、柱形范圍圖、面積范圍圖、面積范圍均線圖、直方折線圖、直方折線填充圖、箱線圖、瀑布圖、熱力圖、桑基圖、金字塔圖、漏斗圖、等二十幾種類型的圖形,不可謂之不多.
互動式圖形動畫. 有著清晰和充滿細節的用戶交互方式,與此同時,圖形渲染動畫效果細膩精緻,流暢優美.有三十多種以上渲染動畫效果可供選擇,用戶可自由設置渲染圖形時的動畫時間和動畫類型,關於圖形渲染動畫類型,具體參見AAChartKit 動畫類型.
支持手勢縮放.支持圖表的手勢縮放和拖動閱覽,手勢縮放類型具體參見AAChartKit 手勢縮放類型,默認禁用手勢縮放功能.
極簡主義.AAChartView + AAChartModel = Chart,在AAChartKit圖表框架當中,遵循這樣一個極簡主義公式:圖表視圖控制項 + 圖表模型 = 你想要的圖表.同另一款強大而又精美的圖表庫AAInfographics完全一致.
鏈式編程語法. 支持類Masonry鏈式編程語法,一行代碼即可配置完成AAChartModel模型對象實例.
㈥ 要生成像 iOS 8 Health 應用那樣的圖表,有哪些比較好用的庫
JS圖形、圖標庫推薦:
1. JS Charts
JS Charts 是個基於JavaScript的圖表生成器,不需要任何編碼。JS Charts 非常容易使用,只要用戶使用客戶端腳本(比如,在 web 瀏覽器中執行)。它不需要多餘的插件和伺服器模塊,只需要下載 JS Charts 的腳本,准備好 XML,JSON 或者 JavaScript 數組數據。
2. Canvasjs
CanvasJS 是個易用的 HTML5 & JavaScript 圖表庫,基於 Canvas 元素。Graphs 可以通過設備渲染,包括 iPhone,iPad,Android,Windows Phone,Microsoft Surface,Desktops 等等。它允許用戶創建適用於所有設備,不影響 web 應用程序的功能和可維護性的富儀表盤。CanvcasJS 有著非常漂亮的主題和超過傳統的 Flash 和 SVG 圖表 10x 倍以上的速度——生成輕量級,漂亮和響應式的儀表圖。
3. Chart.js
Chart.js 是個簡單的,面向對象的客戶端圖形庫,用戶可以用 6 中不同的方式來可視化數據。每個方式都是動畫效果的,完全自定義,而且看起來非常好看,即使在 retina 顯示。它使用 HTML5 canvas 元素,支持所有現代瀏覽器,並且支持 IE7/8。
4. Aristochart
Aristochart 是個高度自定義,靈活的折線 Canvas 圖表庫,允許用戶集中精力在圖表的審美方面,後台工作做得非常好。Aristochart 有個持續進步的社區,提供許多不斷增長的主題給用戶選擇。
5. xCharts
xCharts 是一個使用 D3.js 來構建漂亮的可定製的數據驅動的 JavaScript圖表庫,他使用HTML,CSS,SVG實現圖表,xCharts 被設計為一個動態的、流暢的、開放的和可定製化的庫。
6. BonsaiJS
BonsaiJS 是個輕量級的 JavaScript圖形庫,提供直觀的圖形 API 和 SVG 渲染器。主要特性包括:架構分離的運行器和渲染器;iFrame,Worker 和 Node 運行上下文;形狀,路徑,Assets(音頻,圖像,字體,subMovies),Keyframe 和常規動畫,等等。支持現代化瀏覽器: Safari, Chrome 和 Firefox。
7. Sigma.js
Sigma.js 是個免費開源的 JavaScript圖形庫,使用 HTML5 canvas 元素。它的設計是特別為了在 web 界面分享互動式網路 Map 和動態展示網路資料庫。
8. Morris.js
Morris.js 是個輕量級的 JavaScript庫,使用 jQuery 和 Rapha&enuml 來繪制時序圖。 Morris.js 生命周期是從代碼驅動 howmanyleft.co.uk 圖表開始的。它支持的瀏覽器有: IE6+, Safari/Chrome/Firefox, iOS 3+ 和 Android 3+。它的公共 API 非常的小,只有一個函數: Morris.Line(選項),包括了許多配置選項。
9. Paper.js
Paper.js 是一個開源的向量圖形腳本框架,基於 HTML5Canvas 開發。提供清晰的場景圖、DOM和大量強大的功能用來創建各種向量圖和貝塞爾曲線。
10. AmCharts
AmCharts 是個高級圖表庫,適用於所有數據的可視化。AmCharts 包括: Column, Bar, Line, Area, Step, Step without risers, Smoothed line, Candlestick, OHLC, Pie/Donut, Radar/ Polar, XY/Scatter/Bubble, Bullet, Funnel/Pyramid 等等。
11. Smoothie Charts
Smoothie Charts是個極小的圖表庫,專為實時流媒體數據設計的。Joe Walnes 想展示 WebSocket推動的實時的流數據。雖然很多圖表庫允許用戶動態更新數據,但是沒有一個是可以優化源源不斷的流數據。
12. Dygraphs
Dygraphs 是個快速,靈活,開源的 JavaScript 圖表庫。它允許用戶展示和解析密集的數據集。可以高亮需要強調的數據集。可以使用滑鼠點擊或者用滑鼠拖動來縮放圖表;可以修改數值或者點擊條目來調整平均周期。
13. Grafico
Grafico 是 Grafico 是一個基於 Raphaël 和 Prototype.js 構建的 JavaScript 圖表庫,提供了各種圖表類型。這些漂亮的圖表,有利於傳遞他們的信息。
14. Highchart JS
Highcharts JS 是一個製作圖表的純 Javascript類庫,主要特性如下:兼容性:兼容當今所有的瀏覽器,包括 iPhone、IE 和火狐等等;對個人用戶完全免 費;純JS,無BS;支持大部分的圖表類型:直線圖,曲線圖、區域圖、區域曲線圖、柱狀圖、餅裝圖、散布圖;跨語言:不管是 PHP、Asp.net 還是 Java 都可以使用。
15. Flotr
Flotr 是一個基於 Prototype 開發的 JavaScript繪圖工具。支持圖例,滑鼠跟蹤,圖片區域選擇,圖片縮放,添加事件鉤子(event hook),通過CSS設置樣式等。
16. Flot
Flot 是受 Plotr 和 PlotKit 的 啟發,Ole Laursen 基於 jquery 開發了一個圖表繪制(WEB Chart)插件並命名為 flot。 flot 是個純 JavaSript 庫,專注於簡單的使用方式,迷人的外觀和互動式特性。支持的瀏覽器有: Internet Explorer 6+, Chrome, Firefox 2+, Safari 3+ and Opera 9.5+。
17. jFreeChart
JFreeChart 主要用來各種各樣的圖表,這些圖表包括:餅圖、柱狀圖(普通柱狀圖以及堆棧柱狀圖)、線圖、區域圖、分布圖、混合圖、甘特圖以及一些儀表盤等等。JFreeChart 項目歷史悠久,而且有大量的開發者在維護。
18. Plotkit
PlotKit 是一個純 JavaScript 繪圖工具包。它支持 HTML Canvas 和 Adobe SVG。有著很完整的文檔,方便用戶使用。
19. Planetary.js
Planetary.js 是個令人稱奇的創建互動式 web 地球儀的 JavaScript庫。它使用 D3 和 TopoJSON 來解析和渲染地理信息。Planetary.js 使用基於插件的架構,甚至默認自身就是個插件!這使得 Planetary.js 非常靈活,而且它是允許用戶完全自定義,包括顏色,大小,rotation 等等。更重要的是,用戶可以在任意位置使用自定義的顏色和大小來顯示動畫「pings」;它還支持滑鼠拖動和縮放,100% 免費和開源。
20. Ember Charts
Ember Charts 是個圖表庫,使用 Ember.js 和 d3.js 框架構建的。它包括時間線,條形圖,餅圖和散點圖,非常容易擴展和修改。這些圖表組件都是開箱即用的,在圖表交互和演示方面應用的很好。
21. Sparky
Sparky 是個免費的 JavaScript 波形圖庫,依賴於 Raphaël ,非常容易使用。支持多個圖表類型(折線,條形,area),折線和區域圖可以有多個顏色選擇。
22. Envision.js
Envision.js 是個 JavaScript 庫,用來簡化,快速創建互動式的 HTML5 可視化圖表。它包括兩個圖表類型:時序圖和 Finance ,提供 API 給開發者,用戶可以直接自定義創建圖表。這個庫氏基於 Flotr2 和 HTML5 Canvas 的。它與框架無關,依賴於幾個小的 JavaScript 庫。
23. Dc.js
dc.js 是個 JavaScript 圖表庫,有著原生的 crossfilter, 支持和允許高效展示大型多維數據集(基於 crossfilter 的示例);圖表使用 dc.js 渲染,是使用原生數據驅動,所以能得到用戶的實時反饋;dc.js 最大的亮點在於能提供一個簡單而強大的 JavaScript 庫,能進行數據可視化和分析;不僅支持桌面瀏覽器還支持移動端。
24. ElyCharts
Elycharts 是一個易於使用的,可定製的 JavaScript圖表繪制組件。這個組件可用於繪制大部分常用的圖表類型包括:line, column, are, bar, pie, sparklines and combinations。它支持多種互動式功能包括:滑鼠跟蹤、事件處理、利用各種動畫高亮顯示選擇中的區域,Tooltip,HTML錨點等。可以動 態修改數據,並以漂亮的動畫效果展示圖表中的變化。圖表利用SVG/VML技術生成,基於jQuery + Raphaël開發。
25. AwesomeChartJS
AwesomeChartJS Awesome Chart JS 是一個 JavaScript生成圖表的類庫,它利用了 HTML5 的 canvas 標簽來創建統計圖表。此類庫就是為了減輕開發者的工作量,使用它只需書寫幾行代碼便能生成漂亮的圖表。
26. Arbor.js
Arbor.js 是一個利用 Web Works 和 jQuery創建的可視化圖形庫,它為圖形組織和屏幕刷新處理提供了一個高效的、力導向的布局演算法。
27. CanvasXpress
canvasXpress 是一個基於HTML5 canvas標簽實現的 JavaScript圖表類庫,它能夠支持線性圖、柱形圖、餅圖和熱點圖等多種常見的圖表類型。它所生成的圖表交互性很強,滑鼠放 上去時會動態顯示值。除此之外,它也具有相當高的可定製性,可設置圖表的文字、顏色和要顯示/隱藏的元素等。當然更重要的一點是,雖然它使用了 HTML5,但是依然支持IE6瀏覽器。
28. JSXGraph
JSXGraph 是一個支持各種瀏覽器的互動式幾何圖庫繪制。JSXGraph 使用 SVG 和 VML。
29. Rickshaw
Rickshaw 是一個用於繪制時序圖的簡單 jS 庫,基於 Mike Bostock』s delightful D3 庫構建。
30. rGraph
RGraph 是基於HTML5 canvas標簽的HTML5 canvas圖形庫,支持 20 種不同的可視化類型。使用 canvas 標簽,RGraph 創建「HTML5 圖表」,意味著更快的 web 頁面載入和更少的 web 伺服器載入。這能幫助減小 web 頁面的大小,低能耗和更快的瀏覽速度。
31. Fusion Chart
FusionCharts Suite XT 是個專業的 JavaScript圖表庫,能創建任何類型的圖表。它創建的圖表都是可以進行完全自定義的,標簽,字體,邊界等等,都可以進行修改。它有很強的交互功能,有許多信息提示,可 點擊的 legend 關鍵字,還有 dril-down,縮放/滾動 和單擊列印圖表功能。
32. Graph Dracula
Dracula 是用一系列的工具來顯示和布局互動圖表,包括各種相關的演算法。它只是純 JavaScript 和 SVG ,並無 Flash,Java,其他插件。它非常容易使用,用戶可以很簡單的自定義任意的元素。
33. Bluff
Bluff 是個 JavaScript 的 Ruby 的 Gruff graphing library埠。它支持所有 Gruff 的特性,但是有著最小的依賴。用戶只需要運行一個第三方腳本: JS.Class 副本(壓縮後只有 2.6kB ) 和 Google 的 ExCanvas 副本,用來支持 IE 中的 canvas。這兩個腳本在 Bluff 中都有下載。Bluff 自身壓縮後大小大概有 11KB 。
34. Pizza Pie Chart
Pizza Pie Charts 是個響應式餅圖圖表,基於 Adobe Snap SVG 框架,通過 HTML 標記和 CSS 來替代 JavaScript 對象,更容易集成各種先進的技術。
35. jGraph
HTML5 圖表組件,完全支持l IE 6-8 和觸屏設備。 JGraph 自2001年來就一直提供最先進的圖表軟體組件,是第一個流行的 JGraph Swing 庫。然後在 2005 年走在時代的前沿開發 mxGraph。