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

代码总体架构

项目比较简单,全都采用适配器模式+单例模式搞定。
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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,294评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,493评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,790评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,595评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,718评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,906评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,053评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,797评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,250评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,570评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,711评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,388评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,018评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,796评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,023评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,461评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,595评论 2 350

推荐阅读更多精彩内容

  • 内容抽屉菜单ListViewWebViewSwitchButton按钮点赞按钮进度条TabLayout图标下拉刷新...
    皇小弟阅读 46,733评论 22 665
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,825评论 25 707
  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 12,066评论 4 62
  • 今天给大家分享一个axure案例,锚点滚动效果,看到名字,大家可能觉得有些陌生,相信这个效果大家并不陌生,在许多h...
    lvylh阅读 4,494评论 1 1
  • 很难无聊,偷的闲来便和自己玩游戏,把文字打散,像是把时间乱到一起。 堇色的清秀和着步伐轻的无与伦比,无...
    婉儿簌簌阅读 363评论 1 1