深入剖析锤子onestep代码实现 - 中篇

代码总体架构

项目比较简单,全都采用适配器模式+单例模式搞定。
TopView自不必说,只有三个按钮。以侧边栏为例,层级架构图如下:

深入剖析锤子onestep代码实现 - 中篇_第1张图片
总体架构层级图.jpg

关键类

入口类

  • SidebarService
    onestep的后台服务类,整个程序入口在此。有两个地方触发该服务的启动,一个是系统层监听到左、右上角的滑动事件,一个是用户在桌面点击onestep图标进入设置界面。

  • SidebarController
    SidebarService启动后,第一件事就是调用SidebarController.init(),把UI、后台数据类等启动起来。
    不要被后缀Controller给骗了,它根本不是MVC模式中的Controller类,它就是一个控制onestep的UI的总管罢了。
    主要功能:处理onestep模式的进入、退出事件,整体UI的显示、隐藏、侧边栏模式的顶层控制处理。

UI类

顶部栏

  • TopView
    顶层栏视图容器类,继承自FrameLayout,容纳三个图标按钮,即最近图片、文档、剪贴板。
    功能:显示三个最近XX的图标按钮,处理它们的点击事件,带动画效果。

侧边栏

  • SidebarRootView
    侧边栏根布局视图类,继承FrameLayout,容纳所有侧边栏视图内容
    功能:主要处理侧边栏图标长按拖动效果的顶层处理,包括显示流程逻辑、动画、触摸事件

  • SideView
    侧边栏显示列表内容的类,列表内容主要有三种,联系人,应用图标,分享组件图标,且还有几种是辅助拖拽效果的。
    分两层显示,每层用一个DragScrollView承载,里面放SidebarListView视图组件,SidebarListView才是真正放图标的地方。

功能一:接受系统拖拽目标的放置,动画、触摸事件的顶层处理,然后调起相应的应用,把信息发过去,类型有文字、图片等
功能二:设置、退出两个功能图标按钮

  • DragScrollView
    继承自ScrollView,容纳列表视图,主要处理触摸事件,同时支持拖动与滚动的功能。

  • SidebarListView
    侧边栏里的列表类,继承ListView,真正容纳图标的地方
    功能:显示图标列表,动画,图标长按事件监听与处理,拖拽事件转发给SidebarAdapter的具体子类处理

深入剖析锤子onestep代码实现 - 中篇_第2张图片
SideView.jpg

内容列表视图

  • ContentView
    内容视图总容器,继承自RelativeLayout,主要用来承载三个最近XXX内容列表,显隐、切换。当然,还有Back键和触摸处理。
深入剖析锤子onestep代码实现 - 中篇_第3张图片
ContentView.jpg
  • RoundCornerFrameLayout
    内容视图列表面板视图类,继承FrameLayout,主要提供圆角矩形的面板效果
    它有四个具体子类,实际只用到三个,恰好是我们看到的三个最近xxx的面板
    ClipboardViewGroup:最近剪贴板
    RecentFileViewGroup:最近文件
    RecentPhotoViewGroup:最近图片
    BookmarkViewGroup:未使用

  • RecentPhotoViewGroup
    最近图片列表视图容器类,继承自RoundCornerFrameLayout,内部容纳了一个ListView,用来承载最近图片的条目,视图数据来自RecentPhotoAdapter

  • RecentFileViewGroup
    类上,只是数据适配器,用了RecentFileAdapter

  • ClipboardViewGroup
    类上,只是数据适配器,用了ClipboardAdapter

  • BookmarkViewGroup
    实际未使用

深入剖析锤子onestep代码实现 - 中篇_第4张图片
RecentXXXGroup.jpg
  • PhotoLineSubView, RecentFileItemView, ClipboardItemView
    具体视图条目类,它们均为最近xxx面板视图的具体条目,三类面板,对应三类条目,内部逻辑都是负责条目的视图显示、点击与长按事件处理。

设置界面相关

适配器类

  • SidebarAdapter
    侧边栏列表适配器抽象类,继承BaseAdapter
    提供视图数据自不必说,数据来自其成员变量,数据层的各种XXXManager类单例。
    关键是定义了拖拽事件的中转接口,子类必须实现来最终处理DragEvent。
    它有四个具体子类,分别是:
    AppListAdapter:应用列表适配器
    ContactListAdapter:联系人列表适配器
    OngoingAdapter:暂未分析
    ResolveInfoListAdapter:分享应用组件列表适配器
深入剖析锤子onestep代码实现 - 中篇_第5张图片
SidebarAdapter.jpg
  • RecentPhotoAdapter,RecentFileAdapter,ClipboardAdapter
    按名称分别对应上述RecentXXXXGroup的列表视图适配器类,继承自BaseAdapter,提供条目视图及绑定数据。
深入剖析锤子onestep代码实现 - 中篇_第6张图片
RecentXXAdapter.jpg

视图数据类

  • SidebarItem
    侧边栏条目视图的抽象描述类,定义了一些共同操作接口函数,如获取名称、图标、处理拖拽事件等。
    它有四个直接子类,
    AppItem,应用图标,只用于直接点击打开应用,不支持拖拽分享。
    ContactItem,联系人图标,支持拖拽分享。具体有四种联系人,对应四个子类,见图。
    OngoingItem,略。
    ResolveInfoGroup,支持分享应用组件,拖拽分享的主要目标。
深入剖析锤子onestep代码实现 - 中篇_第7张图片
SidebarItem.jpg

数据层相关类

  • DataManager
    数据管理抽象类,定义了数据更新监听器接口,当有数据更新时,通知XXXAdapter适配器,然后更新到UI。
    因为数据层,即XXXManager类,有自己的工作子线程,数据操作是异步的,数据变动完毕后,通过这些监听接口,通知到视图层。
    它有几个主要的子类,基本上一看名字就知道,它是为哪个对应的Adapter提供数据的。
    这些xxxManager都是单例类,提供全局的数据访问。
    侧边栏相关的是:
    AppManager,ContactManager, OngoingManager, ResolveInfoManager
    (ResolveInfoManager实际并未继承DataManager,但内部架构逻辑其实与其它三个一致,实际应该继承,获得统一的架构逻辑)
    内容视图相关的是:
    RecentPhotoManager,RecentFileManager,RecentClipManager
深入剖析锤子onestep代码实现 - 中篇_第8张图片
DataManager.jpg

事件类

  • PackagesMonitor
    应用包信息更新监视类,继承自BroadcastReceiver,广播接收,当有应用包信息更新时,比如新安装了应用,就会收到广播消息,然后通知数据层相关数据管理类更新数据。

  • ShortcutReceiver
    桌面Shortcut变动通知,继承自BroadcastReceiver

你可能感兴趣的:(深入剖析锤子onestep代码实现 - 中篇)