html5 桌面 App 開發引擎:AlloyDesktop

jopen 10年前發布 | 42K 次閱讀 HTML5 前端技術 AlloyDesktop

AlloyDesktop?這是一個什么東西呢?這是一個能將網頁像軟件一樣運行在桌面上的app開發引擎。該引擎實現了對網頁的透明渲染,使網頁不再局限于瀏覽器的框框。同時,提供強大的api支持,使你能輕松實現許多傳統網頁實現不了的功能,諸如窗口控制,文件IO,圖像處理……可以這樣說,一般軟件所能實現的大部分功能,利用AlloyDesktop開發的app也能實現,而且實現起來更快更容易。另外,它還具備傳統軟件所不具備的優勢,那就是強大的界面渲染能力。利用html5css3的新特性,你可以輕輕松松實現陰影透明等特效。相對于市面上許多軟件界面開發引擎,網頁開發的門檻相對來說要低得多,而且是一個通用的標準。利用該引擎,可以開發諸如QQ,瀏覽器,播放器,PS等軟件。

下面簡單講下該引擎的運行原理。該引擎運行app時,先讀取一個后綴名為.app的配置文件,再通過讀取配置文件的相關參數獲得網頁的地址以及窗口大小等其他相關的配置。然后啟動一個透明瀏覽器,加載相應的網頁。網頁中可以通過js調用引擎提供的api,實現一些本地app的功能,即使用普通瀏覽器瀏覽網頁時網頁實現不了的功能。

下載地址:http://download.alloyteam.com/webtop.zip

官方群:257960168

該引擎目前還處于beta階段,以下為使用改引擎開發的app的部分界面的截圖。

html5 桌面 App 開發引擎:AlloyDesktop

引擎初始界面,放了幾個demo。

html5 桌面 App 開發引擎:AlloyDesktop
透明瀏覽器

html5 桌面 App 開發引擎:AlloyDesktop
音樂widget

html5 桌面 App 開發引擎:AlloyDesktop
屏幕尺子

……

開發配置

其中的透明瀏覽器可用來在開發階段進行調試。點擊html5 桌面 App 開發引擎:AlloyDesktop按鈕切換網頁渲染模式,默認使用不透明模式渲染。點擊html5 桌面 App 開發引擎:AlloyDesktop按鈕或按F12或F9可打開開發者工具,html5 桌面 App 開發引擎:AlloyDesktop強制刷新。點擊瀏覽器右上角html5 桌面 App 開發引擎:AlloyDesktop按鈕可生成默認.app文件,app文件可雙擊直接運行app文件為一配置文件,可使用記事本打開,注意不要設為默認打開。可使用的配置項如下:

  • url:網頁地址
  • name:程序名字
  • icon:程序圖標
  • width:初始化窗口寬度
  • height:初始化窗口高度
  • x:初始化窗口x坐標(相對于屏幕)
  • y:初始化窗口y坐標(相對于屏幕)
  • enableDrag:是否允許全窗口拖拽,僅對透明窗口有效,1為真,0為假,以下同
  • enableResize:是否允許改變窗口大小
  • disableTransparent:是否禁用透明渲染
  • disableRefresh:禁止按F5刷新
  • disableDevelop:禁止按F12打開開發者工具
  • hasBorder:是否使用默認邊框
  • max:初始化時是否最大化窗口,如果為真,則忽略width,height,x,y四個參數
  • exStyle:高級參數,設置窗口額外屬性,諸如置頂,去掉任務欄圖標等

API文檔

注:以下函數的最后一個參數都為handler,代表窗口句柄,不傳則使用本窗口的句柄,只有在操作其他窗口時才有作用。請不要在全局變量中使用 handler這個變量名。以下API都是屬于AlloyDesktop對象的,調用時請用AlloyDesktop.xx調用。

窗口相關

  • bringToTop(handler);//窗口移到最頂層
  • browse(url,handler);//在新進程中使用默認的透明瀏覽器瀏覽網頁,url為網頁路徑
  • close(handler);//關閉窗口
  • createBrowser(url,handler);//在新進程中打開一個webtop窗口,url為網頁路徑
  • createWindow(url,exStyle,isTransparent,readyHandler,handler)//在當前進程中創建一個窗口,并返回窗口句柄,readyHandler為窗口網頁加載后要執行的js代碼,此函數或將廢棄
  • createWindowBase(url,exstyle,isTransparent,readyHandler,handler);//同上,區別在于使用本地相對路徑,此函數或將廢棄
  • drag(handler);//拖拽窗口
  • enableDrag(handler);//允許拖拽窗口,同配置參數enableDrag=1作用相同。
  • focus(handler);//使窗口獲得焦點
  • getPos(handler);//獲得窗口位置,返回值為一object,格式如下{x:13,y:54}
  • getScreenSize(handler);//獲取屏幕大小,返回值為一object,格式如下{width:130,height:54}
  • getSize(handler);//獲得窗口大小,返回值為一object,格式如下{width:130,height:54}
  • hide(handler);//隱藏窗口
  • loadUrl(url,handler);//加載網頁,url為網頁路徑
  • max(handler);//最大化窗口
  • mini(hander);//最小化窗口
  • move(x,y,handler);//移動窗口
  • ready(handler);//只對被創建出來的窗口有用,執行父窗口闖過來的js代碼readyHandler
  • reload(handler);//重新加載當前頁面
  • reloadIgnoreCache(handler);//重新加載當前頁面并忽略緩存
  • restore(handler);//還原窗口,對應于hide函數
  • runApp(appName,param,handler);//運行一個app,appName為.app文件路徑,param為參數,會帶 在url上,格式如param=xxx,在app中可通過獲取當前網頁url從中提取出該參數。此函數不太穩定,請盡量使用runAppEx。
  • runAppEx(appName,param,handler);//也是運行一個app,同runApp的區別是會新起一個進程運行app
  • setSize(w,h,handler);//w為窗口寬度,h為窗口高度
  • setTitle(title,handler);//設置窗口標題
  • setTopMost(handler);//窗口置頂,此函數跟bringToTop的區別在于此函數會使窗口永遠置頂,除非有另外一個窗口調用了置頂函數
  • setWindowStyle(exStyle,handler);//高級函數,設置窗口額外屬性,諸如置頂之類。
  • showDev(handler);//打開開發者工具
  • stopDrag(handler);//停止窗口拖拽

圖像相關

  • saveImageFromBase64(s,path,handler);//s為base64字符串,可通過canvas的toDataURL函數生成,path為保存路徑,可以使用相對路徑,即相對主網頁文件的路徑,以下同
  • saveImageFromStream(id,width,height,path,handler);//id為二進制流id,下面會講到如何創建二進制流,width為圖像寬度,height為圖像高度,path為圖像保存路徑
  • toImage(path,handler);//把當前網頁存為一張圖片,支持透明,path為圖像保存路徑
  • toImageEx(path,x,y,width,height,handler);//把當前網頁的某一矩形區域存為圖像,x和y為左上角坐標,width和height為寬度跟高度,ptah為圖像保存路徑

系統相關

  • setTaskIcon(id,path,title,handler);//設置一托盤圖標,id自己指定,確保不重復即可,path為圖標文件所在路徑,暫時只支持本地圖標,title為鼠標移到圖標上所要顯示的文字
  • delTaskIcon(id,handler);//刪除一托盤圖標,id為創建圖標時使用的id
  • findFiles(path,flag,handler);//查找文件,path為文件路徑,支持通配符,flag為true則查找子目錄, 返回格式為一數組,格式如下”["1.txt","AmfStream.cpp","AmfStream.h", {"name":"base","list":["2.txt"]}],其中name為目錄名,list為目錄下的文件
  • getCurrentDirectory(handler);//獲取當前app文件所在目錄
  • getFolder(handler);//打開“選擇文件夾”對話框,返回值為文件夾路徑
  • getFileSize(filename,handler);//獲得文件大小,filename為文件路徑,返回值為文件所占字節數
  • getOpenName(filename,handler);//打開“打開文件”對話框,filename為對話框中要顯示的默認名字,返回值為文件路徑
  • getOpenNames(filename,handler);//打開“打開文件”對話框,支持多選,filename為對話框中要顯示的默認名字,返回值為一個數組,數組頭一個元素為文件夾路徑,剩余的元素為選擇的各個文件名字。
  • getSaveName(filename,handler);//打開“保存文件”對話框,filename為對話框中要顯示的默認名字
  • download(url,filename);//下載一文件,url為網址,filename為要保存的文件路徑
  • readFile(path,handler);//讀取一文本文件的所有內容,返回值為文件內容的字符串
  • writeFile(path,s,handler);//寫一文本文件,s為要寫入的字符串
  • logOff(flag,handler);//注銷windows系統,flag為true表示強制執行,以下同
  • reboot(flag,handler);//重啟系統
  • quit(handler);//退出當前進程
  • shutdown(flag,handler);//關閉系統
  • createMemory(name,filename,size,handler);//創建一共享內存塊,供二進制流讀寫使用,name為內 存塊命名,不同進程可通過此名字進行共享內存操作,filename文件路徑,如果不為空,則建立一磁盤文件,所有二進制操作將會寫入此文件中,為空的話 則不創建文件,所有的二進制流只在內存中進行,size為文件大小,返回值為代表內存塊的id
  • createStream(id,handler);//創建一二進制文件流,id為調用createMemory函數創建內存塊的返回值,返回值為代表二進制流的id
  • deleteMemory(id,handler);//釋放一內存塊,id為createMemory函數的返回值。使用createMemory之后要記得調用此函數釋放內存,否則會造成內存泄漏。
  • deleteStream(id,handler);//釋放一二進制流,id為createStream函數的返回值。使用createStream之后要記得調用此函數釋放內存,否則會造成內存泄漏。
  • getSharePos(handler);//獲取默認共享內存塊的二進制流讀寫指針位置。注:此內存塊為所有進程共享,默認創建的
  • setSharePos(i);設置共享內存塊的二進制流讀寫指針位置
  • getStreamPos(id,handler);//獲取一二進制流的讀寫指針位置,id為二進制流id,單位為字節,id為二進制流id,不傳則使用上面提到的默認的共享內存的二進制流,以下同
  • setStreamPos(pos,id,handler);//設置一二進制流讀寫指針的位置,單位為字節
  • readByte(id,handler);//讀取一字節
  • readBytes(l,id,handler);//讀取連續內存塊,l為內存塊的長度,返回一二進制數組
  • readInt(id,handler);//寫入一占四位字節的整數
  • readGB(l,id,handler);//讀取固定長度的GB2312編碼的字符串,l為字符串長度,注意一個漢字的長度為2
  • readString(l,id,handler);//讀取固定長度使用utf-8編碼的字符串,l為字符串長度,以下同,注意一個漢字的長度為3
  • readStringEx(l,id,handler);//讀取固定長度的字符串,對應于writeStringEx。
  • readWString(l,id,handler);//讀取固定長度的寬字符串,一個寬字符占兩個字節,無論英文或是中文,但是傳遞長度的參數時無需乘以2,只需傳字數即可
  • readWStringEx(l,id,handler);//讀取固定長度的寬字符串,對應于writeWStringEx
  • writeByte(b,id,handler);//向一二進制流寫入一字節,b為要寫入的數字
  • writeBytes(arr,id,handler);//向二進制流寫入固定長度的連續字節,arr為存儲要寫進去的數據的數組
  • writeInt(i,id,handler);//讀寫一占四字節的整數
  • writeString(s,id,handler);//寫入一字符串
  • writeStringEx(s,id,handler);//寫入一字符串,與writeString不同的是此函數會在字符串前面寫入三個字節,標明字符串的長度。
  • writeWString(s,id,handler);//寫入一寬字符串
  • writeWStringEx(s,id,handler);//寫入一寬字符串,與writeWString不同的是此函數會在字符串前面寫入三個字節,標明字符串的長度。

P2P相關

  • connect(ip,uid,handler);//連接到服務器,ip為服務器地址,uid為用戶名,服務器在內網則使用內網地址,在外網就使用外網地址
  • getIPAndPort;//獲取當前webtop窗口所使用的ip和端口號,返回值為一object,結構如下:{ip:’192.169.0.102′,port:65345}
  • getUsers(handler);//獲取所有用戶列表,該函數不會同步返回用戶列表,調用后請監聽webtopP2PUpdateUserList事件來得到用戶列表,下面關于自定義事件部分會詳細談到。
  • connectByHost(hostName,uid,handler);//連接到服務器,hostName為服務器名稱,可以為局域網機器名字或者域名,uid為用戶名
  • sendMessage(userName,msg,handler);//向一用戶發送消息,userName為用戶名稱,msg為要發送的消息
  • sendMsgToIP(ip,port,msg,handler);//向某一ip地址發送消息,參數ip為ip地址,port為端口號,msg為要發送的消息
  • sendMsgToServer(msg,handler);//向server發送消息

自定義事件

webtop中定義了一些自定義事件,如下 注,所有事件的回調函數都只有一個參數e,代表事件對象,其中e.detail對象為一object,包含事件的相關信息

  • AlloyDesktopReady事件,webtop對象創建完成之后觸發,有關webtop的初始化調用請放在此事件觸發之后。 監聽代碼:addEventListener(“webtopReady”,readyHandler);//其中webtopReady為事件 名,readyHandler為事件的回調函數。以下事件的監聽方法與此相同。注:對AlloyDesktopReady事件的監聽請放在onload之 前。
  • AlloyDesktopWindowResize:webtop窗口改變大小之后觸發,e.detail的結構如下{width:243,heigh:234}。width和height為窗口的寬度和高度
  • AlloyDesktopWindowMove:webtop窗口移動后觸發,e.detail結構如下{x:34,y:43},x和y為窗口的坐標,相對于屏幕
  • AlloyDesktopDragDrop:當拖拽文件到窗口時觸發,僅在透明渲染模式下有效(因為在此模式下html5的拖拽功能會失效)。 e.detail的結構如下{list:["E:/webtop/1.png","E:/webtop/2.png"]}。list為文件列表,存儲各個 文件的路徑
  • AlloyDesktopDownload:下載進度事件,e.detail的結構如下 {filename:”xx”,count:423,contentLength:234234},filename為文件路徑,count為已下載字節 數,contentLength為要下載內容的字節數。
  • AlloyDesktopDownloadComplete,下載完成事件。
  • AlloyDesktopWindowActive:窗口激活時觸發
  • AlloyDesktopWindowFocus:窗口獲得焦點時觸發
  • AlloyDesktopRefresh://在用戶按下F5時觸發,僅在配置項disableRefresh=0時才會觸發
  • AlloyDesktopShowDev://在用戶按下F12時觸發,僅在配置項disableDevelop=0時才會觸發
  • AlloyDesktopTaskMouse:在托盤圖標上進行相關的鼠標操作后觸發,e.detail的結構如下{type:34},其中type代表鼠標動作的類型,為一整數,在實際開發中可通過打log來獲取相關數值代表的鼠標類型
  • AlloyDesktopWindowClose:webtop窗口被關閉時觸發
  • webtopMouseLeave:鼠標離開webtop窗口時觸發
  • webtopShowTip:在鼠標移到具有title屬性的dom元素上面時觸發(webtop沒有實現默認的tips)
  • webtopP2PRecieveMessage:在webtop窗口收到p2p消息時觸發,e.detail的結構如下: {ip:’192.168.0.102′,port:64656,msg:’sfsdfsfasdf’}。ip為發送方的ip,port為發送方的端 口,msg為對方發送的消息
  • AlloyDesktopP2PInitInfo:調用connect之后,p2p初始化之后觸發,e.detail的結構如下: {ip:’192.168.0.102′,port:64656}。ip為當前webtop窗口使用的ip,port當前webtop窗口使用的端口
  • AlloyDesktopP2PUpdateUserList:調用getUsers函數之后的回調事件。e.detail的結構如下 {list: ['192.168.0.102:55654_melody','192.168.0.101:55354_yukin'],ip:’192.168.0.102′ ,port:64656}。其中192.168.0.102為該用戶的ip,55654為該用戶的端口,melody為該用戶的用戶名。ip為當前 webtop窗口使用的ip,port當前webtop窗口使用的端口

項目主頁:http://www.baiduhome.net/lib/view/home/1407911376926

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