博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
代码追踪 20130419
阅读量:4207 次
发布时间:2019-05-26

本文共 4274 字,大约阅读时间需要 14 分钟。

简化:

控制应用表 APM

应用的显示视图 APV

应用管理 PM

文件夹管理 FM

文件夹显示视图 AFV

控制拖动 DCV

特定的界面 SV

系统相关界面 SYMV

多点触摸控制 MTM

1. 入口Activity,初始化过程

layout:声明一个FrameLayout其中包含多层View,UI图层,控制拖动的图层,负责文件夹显示的图层;UI图层按照正常的控件顺序进行处理,pager,indicator,shortcut;

FrameLayout会检查点击消息,用来响应退出编辑操作 -》

初始化pager -》初始化一个ArrayList<View> views用来存储pager中的页面 -》初始化specificView,systemView -》将相关回调函数都注册到Activity -》初始化DCV,放置一个layout进去 -》初始化APM-》从db获得总数,初始化空的APV,放进管理APV的list -》对比db和系统数据,做修复db动作-》从db获取数据,更新每页APV重新加载显示 

-》getItemView来生成、配置单个图标的显示,抖动效果就在这里处理的;通过offset来直接从APM中应用数据列表来获取数据;图标相关操作的listener都在这里;(由offset来获取数据,有没有更好的设计???)views加入SV,SYMV,多个APV-》

初始化pagerAdapter,给pager设置pagerAdapter-》

初始化页标-》

初始化shortcut-》

初始化receiver,设备管理等

2. 点击图标

APV->updateDisplay->getItemView有注册OnClickListener,应用的话就启动;文件夹的话,触发回调onFolderClick,FM->openFolder,构造多页的AFV,也是通过一个pager来显示的;长按,修改编辑状态,通知APV和shortcut更新视图状态,开始抖动;删除按钮,对于应用只是启动系统画面,如果真的删除的话会收到intent,这时依次去FM,shortcut,PM看它们谁去处理,处理的一般逻辑是先去找到数据,从列表中删除数据,更新数据库,更新视图;(对于文件夹要考虑页数是否增减,文件夹显示图标,删除多余文件夹)

删除应用操作-》发送intent调出系统界面-》Activity注册的receiver收到应用卸载-》依次FM,shortcut,PM检查处理-》FM检查找到应用,FM删除数据然后db保存,还有其他应用在文件夹中,更新FV,pager;如果没有其他应用了,删除当前文件夹,通过回调让Activity处理,让PM或者shortcut来删除;PM删除,先删除数据,更新数据影响的页面显示,重新检查页面数增减更新页面列表,PM页面数目更新了要通知Activity修改indicator,通知adapter更新;

(这边的回调一般都是先回调到Activity的函数,再调用相关模块的函数,逻辑关系像是 ^ 形状)

3. 移动图标

拖动打包:

APV->updateDisplay->getItemView有注册OnTouchListener-》判断目前状态(可编辑,可拖动),让原图标消失-》获取截图,传递给DCV -》DCV开始接收消息,ACTION_DOWN-》设置一些状态,起始位置-》用截图初始化DCV中的ImageView,以及拖动图标的具体位置,初始化应用池,托盘每个元素的具体位置(拖动起始状态分3种,从应用池,快捷栏,文件夹里面,为拖动准备不同的坐标),把截图视图移动到开始位置-》为截图做透明的动画效果-》DCV继续接收消息,ACTION_MOVE-》设置开始拖动,从pager拦截滑动事件-》DCV开始收到后续事件,先检测是否悬停状态,移动视图,判断视图所在位置-》触发应用池,快捷栏或者文件中相关效果-》

以应用池打包效果说明,被拖动的图标如果不是悬停,不会影响其他图标的状态;如果是悬停,如果移动到的位置可以打包-》回调通知应用池,让对应的APV修改打包位置图标显示待打包的状态,设置打包状态; -》如果此时DCV收到ACTION_UP,开始结束动画(受影响图标连续重排动画)-》获得动画开始位置,启动一个透明减弱动画-》动画结束后,开始拖动结束的数据操作,隐藏被拖动的视图,在修改列表中数据同时更新显示,然后就开始重排动画;

重排动画以moveForFillBlank(int from_r, int from_c, int to_r, int to_c, final boolean isLastPage)为例,for循环控制每个移动的元素,最后一个动画结束后重新刷新排列一次全屏图标;

拖动换位置:

以应用池跨屏幕移动效果说明,被拖动的图标如果不是悬停,不会影响其他图标的状态;在设置一些状态和位置的时候,有先定一个绝对位置数据,这样把屏幕分割成多个矩形,如果悬停位置在屏幕两侧,那就认为是翻页;如果是悬停,如果移动到的位置不是可打包位置且是屏幕两侧,让pager进行翻页;leapMove处理跨页移动,moveCurrentPage处理本页移动;leapMove根据起始页面来判读,图标该向前滚动补齐,还是向后滚动补齐;以向前补齐为例,先移动列表中的数据,刷新受影响且不显示动画的其他页面,开始补齐动画;动画结束后重新刷新图标,重新设置拖动点,这样如果你不放手继续拖动,那么认为你又从刚才的位置开始一次新拖动了;

4. Multi-touch

APV的XML结构:

1. icon视图(显示)

2. 多点触摸视图(显示,但是没有东西)

3. ImageView视图(GONE,用来显示缩放模式)

4. FrameLayout视图(GONE,包含一个ImageView,用来在缩略图最小化时显示,缩略图模式)

3、4显示的东西不是一样的,区别有一个透明的背景框;

在APV的XML结构中,定义一个重叠的视图用来接收多点触摸事件;每一个APV给构造一个MTM来控制多点触摸的事件,MTM把相关判断逻辑和拦截操作都放在自己内部来实现,同时来控制缩放效果,APV的XML结构中视图显示隐藏;MTM会在APV每次更新后,就对APV视图进行一次截图,这个截图就是MTM主要的操作的数据;

由于APV的XML结构中定义的接收多点触摸的视图是覆盖在现实icon的视图之上的,所以多点触摸视图不处理的相关event都通过target.dispatchTouchEvent来传递到icon的视图那里;

onTouch里面:

达到多点触摸条件时,统计初始点,设置缩放初始计算参数;将截图显示在3里面,然后显示3,隐藏icon视图,同时也给4设置好截图;设置进入缩放模式;

ACTION_DOWN:开始统计速度

ACTION_MOVE:统计点位置,计算缩放参数,将3视图进行缩放;如果达到缩略图模式的要求,设置缩略图模式(UP时进入缩略图模式),否则继续;

ACTION_UP:如果被设置缩略图模式,那开始动画;否则,视为用户放弃操作,结束多点触摸模式,恢复icon视图;

被设置为缩略图模式,开始动画,动画结束后,隐藏视图3,显示视图4,设置相关状态;在这之后的用户操作,会由视图4来进行响应,视图4有自己的OnTouchListener来处理消息;

这里有一个技巧,APV的XML结构,后声明的视图3、视图4都会在icon视图、多点触摸视图2的前面;

进入多点触摸状态之前,视图3、视图4处于GONE状态,所以触摸消息会被多点触摸视图2先得到,视图2判断非多点触摸的情况下把操作dispatchTouchEvent到icon视图;进入缩略图模式后,视图4处于显示模式,所以触摸消息先会被视图4得到,这样就不需要在视图2里面为缩略图模式进行任何的处理;

5. Touch冲突

结构大致如下:

Activity (drag_layout > folder_layout >pager/shortcut) > APV (缩略图视图 > 缩放截图 > 多点触摸视图 > icon视图)

pager可以左右滑动,所以在pager之下层次touch event避免被pager处理;drag_layout并不拦截touch event,而只是用来显示,拖动图标时pager收到touch event而交给DCV来处理,DCV将图标放到drag_layout合适的位置;多点触摸时,也是pager先收到touch event,pager在dispatchTouchEvent中就先进行一定处理;

举例,在系统界面要想在多点情况下实现左右滑动pager,原本event事件会传递到子view里面:

pager里面dispatchTouchEvent里面检查触摸点数目,如果达到要求且当前页面是系统界面,设置标志位;

在onInterceptTouchEvent里面根据标志位拦截event,onTouchEvent中根据标志位返回true,需要注意的是onTouchEvent中要调用下super.onTouchEvent()这样pager会根据event进行翻页;

举例,拖动模式:

APV中的icon有设置长按响应-》检查当前状态是否允许进入抖动 -》给icon截图,隐藏icon,把数据传给DCV-》DCV初始化坐标,显示ImageView,设置可编辑标志位-》开始动画把ImageView半透明

APV中的icon有设置touchListener-》检查可编辑标志位-》DCV的startOnTouch开始接收消息-》ACTION_DOWN开始动画去掉半透明 -》ACTION_MOVE设置开始拖动标志位,通知pager开始拦截event-》pager将拦截到的event发送到DCV的 moveOnTouch处理 -》ACTION_UP进行逻辑处理,开始动画,动画结束后放弃拦截,重置相关标志位;

举例,多点触摸进入缩放模式:

pager的dispatchTouchEvent里面统计触摸点数目,达到要求后设置多点触摸标志位,在onInterceptTouchEvent里面根据多点触摸标志位返回false,让pager中的APV来处理多点事件,这样避免让pager左右滑动;

7. Folder操作

8. 更好

转载地址:http://zalli.baihongyu.com/

你可能感兴趣的文章
linux -8 Linux磁盘与文件系统的管理
查看>>
linux 9 -文件系统的压缩与打包 -dump
查看>>
PHP在变量前面加&是什么意思?
查看>>
ebay api - GetUserDisputes 函数
查看>>
ebay api GetMyMessages 函数
查看>>
php加速器 - zendopcache
查看>>
手动12 - 安装php加速器 Zend OPcache
查看>>
set theme -yii2
查看>>
yii2 - 模块(modules)的view 映射到theme里面
查看>>
yii2 - controller
查看>>
yii2 - 增加actions
查看>>
网站加载代码
查看>>
php图像处理函数大全(缩放、剪裁、缩放、翻转、旋转、透明、锐化的实例总结)
查看>>
magento url中 uenc 一坨编码 base64
查看>>
强大的jQuery焦点图无缝滚动走马灯特效插件cxScroll
查看>>
Yii2.0 数据库查询
查看>>
yii2 db 操作
查看>>
mongodb group 有条件的过滤组合个数。
查看>>
yii2 用命令行操作web下的controller
查看>>
yii2 console的使用
查看>>