美文网首页Android进阶程序员
深入剖析锤子onestep代码实现 - 中篇

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

作者: YY17 | 来源:发表于2017-03-11 17:42 被阅读397次

    代码总体架构

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

    总体架构层级图.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的具体子类处理

    SideView.jpg

    内容列表视图

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

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

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

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

    • BookmarkViewGroup
      实际未使用

    RecentXXXGroup.jpg
    • PhotoLineSubView, RecentFileItemView, ClipboardItemView
      具体视图条目类,它们均为最近xxx面板视图的具体条目,三类面板,对应三类条目,内部逻辑都是负责条目的视图显示、点击与长按事件处理。

    设置界面相关

    适配器类

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

    视图数据类

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

    数据层相关类

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

    事件类

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

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

    相关文章

      网友评论

        本文标题: 深入剖析锤子onestep代码实现 - 中篇

        本文链接:https://www.haomeiwen.com/subject/maruwttx.html