Skia的UI控件的基类为SkNoncopyable,扩展类包括SkImageView、SkStaticView、SkAnimatorView、SkBorderView、SkButtonView、SkListView、SkProgressBarView、SkScrollbarView等UI控件视图。Skia的显示类型定义在SkDisplayType.h中。Skia引擎的UI控件架构如下图所示。

Skia引擎的UI控件架构
但就目前而言,Skia的UI控件并没被编译到当前的工程中,这里就只做一些简单的介绍。
SkView是屏幕管理的基类,支持视图的kVisible_Mask、kEnabled_Mask、kFocusable_Mask、kFlexH_Mask、kFlexV_Mask等标志位操作。对视图的大小、宽高、焦点等进行处理。其扩展类包括SkStaticTextView、SkBitmapView、SkWidgetView(已弃用)、SkSliderView(已弃用)、SkHasLabelView、SkPushButtonView、SkCheckBoxView、SkProgressView、SkTextView(已弃用)、SkListView、SkGridView、SkWindow等。
SkWidget为UI控件的基类,在SkView的基础上增加了对控件事件的处理能力,相关的扩展类包括SkHasLabelWidget、SkButtonWidget、SkPushButtonWidget、SkCheckBoxWidget等。
Skia的事件处理是通过SkEventSink、SkEvent等来进行的,其中SkEvent是Skia事件的携带者,SkEventSink是Skia事件的接收者。Skia通过一个32位的UUID即SkEventSinkID来标识SkEventSink对象,当有Skia事件被推送时,Skia会根据SkEvent对象携带的SkEventSinkID值将Skia事件分发给对应的SkEventSink。Skia事件的数据被封装在SkMetaData中。
Skia根据SkEventSinkID来查询相关的SkEventSink的过程如下:
代码:SkEventSink::FindSink()的实现
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()中进行。