Skia的UI控件的基類為SkNoncopyable,擴(kuò)展類包括SkImageView、SkStaticView、SkAnimatorView、SkBorderView、SkButtonView、SkListView、SkProgressBarView、SkScrollbarView等UI控件視圖。Skia的顯示類型定義在SkDisplayType.h中。Skia引擎的UI控件架構(gòu)如下圖所示。

Skia引擎的UI控件架構(gòu)
但就目前而言,Skia的UI控件并沒(méi)被編譯到當(dāng)前的工程中,這里就只做一些簡(jiǎn)單的介紹。
SkView是屏幕管理的基類,支持視圖的kVisible_Mask、kEnabled_Mask、kFocusable_Mask、kFlexH_Mask、kFlexV_Mask等標(biāo)志位操作。對(duì)視圖的大小、寬高、焦點(diǎn)等進(jìn)行處理。其擴(kuò)展類包括SkStaticTextView、SkBitmapView、SkWidgetView(已棄用)、SkSliderView(已棄用)、SkHasLabelView、SkPushButtonView、SkCheckBoxView、SkProgressView、SkTextView(已棄用)、SkListView、SkGridView、SkWindow等。
SkWidget為UI控件的基類,在SkView的基礎(chǔ)上增加了對(duì)控件事件的處理能力,相關(guān)的擴(kuò)展類包括SkHasLabelWidget、SkButtonWidget、SkPushButtonWidget、SkCheckBoxWidget等。
Skia的事件處理是通過(guò)SkEventSink、SkEvent等來(lái)進(jìn)行的,其中SkEvent是Skia事件的攜帶者,SkEventSink是Skia事件的接收者。Skia通過(guò)一個(gè)32位的UUID即SkEventSinkID來(lái)標(biāo)識(shí)SkEventSink對(duì)象,當(dāng)有Skia事件被推送時(shí),Skia會(huì)根據(jù)SkEvent對(duì)象攜帶的SkEventSinkID值將Skia事件分發(fā)給對(duì)應(yīng)的SkEventSink。Skia事件的數(shù)據(jù)被封裝在SkMetaData中。
Skia根據(jù)SkEventSinkID來(lái)查詢相關(guān)的SkEventSink的過(guò)程如下:
代碼:SkEventSink::FindSink()的實(shí)現(xiàn)
SkEventSink* SkEventSink::FindSink(SkEventSinkID sinkID)
{
if (sinkID==0)
return 0;
SkEventSink_Globals& globals=*(SkEventSink_Globals*)SkGlobals::Find(SK_EventSink_GlobalsTag, create_globals);
SkAutoMutexAcquire ac(globals.fSinkMutex);
SkEventSink* sink=globals.fSinkHead;
while (sink)
{
if (sink->getSinkID()==sinkID)
return sink;
sink=sink->fNextSink;
}
return NULL;
}
Skia事件的處理在SkEventSink::DoEvent()中進(jìn)行。