青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

隨筆-80  評論-22  文章-0  trackbacks-0

一、WebKit簡介


WebKit 是一個開源的瀏覽器網頁排版引擎,包含WebCore排版引擎和JSCore引擎。WebCore和JSCore引擎來自于KDE項目的KHTML和 KJS開源項目。Android平臺的Web引擎框架采用了WebKit項目中的WebCore和JSCore部分,上層由Java語言封裝,并且作為 API提供給Android應用開發者,而底層使用WebKit核心庫(WebCore和JSCore)進行網頁排版。


二、WebKit目錄結構


Android平臺的WebKit模塊分成Java和WebKit庫兩個部分,其目錄結構如下表所示:

Webkit 某塊目錄結構
Java層(根目錄device\java\android\android\webkit)
BrowserFrame.java BrowserFrame對象是對WebCore庫中的Frame對象的java層封裝,用于創建WebCore中定義的Frame,以及為該Frame對象提供Java層回調方法。
ByteArrayBuilder.java ByteArrayBuilder輔助對象,用于byte塊鏈表的處理。
CacheLoader.java URL Cache載入器對象,該對象實現SteadLoader抽象基類,用于通過CacheResult對象載入內容數據。
CacheManager.java Cache管理對象,用于java層cache對象管理。
CacheSyncManger.java Cache同步管理對象,負責同步RAM和FLASH之間的瀏覽器Cache數據。實際的物理數據操作在WebSyncManager對象中完成。
CallbackProxy.java 該對象用于處理WebCore與UI線程消息代理類。當有Web事件產生時WebCore線程會調用該回調代理類,代理類通過消息方式通知UI線程,并且調用設置的客戶對象的回調函數。
CellList.java CellList定義圖片集合中的Cell,管理Cell圖片的繪制,狀態改變以及索引。
CookieManager.java 根據RFC2109規范,管理cookies.
DataLoader.java 數據載入器對象,用于載入網頁數據。
DataSorter.java 尚未使用。
DownloadListener.java 下載偵聽器接口。
DownloadManagerCore.java 下載管理器對象,管理下載列表。該對象運行于WebKit的線程中,通過CallbackProxy對象與UI線程交互。
FileLoader.java 文件載入器,用于將文件載入到Frame中。
FrameLoader.java Frame載入器,用于載入網頁Frame數據。
HttpAuthHandler.java Http認證處理對象,該對象會作為參數傳遞給BrowserCallback.displayHttpAuthDialog方法,與用戶交互。
HttpDataTime.java 該對象是處理HTTP日期的輔助對象。
JsConfirmResult.java Js確認請求對象。
JsPromptResult.java Js結果提示對象,用于向用戶提示Javascript運行結果。
JsResult.java Js結果對象,用于用戶交互。
JWebCoreJavaBridge.java 用Java與WebCore庫中的Timer和Cookies對象交互的橋接代碼。
LoaderListener.java 載入偵聽器,用于處理載入器偵聽消息。
NetWork.java 該對象封裝網絡連接邏輯,為調用者提供更高級的網絡連接接口。
PanZoom.java 用于處理圖片縮放、移動等操作。
PanZoomCellList.java 用于保存、縮放圖片的Cell。
PerfChecker.java 用于效率測試的功能對象????
SslErrorHandler.java 用于處理SSL錯誤消息。
StreamLoader.java StreamLoader抽象類是所有內容載入器對象的基類。該類是通過消息方式控制的狀態機,用于將數據載入到Frame中。
TextDialog.java 用于處理html中文本區域疊加情況,可以使用標準的文本編輯而定義的特殊的EditText控件。
URLUtil.java URL處理功能函數,用于編碼、解碼URL字符串,以及提供附加的URL類型分析功能。
WebBackForwardList.java 該對象包含WebView對象中顯示的歷史數據。
WebBackForwardListClient.java 瀏覽歷史處理的客戶接口類,所有需要接收瀏覽歷史改變的類都需要實現該接口。
WebChromeClient.java Chrome客戶基類,Chrome客戶對象在瀏覽器文檔標題、進度條、圖標改變時會得到通知。
WebHistoryItem.java 該對象用于保存一條網頁歷史數據。
WebIconDataBase.java 圖標數據庫管理對象,所有的WebView均請求相同的圖標數據庫對象。
WebSettings.java WebView的管理設置數據,該對象數據是通過JNI接口從底層獲取。
WebSyncManager.java 數據同步對象,用于RAM數據和Flash數據的同步。
WebView.java Web視圖對象,用于基本的網頁數據載入、顯示等UI操作。
WebViewClient.java Web視圖客戶對象,在Web視圖中有事件產生時,該對象可以獲得通知。
WebViewCore.java 該對象對WebCore庫進行了封裝,將UI線程中的數據請求發送給WebCore處理,并且通過CallbackProxy的方式,通過消息通知UI線程數據處理結果。
WebViewDatabase.java 該對象使用SQLiteDatabase為WebCore模塊提供數據存取操作。

 


三、WebKit模塊框架


Android平臺的Webkit有java層和webkit庫兩部分組成,java層負責與android應用層進行通信,而webkit類庫負責實際的網頁排版處理。Java層和C庫之間通過JNI和Bridge相互調用,如下圖所示:

java-webkit

 

3.1 java層框架

3.1.1 主要類關系

      WebKit模塊的java層一共由41個文件組成,其中主要的類關系如下圖所示:

class-relation

 

1. WebView

    WebView類是WebKit模塊Java層的視圖類,所有需要使用Web瀏覽器功能的Android都需要創建該視類對象顯示和處理請求的網絡資源。 目前WebKit模塊支持HTTP、HTTPS、FTP以及javascript請求。WebView作為應用程序的UI接口,為用戶提供一系列的網頁瀏 覽、用戶交互接口,客戶程序通過這些接口訪問WebKit核心代碼。

2. WebViewDatabase

    WebViewDatabase是WebKit模塊針對SQLiteDatabase對象的封裝,用于存儲和獲取運行時瀏覽器保存的緩沖數據、歷史訪問數 據、瀏覽器配置數據等。該對象是個單實例對象,通過getInstance方法獲取WebViewDatabase的實例。 WebViewDatabase是WebKit模塊中的內部對象,僅供WebKit框架內部使用。

3. WebViewCore

    WebViewCore類是java層和C層WebKit核心庫的交互類,客戶程序調用WebView的網頁瀏覽相關操作會轉發給 BrowserFrame對象。當WebKit核心庫完成實際的數據分析和處理后會回調WebViewCore中定義的一系列JNI接口,這些接口會通過 CallbackProxy將相關事件通知相應的UI對象。

4. CallbackProxy

     CallbackProxy是一個代理類,用于UI線程和WebCore線程交互。該類定義了一系列與用戶相關的通知方法,當WebCore完成相應的數 據處理,則會調用CallbackProxy類中對應的方法,這些方法通過消息方式間接調用相應的處理對象的處理方法。詳細的處理流程在下文中會具體分 析。

5. BrowserFrame

     BrowserFrame類負責URL資源的載入、訪問歷史的維護、數據緩存等操作,該類通過JNI接口直接與WebKit的C庫交互。

6. JWebCoreJavaBridge

      該類為java層Webkit代碼提供與C層WebKit核心部分的Timer和Cookies操作相關的方法。

7. DownloadManagerCore

    下載管理核心類,該類負責管理網絡資源下載,所有Web下載操作均由該類統一管理。該類實例運行在WebKit線程當中,與UI線程的交互是通過調用CallbackProxy對象中相應的方法完成。

8. WebSettings

    WEB瀏覽器通過該對象訪問相關的用戶配置信息。

9. DownloadListener

    下載偵聽接口,如果用戶代碼實現該接口,則在下載開始、失敗、掛起、完成等情況下,DownloadManagerCore對象會調用客戶代碼中實現的DownloadListener方法。

10. WebBackForwardList

    WebBackForwardList 對象維護用戶訪問歷史記錄,該類為客戶程序提供操作訪問瀏覽器歷史數據的相關方法。

11. WebViewClient

    WebViewClient類定義了一系列事件方法,如果android應用程序設置了WebVieClient派生對象,則在網頁載入、資源載入、頁面訪問錯誤等情況發生時,該派生對象的相應方法會被調用。

12. WebBackForwardListClient

    WebBackForwardListClient對象定義了對訪問歷史操作時可能產生的事件接口,當用戶實現該接口,則在操作訪問歷史時(訪問歷史移除、訪問歷史 清空等)用戶會得到通知。

13. WebChromeClient

    WebChromeClient類定義了與瀏覽器窗口修飾相關的事件。例如接收到Title、接收到Icon、進度變化時,WebChromeClient的相應方法會被調用。

 

3.1.2 主要類的設計

3.1.2.1 數據載入器的設計

    WebKit模塊的java部分框架中使用數據載入器來加載相應類型的數據,目前有CacheLoader、DataLoader以及 FileLoader三類載入器,他們分別用于緩存數據、內存數據、和文件數據的載入操作。java層(WebKit模塊)所有的載入器都從 StreamLoader繼承(其父類為Handler),由于SteamLoader 類的基類為Handler類,因此在構建載入器時,會開啟一個事件處理線程,該線程負責實際的數據載入操作,而請求線程通過消息的方式驅動數據的載入。下 圖是數據載入器相關類的類圖結構:

loader

    StreamLoader類定義了4個不同的消息:

MSG_STATUS、MSG_HEADERS、MSG_DATA、MSG_END

    分別表示發送狀態信息、發送消息頭消息、發送數據消息以及數據發送完畢消息。該類提供了2個抽象保護方法以及一個公有方 法:setupStreamAndSendStatus 保護方法主要是用于構建與通信協議相關的數據流,以及向LoadListener發送狀態。 buildHeaders方法是向子類提供構造特定協議消息頭功能。所有載入器只有一個公有方法(load),因此當需要載入數據時,調用該方法即可。與 數據載入流程相關的類還有LoaderListener以及BrowserFrame,當數據載入事件發生時,WebKit的C庫會更新載入進度,并且會 通知BrwoserFrame,BrowserFrame接收到進度條變更事件后通過CallbackProxy對象,通知View類進度條數據變更。下 買你以DataLoader類為例子,說明數據載入以及與UI交互過程(轉載者注:下圖看不清,等我搞清楚這個流程之后我再畫一個換上。):

dataLoader

    上圖中綠色部分是BrowserFrame處理進度變更事件時,調用CallbackProxy對象通知視圖變更狀態的操作,在這里省略。圖中灰色部分表示C層代碼,而白色部分表示Java層代碼。

 

3.2 C層框架

3.2.1 C類與Java類的關系

1. BrowserFrame

    與BrowserFrame Java類相對應的C++類為FrameBridge,該類對Dalvik虛擬機回調BrowserFrame類中定義的本地方法進行了封裝。與BrowserFrame中回調函數(java層)相對應的C層結構定義如下:

struct FrameBridge::JavaBrowserFrame
{
JavaVM* mJVM;
jobject mObj;
jmethodID mStartLoadingResource;
jmethodID mLoadStarted;
jmethodID mUpdateHistoryForCommit;
jmethodID mUpdateCurrentHistoryData;
jmethodID mReportError;
jmethodID setTitle;
jmethodID mWindowObjectCleared;
jmethodID mDidReceiveIcon;
jmethodID mUpdateVisiteHistory;
jmethodID mHandleUrl;
jmethodID mCreateWindow;
jmethodID mCloseWindow;
jmethodID mDecidePolicyForFormResubmission;
};
    該結構作為FrameBridge(C 層)的一個成員變量(mJavaFrame),在FrameBridge構造函數中,用BrowserFrame(java 層)類的回調方法的偏移量初始化JavaBrowserFrame結構的各個域。初始后,當WebCore(C層)在剖析網頁數據時,有Frame相關的 資源改變,比如WEB頁面的主題變化,則會通過mJavaFrame結構,調用指定BrowserFrame對象的相應方法,通知Java層處理。
2. JWebCoreJavaBridge
    與該對象相對應的C層對象為JavaBridge,javaBridge對象繼承了TimerClient和CookieClient類,負責 WebCore中的定時器和Cookie管理。與Java層JWebCoreJavaBridge類中方法偏移量相關的是JavaBridge中幾個成員 變量,在構造JavaBridge對象時,會初始化這些成員變量,之后有Timer或者Cookies事件產生時,WebCore會通過這些ID值,回調 對應JWebCoreJavaBridge的相應方法。
3. LoadListener
    與該對象相關的C層結構是 struct resourceloader_t, 該結構保存了LoadListener對象ID、CancelMethod ID以及DownloadFileMethod ID值。當有Cancel或者Download事件產生,WebCore會回調LoadListener類中的CancelMethod或者 DownloadFileMethod。
4. WebViewCore
    與WebViewCore相關的C類是WebCoreViewImpl, WebViewCoreImpl類有個JavaGlue對象作為成員變量,在構建WebCoreViewImpl對象時,用 WebViewCore(java層)中的方法ID值初始化該成員變量。并且將構建的WebCoreViewImpl對象指針賦值給 WebViewCore(java層)的mNativeClass,這樣將WebViewCore(java層)和WebViewCoreImpl(C 層)關聯起來。
5. WebSettings
    與WebSettings相關的C層結構是struct FieldIds,該結構保存了WebSettings類中定義的屬性ID以及方法ID,在WebCore初始化時(WebViewCore的靜態方法中 使用System.loadLibrary載入)會設置這些方法和屬性的ID值。
6. WebView
    與WebView相關的C層類是WebViewNative,該類中的mJavaGlue中保存了WebView中定義的屬性和方法ID,在 WebViewNative構造方法中初始化,并且將構造的WebViewNative對象的指針,賦值給WebView類的mNativeClass變 量,這樣WebView和WebViewNative對象就建立了關系。
 
3.2.2 主要類關系
    與java層相關的C層類如下表所示:
ChromeClientAndroid 該 類主要處理WebCore中與Frame裝飾相關的操作。例如設置狀態欄、滾動條、 Javascript腳本提示框等。當瀏覽器中有關事件產生時,ChromeClientAndroid類的相應方法會被調用,該類會將相關的UI事件通 過Bridge傳遞給Java層,由Java層負責繪制以及用戶交互方面的處理。
EditorClientAndroid 該類負責處理頁面中文本相關的處理,比如文本輸入、取消、輸入法數據處理、文本粘貼、文本編輯等操作。不過目前該類只對按鍵相關的事件進行了處理,其他操作均未支持。
ContextMenuClient 該類提供頁面相關的功能菜單。比如圖片拷貝、朗讀、查找等功能。但是,目前項目中未實現具體功能。
DragClient 該類定義了與頁面拖拽相關的處理,但是目前該類沒有實現具體功能。
FrameLoaderClientAndroid 該類提供與Frame加載相關的操作,當用戶請求加載一個頁面時,WebCore分析完網頁數據后,會通過該類調用Java層的回調方法,通知UI相關的組件處理。
InspectorClientAndroid 該類提供與窗口相關的操作,比如窗口顯示、關閉窗口、附加窗口等。不過目前該類的各個方法均為空實現。
Page 該類提供與頁面相關的操作,比如網頁頁面的前進、后退等操作。
FrameBridge 該類對Frame相關的Java層方法進行了封裝,當有Frame事件產生時,WebCore通過FrameBridge回調Java的回調函數,完成用戶交互過程。
AssetManager 該類為瀏覽器提供本地資源訪問功能。
RenderSkinAndroid 該類與控件繪制相關,所有的繪制控件類都需要從該類派生,目前WebKit模塊中有Button、Combo、Radio三類控件。

以上幾個類會在Java層請求創建WebFrame的時候被建立,他們的關系如下圖所示:

webFrame

上 圖中標注為深綠色的FrameAndroid是瀏覽器Frame,一個BrowserFrame對象對應著一個FrameAndroid對象。而 其他8個標注為淡綠色的類,是與該Frame顯示、布局等相關的類。WebKit模塊中所有WebCore核心代碼與用戶交互的操作使用 FrameAndroid對象中的Briedge處理(回調相應的Java方法)。

 


四、基本操作分析


4.1 WebKit模塊初始化

    Android SDK中提供了WebView類,該類為客戶提供客戶化瀏覽顯示的功能,如果客戶需要加入瀏覽器支持,可將該類的實例或者派生類的實例作為視圖,調用 Activity類的SetContentView顯示給用戶。當客戶代碼中第一次生成WebView對象時,會初始化WebKit庫(包括Java層和 C層兩個部分),之后用戶可以操作WebView對象完成網絡或者本地資源的訪問。

    WebView對象的生成主要涉及3個類CallbackProxy、WebViewCore以及WebViewDatabase。其中 CallbackProxy對象為WebKit模塊中UI線程和WebKit類庫提供交互功能,WebViewCore是WebKit的核心層,負責與C 層交互以及WebKit模塊C層類庫初始化,而WebViewDatabase為WebKit模塊運行時緩存、數據存儲提供支持。WebKit模塊初始化 流程如下:

 

WebView

      • +- 創建CallbackProxy對象
      • +- 創建WebViewCore對象
          1. 調用System.loadLibrary載入webcore類相關庫(C層)
          2. 如果是第一次初始化WebViewCore對象,創建WebCoreThread線程
          3. 創建EventHub對象,處理WebViewCore事件
          4. 獲取WebIconDatabase對象實例
          5. 向WebCoreThread發送初始化消息
      • +- 獲取WebViewDatabase實例

    如上所述,第一步調用System.loadLIbrary方法載入webcore相關類庫,該過程由Dalvik虛擬機完成,它會動態從鏈接庫目錄中尋 找libWebCore.so類庫,載入內存中,并且調用WebKit初始化模塊的JNI_OnLoad方法。WebKit模塊的JNI_OnLoad方 法中完成如下初始化操作:

a) 初始化framebridge[register_android_webcore_framebridge]

初始化gFrameAndroidField靜態變量,以及注冊BrowserFrame類中的本地方法表。

b) 初始化javabridge[register_android_webcore_javabridge]

初始化gJavaBridge.mObject對象,以及注冊JWebCoreJavaBridge類中的本地方法

c) 初始化資源loader[register_android_webcore_resource_loader]

初始化gResourceLoader靜態變量,以及注冊LoadListener類的本地方法

d) 初始化webviewcore[register_android_webkit_webviewcore]

初始化gWebCoreViewImplField靜態變量,以及注冊WebViewCore類的本地方法

e) 初始化webhistory[register_android_webkit_webhistory]

初始化gWebHistoryItem結構,以及注冊WebBackForwardList和WebHistoryItem類的本地方法

f) 初始化webicondatabase[register_android_webkit_webicondatabase]

注冊WebIconDatabase類的本地方法

g) 初始化websettings[register_android_webkit_websettings]

初始化gFieldIds靜態變量,以及注冊WebSettings類的本地方法

h) 初始化webview[register_android_webkit_webview]

初始化gWebViewNativeField靜態變量,以及注冊WebView類的本地方法

    第二步是WebCoreThread初始化,該初始化只在第一次創建WebViewCore對象時完成,當用戶代碼第一次生成WebView對象,會在初 始化WebViewCore類時創建WebCoreThread線程,該線程負責處理WebCore初始化事件。此時WebViewCore構造函數會被 阻塞,直到一個WebView初始化請求完畢時,會在WebCoreThread線程中喚醒。

    第三步創建EventStub對象,該對象處理WebView類的事件,當WebCore初始化完成后會向WebView對象發送事件,WebView類的EventStub對象處理該事件,并且完成后續初始化工作。

    第四步獲取WebIconDatabase對象實例。

    第五步向WebViewCore發送INITIALIZE事件,并且將this指針作為消息內容傳遞。WebView類主要負責處理UI相關的事件,而 WebViewCore主要負責與WebCore庫交互。在運行時期,UI線程和WebCore數據處理線程是運行在兩個獨立的線程當中。 WebCoreThread線程接收到INITIALIZE線程后,會調用消息對象參數的initialize方法,而后喚醒阻塞的 WebViewCore Java線程(該線程在WebViewCore的構造函數中被阻塞)。不同的WebView對象實例有不同的WebViewCore對象實例,因此通過消 息的方式可以使得UI線程和WebViewCore線程解耦合。WebCoreThread的事件處理函數,處理INITIALIZE消息時,調用的是不 同WebView中WebViewCore實例的initialize方法。WebViewCore類中的initialize方法中會創建 BrowserFrame對象(該對象管理整個WEB窗體,以frame相關事件),并且向WebView對象發送 WEBCORE_INITIALIZED_MSG_ID消息。WebView消息處理函數,會根據消息參數1初始化指定的WebViewCore對象,并 且更新WebViewCore的Frame緩沖。

    初始化過程的序列圖如下圖所示:

webcore

    初始化完成后Java層和C層類圖關系如下圖所示:

WebView_c

上圖中淡綠色的類表示Java層,而灰色類表示C層。

 

4.2 數據載入

4.2.1 載入網路數據

    客戶代碼中可以使用WebView類的loadUrl方法,請求訪問指定的URL網頁數據。WebView對象中保存著WebViewCore的引用,由 于WebView屬于UI線程,而WebViewCore屬于后臺線程,因此WebView對象的loadUrl被調用時,會通過消息的方式將URL信息 傳遞給WebViewCore對象,該對象會調用成員變量mBrowserFrame的loadUrl方法,進而調用WebKit庫完成數據的載入。其調 用函數序列如下所示:

loadurl

    網絡數據的載入分別由Java層和C層共同完成,Java層完成用戶交互、資源下載等操作,而C層主要完成數據分析(建立DOM樹、分析頁面元素等)操 作。由于UI線程和WebCore線程運行在不同的兩個線程中,因此當用戶請求訪問網絡資源時,通過消息的方式向WebViewCore對象發送載入資源 請求。在Java層的WebKit模塊中,所有與資源載入相關的操作都是由BrowserFrame類中對應的方法完成,這些方法是本地方法,會直接調用 WebCore庫的C層函數完成數據載入請求,以及資源分析等操作。如上圖所示,C層的FrameLoader類是瀏覽框架的資源載入器,該類負責檢查訪 問策略以及向Java層發送下載資源請求等功能。在FrameLoader中,當用戶請求網絡資源時,經過一系列的策略檢查后會調用 FrameBridge的startLoadingResource方法,該方法會回調BrowserFrame(Java)類的 startLoadingResource方法,完成網絡數據的下載,而后BrowserFrame(Java)類的 startLoadingResource方法會返回一個LoadListener的對象,FrameLoader會刪除原有的FrameLoader對 象,將LoadListener對象封裝成ResourceLoadHandler對象,并且將其設置為新的FrameLoader。到此完成了一次資源 訪問請求,接下來的任務即是WebCore庫會根據資源數據進行分析和構建DOM,以及相關的數據結構。

 

4.2.2 載入本地數據

本 地數據是以data://開頭的URL表示,載入過程和網絡數據一樣,只不過在執行FrameLoader類的executeLoad方法時,會 根據URL的SCHEME類型區分,調用DataLoader的requestUrl方法(參看3.1.2.1節對載入器的分析),而不是調用 handleHTTPLoad建立實際的網絡通信連接。

 

4.2.3 載入文件數據

文 件數據是以file://開頭的URL,載入的基本流程與網絡數據載入流程基本一致,不同的是在運行FrameLoader類的 executeLoad方法時,根據SCHEME類型,調用FileLoader的requestUrl方法,完成數據加載(參看3.1.2.1節對載入 器的分析)。

 

4.3 刷新繪制

    當用戶拖動滾動條、有窗口遮蓋、或者有頁面事件觸發都會向WebViewCore(Java層)對象發送背景重繪消息,該消息會引起網頁數據的繪制操作。 WebKit的數據繪制可能出于效率上的考慮,沒有通過Java層,而是直接在C層使用SGL庫完成。與Java層圖形繪制相關的Java對象有如下幾 個:

    1. Picture類

該類對SGL封裝,其中變量mNativePicture實際上是保存著SkPicture對象的指針。WebViewCore中定義了兩個Picture對象,當作雙緩沖處理,在調用webKitDraw方法時,會交換兩個緩沖區,加速刷新速度。

    2. WebView類

該 類接受用戶交互相關的操作,當有滾屏、窗口遮蓋、用戶點擊頁面按鈕等相關操作時,WebView對象會與之相關的WebViewCore 對象發送VIEW_SIZE_CHANGED消息。當WebViewCore對象接收到該消息后,將構建時建立的mContentPictureB刷新到 屏幕上,然后將mContentPictureA與之交換。

    3. WebViewCore類

該類封裝了WebKit C層代碼,為視圖類提供對WebKit的操作接口,所有對WebKit庫的用戶請求均由該類處理,并且該類還為視圖類提供了兩個Picture對象,用于圖形數據刷新。

    下面以Web頁面被鼠標拖拽的情況為例子,分析網頁數據刷新過程。

    當用戶使用手指點擊觸摸屏,并且移動手指,則會引發touch事件的產生,Android平臺會將touch事件傳遞給最前端的視圖相應 (dispatchTouchEvent方法處理)。在WebView類中定義了5種touch模式,在手指拖動Web頁面的情況下,會觸發 mMotionDragMode,并且會調用View類的scrollBy方法,觸發滾屏事件以及使視圖無效(重繪,會調用View的onDraw方 法)。WebView視圖中的滾屏事件由onScrollChanged方法響應,該方法向WebViewCore對象發送 SET_VISIBLE_RECT事件。

    WebViewCore對象接收到SET_VISIBLE_RECT事件后,將消息參數中保存的新視圖的矩形區域大小傳遞給 nativeSetVisibleRect方法,通知WebCoreViewImpl對象(C層)視圖矩形變更 (WebCoreViewImpl::setVisibleRect方法)。在setVisibleRect方法中,會通過虛擬機調用 WebViewCore的contentInvalidate方法,該方法會引發webkitDraw方法的調用(通過WEBKIT_DRAW消息)。在 webkitDraw方法里,首先會將mContentPictureB對象傳遞給本地方法nativeDraw繪制,而后將 mContentPictureB的內容與mContentPictureA的內容對調。在這里mContentPictureA 緩沖區是供給WebViewCore的draw方法使用,如果用戶選擇某個控件,繪制焦點框時候WebViewCore對象的draw方法會調用,繪制的 內容保存在mContentPictureA中,之后會通過Canvas對象(Java層)的drawPicture方法將其繪制到屏幕上,而 mContentPictureB緩沖區是用于built操作的,nativeDraw方法中首先會將傳遞的mContentPictureB對象數據重 置,而后在重新構建的mContentPictureB畫布上,將層上相關的元素繪制到該畫布上。上面提到,之后會將mContentPictureB和 mContentPictureA的內容對調,這樣一次重繪事件產生時(會調用WebView.onDraw方法)會將mContentPictureA 的數據使用Canvas類的drawPicture繪制到屏幕上。當webkitDraw方法將mContentPictureA與 mContentPictureB指針對調后,會向WebView對象發送NEW_PICTURE_MSG_ID消息,該消息會引發 WebViewCore的VIEW_SIZE_CHANGED消息的產生,并且會使當前視圖無效產生重繪事件(invalidate()),引發 onDraw方法的調用,完成一次網頁數據的繪制過程。

~~~ END ~~~

本文轉自: http://www.jjos.org/android/2010/05/10/312_webkit-webkit-for-android.html

posted on 2012-04-11 10:38 Bluesea 閱讀(1481) 評論(0)  編輯 收藏 引用 所屬分類: Android-WebKit
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            99精品视频网| 黄色一区二区在线| 国产精品久久7| 亚洲国产天堂久久国产91| 欧美**人妖| 美女网站久久| 亚洲全部视频| 国产精品国产三级国产aⅴ9色 | 亚洲永久视频| 欧美日韩一区二区三区在线| 国产精品美女在线| 亚洲午夜一区二区三区| 欧美激情黄色片| 裸体一区二区| 亚洲精品国产精品国自产在线| 一区二区欧美在线观看| 欧美v国产在线一区二区三区| 羞羞色国产精品| 亚洲人成人一区二区三区| 欧美一区二区三区在线看| 99在线热播精品免费99热| 免费亚洲网站| a91a精品视频在线观看| 久久综合九色九九| 欧美日韩午夜在线| 欧美精品一区二区视频| 久久爱另类一区二区小说| 一区二区三区导航| 一色屋精品视频在线看| 亚洲国产电影| 日韩午夜激情电影| 欧美精品在线网站| 精品二区久久| 欧美影院一区| 国产精品www网站| 亚洲精品国产欧美| 亚洲激情另类| 快播亚洲色图| 久久精品国亚洲| 欧美日韩精品三区| 乱码第一页成人| 欧美77777| 伊人久久婷婷| 欧美激情性爽国产精品17p| 亚洲国产黄色| 免费日本视频一区| 午夜精品短视频| 亚洲电影在线免费观看| 国产视频亚洲| 一区二区三区四区五区视频| 欧美mv日韩mv国产网站| 免费在线看成人av| 亚洲视频电影图片偷拍一区| 久久久久久午夜| 亚洲欧美卡通另类91av| 在线看片成人| 亚洲欧洲日本一区二区三区| 欧美日韩在线播| 欧美裸体一区二区三区| 浪潮色综合久久天堂| 牛夜精品久久久久久久99黑人| 在线一区二区三区四区| 欧美黄色小视频| 久久国产天堂福利天堂| 亚洲欧洲精品成人久久奇米网| 欧美日韩免费在线| 欧美精品久久久久久久久久| 欧美激情中文字幕在线| 亚洲一区三区在线观看| 伊人精品久久久久7777| 国产精品成人一区二区艾草| 一本久道久久综合中文字幕| 久久av一区二区| 性色av一区二区三区| 中文久久精品| 午夜精品免费在线| 亚洲免费一在线| 久久一区国产| 亚洲一区二区成人| 久久视频精品在线| 亚洲福利在线视频| 中文av字幕一区| 亚洲成人在线网| 国产三级欧美三级| 一本一本久久| 一本大道久久精品懂色aⅴ | 亚洲色图制服丝袜| 老司机精品久久| 噜噜噜91成人网| 国精品一区二区三区| 亚洲永久在线| 性久久久久久久| 国产精品专区第二| 亚洲男人av电影| 欧美专区中文字幕| 国产一区二区三区成人欧美日韩在线观看| 欧美在线视频观看| 国产视频一区三区| 欧美一级视频精品观看| 亚洲天堂免费观看| 欧美小视频在线观看| 91久久久国产精品| 99在线热播精品免费99热| 欧美a级在线| 亚洲人成人77777线观看| 亚洲精品美女在线观看播放| 久久国产精品99久久久久久老狼| 性欧美8khd高清极品| 国产精品呻吟| 久久国产精品久久国产精品| 欧美一级一区| 禁断一区二区三区在线 | 影音先锋日韩精品| 噜噜噜在线观看免费视频日韩| 久久天天狠狠| 亚洲国产成人久久综合| 久久久久.com| 亚洲欧洲精品一区二区三区不卡 | 欧美成人在线免费观看| 欧美激情在线狂野欧美精品| 黄色一区二区三区四区| 久久婷婷综合激情| 亚洲精品国偷自产在线99热| 亚洲狼人精品一区二区三区| 久久综合久色欧美综合狠狠| 免费成人网www| 亚洲免费观看高清完整版在线观看| 欧美激情四色| 亚洲欧美中文另类| 亚洲国产成人高清精品| 在线视频中文亚洲| 国产专区一区| 欧美日韩一卡二卡| 久久久.com| 中文国产成人精品久久一| 欧美一区影院| 亚洲理伦在线| 狠久久av成人天堂| 欧美视频中文在线看| 欧美一区二区三区久久精品| 久久亚洲私人国产精品va| 日韩一二三在线视频播| 国产精品中文字幕欧美| 免费看精品久久片| 欧美一区亚洲一区| 一区二区久久久久| 亚洲国产专区校园欧美| 欧美在线啊v一区| 一本一道久久综合狠狠老精东影业 | 亚洲欧美自拍偷拍| 91久久精品国产91久久性色tv| 国产精品久久久久77777| 久久婷婷综合激情| 久久狠狠久久综合桃花| 亚洲视频1区2区| 亚洲人成在线观看网站高清| 亚洲欧美日韩一区二区三区在线| 一区二区在线视频观看| 在线观看欧美视频| 亚洲国产欧美国产综合一区| 麻豆成人在线| 亚洲国产成人在线播放| 欧美在线一区二区| 欧美国产日韩一二三区| 亚洲精选国产| 亚洲一区二区三区四区视频| 欧美香蕉视频| 亚洲高清资源| 黑人操亚洲美女惩罚| 亚洲经典在线| 亚洲精品中文字| 亚洲综合色激情五月| 在线观看精品| 久久男女视频| 亚洲国产视频一区| 亚洲精品一区二区三区婷婷月| 亚洲直播在线一区| 亚洲尤物在线视频观看| 久久理论片午夜琪琪电影网| 亚洲高清一区二区三区| 日韩午夜在线观看视频| 在线成人小视频| 久久久久久久国产| 美日韩精品免费| 亚洲人成欧美中文字幕| 久久久成人精品| 亚洲激情电影在线| 亚洲另类黄色| 国产麻豆精品视频| 久久精品国语| 亚洲人成网站色ww在线| 精品69视频一区二区三区| 久久久久久久久久码影片| 久久久99国产精品免费| 国产日韩欧美在线看| 亚洲欧美日韩精品久久久| 久久久久久综合网天天| 亚洲国产精品专区久久| 极品少妇一区二区三区| 国产一区二区三区观看|