十個Flex Air疑難雜症及解決方案簡略

2021-08-30 16:27:05 字數 2648 閱讀 3581

最近去一家台企面試,對方給我出了十道「難道」:

ps:一種語言在發音上有幾十種不同的方言風格,在書寫上竟然也有兩種截然不同的風格,不止何時可以統一。

雜症**及解決方案簡略:

並非tilelist有這個問題,在flex3內,datagrid,list,tree等控制項如果使用不當,均存在這個問題;在先前的fl元件包 內的tilelist元件也有類似陰影。根本原因在於,使用itemrenderer的大資料控制項,其在渲染時,並不會一次建立所有資料列/行的顯示物件 (itemrenderer),它僅會建立在螢幕上可見的資料列/行,並且重複利用這些顯示物件,以提交執行時效率。

可以做這樣一種**實驗,以幫助人們理解這種機制:在乙個tilelist控制項內,它本身有滾動條,它的itemrenderer也使其有滾動條, 在多屏資料的情況下,任意滾動乙個itemrenderer的滾動條,然後滾動tilelist的滾動條到另一屏,你會發現,雖然資料已經變了,你從未滾 動過這個資料,但它與你先前滾動過的那個資料具有相同的滾動位置。

從嚴格意義上講,這並不能算是adobe的bug,因為如果你嚴格按照adobe的官方說明使用,多數情況下,是不會出現的,因此這個bug的復現 也頗具難度。從flex sdk 3.5開始,adobe flex團隊,對所有基於itemrenderer實現的資料控制項針對開發者遇到的問題進行了改良,優化了sdk內部控制項實現方法,並且新增了乙個 offscreenextrarowsorcolumns屬性,該屬性意為非顯示區域的行或列數,用於幫助開發者在特定情況下遇到的花屏問題。

如果遇到這個問題,如果解決(方案按優先順序自上向下排列):

1) 修改策劃

顯示大資料時,傳統滾動條是乙個糟糕的設計,因為人的眼晴對於大量的,重複結構的資料,很難定位上次檢視的位置,多數人都是邊察看邊用指在螢幕上做標記。此種情況下,

a)要麼不使用滾動條,使用翻頁,使用者每次翻頁後,重新取資料、向資料控制項賦值,在這種情況下,datagrid,tilelist等均不會出現花屏問題,因為壓根兒就不會有滾動,但在此時,使用repeater效率更高 。

b)要麼設計一種粗粒度滾動條,如下圖示意:

在這種粗粒度滾動中,每乙個點相關於翻頁設計中的一頁,使用者拖動時還相當有手感,相對傳統滾動條要好許多,這種設計在許多產品中都已經開始使用。

2)在更新dataprovider時手動重新整理控制項檢視

每次當data有變化,均手動再次設定一次itemrenderer,大意如下:

list.itemrenderer = new classfactory(youritemrenderer);

注:在gumbo中,如果使用bindable繫結資料,fb在編譯時已經做了**優化。所以,多數時候,按照官方方法可以避免很多問題。

3)使用offscreenextrarowsorcolumns屬性調整

這是最bt的方案,讓人感覺是adobe自己用演算法難已處理了,所以請使用者告訴控制項目前有多少資料列/行在顯示區外。具體用法請參照livedoc說明。

最基本的白板實現方案是基於shareobject,但這種實現是demo級的,既浪費資源效能又低,比較合理的設計,作者認為應該是這樣:

1)控制權轉移實則是多人資料同步,資料同步不要使用so,當控制權變化時,由server處理並向client廣播,如果在同一時間內白板只充許有一人控制,此時僅需向二人廣播,如果其它人也需要知道當前人控權者是誰,通過另外統一的狀態廣播實現。

2)畫面同步必須設計出二種機制,一種為指令繪製型,另一種為影象同步型。對於後來進入**白板的人使用者,它第一次需要向server請求當前最新的白板 畫面,server選擇乙個最可靠的client的白板資料發給新來者,或者使用p2p技術直接由client端傳送。指令繪製型用於在活動使用者之間更新 白板資料、動作。指令需自行設計,這種設計可以輕鬆實現白板重繪。

3)錄影在這裡有兩種實現,一種為imagesnapshot,另一種為指令重繪型。

預設情況下,在網頁中swf物件之上放置不了浮動層,解決方案是修改flashvars屬性值,把wmode修改為opaque,同時對照其它物件,排列z-index。

這個問題沒有一步到位的方案,屬於架構師考慮的設計問題。自定義一種輸入框,自定義一套emoticon標籤,每乙個表情用乙個自定義標籤標識,監 聽輸入框的copy與paste事件,送入剪輯板的資料僅包含emoticon標籤,而不是影象資料,在paste時進行解析、替換。

系統焦點離開air後,即使在air中有key_down事情監聽也無濟於事。解決方案是,rumtime公升級到air 2.0,在air程式啟動時,同時啟動乙個c++ native progress,當air程式最小化至系統托盤後,由c++程式負責監聽系統按鍵,以此實現air程度快捷鍵撥出。

air直接寫不了,解決方案有兩種方向:

1)與問題7同,使用nvtive progress寫登錄檔

2)不使用air,使用替換解決方案flex4u

這裡面有二個問題,第乙個,對於必須要求rumtime為2.0的air程式,在編譯時指定,強制使用者公升級。

第二個,在網頁中安裝air,如何知道使用者的air rumtime版本?

從原理上講,可以hack反編譯之後的原始碼,重新編譯為自已的air.swf,然後自定義bridge網頁安裝實現。

這個問題不複雜。如果不使用系統鑲邊,自定義游標顯示物件,新增進顯示列表,並新增事情監聽實現縮放與拖動邏輯。在livedoc中官方曾見有示例,有興趣的朋友可以查一查。

十個Flex Air疑難雜症及解決方案簡略

最近去一家台企,對方給我出了十道 難道 在tilelist中如果選擇檔過多,會出現卷軸,當拖動卷軸時,渲染的進度條會出現花屏現象 簡體 在tilelist中如果選擇檔過多,會出現卷軸,當拖動卷軸時,渲染的進度條會出現花屏現象 電子白板中,控制權轉移 簡體 電子白板中,控制權轉移 電子白板中,畫面同步...

Pentest Box之疑難雜症(解決)

1.首先找到配置路徑 f bin customtools f代表 pentest box整個路徑 其中msfupdate cd d pentestbox root d代表 pentestbox檔案路徑 3.轉到windows defender 排除 新增c pentestbox?這是整個資料夾。5 ...

SQL Server疑難雜症解決之道

系列之一使用dbcc捕獲死鎖 經常會被客戶問道 應用程式被死鎖報錯啦?影響很大,到底是哪個程序導致了死鎖發生的啊?怎麼解決啊?怎麼辦呀?如何解決呢?不管是rds sql server還是自建,死鎖的確是乙個非常頭疼的問題。這篇文章是以死鎖問題為背景,分享死鎖文章系列之二使用profiler捕獲死鎖。...