




已阅读5页,还剩6页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
一、主要文件和类1.Launcher.java:launcher中主要的activity。2.DragLayer.java:launcher layout的rootview。DragLayer实际上也是一个抽象的界面,用来处理拖动和对事件进行初步处理然后按情况分发下去,角色是一个controller。它首先用onInterceptTouchEvent(MotionEvent)来拦截所有的touch事件,如果是长按item拖动的话不把事件传下去,直接交由onTouchEvent()处理,这样就可以实现item的移动了,如果不是拖动item的话就把事件传到目标view,交有目标view的事件处理函数做相应处理。如过有要对事件的特殊需求的话可以修改onInterceptTouchEvent(MotionEvent)来实现所需要的功能。3. DragController.java:为Drag定义的一个接口。包含一个接口,两个方法和两个静态常量。接口为DragListener(包含onDragStart(),onDragEnd()两个函数),onDragStart()是在刚开始拖动的时候被调用,onDragEnd()是在拖动完成时被调用。在launcher中典型的应用是DeleteZone,在长按拖动item时调用onDragStart()显示,在拖动结束的时候onDragEnd()隐藏。两个函数包括startDrag()和setDragItemInfo().startDrag()用于在拖动是传递要拖动的item的信息以及拖动的方式,setDragItemInfo()用于传递item的参数信息(包括位置以及大小)。两个常量为DRAG_ACTION_MOVE,DRAG_ACTION_COPY来标识拖动的方式,DRAG_ACTION_MOVE为移动,表示在拖动的时候需要删除原来的item,DRAG_ACTION_COPY为复制型的拖动,表示保留被拖动的item。4.LauncherModel.java:辅助的文件。里面有许多封装的对数据库的操作。包含几个线程,其中最主要的是ApplicationsLoader和DesktopItemsLoader。ApplicationsLoader在加载所有应用程序时使用,DesktopItemsLoader在加载workspace的时候使用。其他的函数就是对数据库的封装,比如在删除,替换,添加程序的时候做更新数据库和UI的工作。5.Workspace.java:抽象的桌面。由N个celllaout组成,从cellLayout更高一级的层面上对事件的处理。6.LauncherProvider.java:launcher的数据库,里面存储了桌面的item的信息。在创建数据库的时候会loadFavorites(db)方法,loadFavorites()会解析xml目录下的default_workspace.xml文件,把其中的内容读出来写到数据库中,这样就做到了桌面的预制。7.CellLayout.java:组成workspace的view,继承自viewgroup,既是一个dragSource,又是一个dropTarget,可以将它里面的item拖出去,也可以容纳拖动过来的item。在workspace_screen里面定了一些它的view参数。8.ItemInfo.java:对item的抽象,所有类型item的父类,item包含的属性有id(标识item的id),cellX(在横向位置上的位置,从0开始),cellY(在纵向位置上的位置,从0开始) ,spanX(在横向位置上所占的单位格),spanY(在纵向位置上所占的单位格),screen(在workspace的第几屏,从0开始),itemType(item的类型,有widget,search,application等),container(item所在的)。9.UserFolder.java: 用户创建的文件夹。可以将item拖进文件夹,单击时打开文件夹,长按文件夹上面标题处可以重命名文件夹。10.LiveFolder.java:系统自带的文件夹。从系统中创建出的如联系人的文件夹等。11.DeleteZone:删除框。在平时是出于隐藏状态,在将item长按拖动的时候会显示出来,如果将item拖动到删除框位置时会删除item。DeleteZone实现了DropTarget和DragListener两个接口。12.LauncherSettings.java:字符串的定义。数据库项的字符串定义,另外在这里定义了container的类型,还有itemType的定义,除此还有一些特殊的widget(如search,clock的定义等)的类型定义。二、主要模块1.界面模型:Launcher的界面的rootview是DragLayer,它是一个FrameLayout,在它上面workspace(应该说是celllayout)占了绝大部分的空间,celllayout的参数文件是workspace_screen.xml。workspace既是一个DropTarget又是一个DragSource,可以从AllAppGridView中拖出应用程序放在它上面,也可以把它里面的item拖走删除或者拖到bottomabr里面去。2.Drop& Drag模型: DragSource:可以拖动的对象来源的容器,在launcher中主要有AllAppGridView,workspace等。 void onDropCompleted(View target, boolean success,int x,int y);DropTarget:可以放置被拖动的对象的容器。在launcher中有folder,workspace,bottombar等,一个View既可以是Dragsource也可以是DropTarget。主要包含以下几个接口:boolean acceptDrop(DragSource source, int x, int y, int xOffset, int yOffset, Object dragInfo);acceptDrop函数用来判断dropTarget是否可以接受item放置在自己里面。 void onDragEnter(DragSource source, int x, int y, int xOffset, int yOffset, Object dragInfo); onDragEnter是item被拖动进入到一个dropTarget的时候的回调。 void onDragOver(DragSource source, int x, int y, int xOffset, int yOffset, Object dragInfo); onDragOver是item在上一次位置和这一次位置所处的dropTarget相同的时候的回调。 void onDragExit(DragSource source, int x, int y, int xOffset, int yOffset, Object dragInfo); onDragExit是item被拖出dropTarget时的回调。boolean onDrop(DragSource source, int x, int y, int xOffset, int yOffset, Object dragInfo); onDrop是item被放置到dropTarget时的回调。 函数的调用模式为:DropTarget dropTarget = findDropTarget(int) x, (int) y, coordinates);if (dropTarget != null) /* * 当这一次的 target 跟上一次相同时,根据坐标来移动item */ if (mLastDropTarget = dropTarget) dropTarget.onDragOver(mDragSource, coordinates0, coordinates1, (int) mTouchOffsetX, (int) mTouchOffsetY, mDragInfo); else /* * 当上一次的位置跟这一次不同而且上一次的位置不为空,说明item移 *动出了,将上次的 View 根据上次的坐标重新排列,并根据当前坐标重排*当前的*/ if (mLastDropTarget != null) mLastDropTarget.onDragExit(mDragSource, coordinates0, coordinates1, (int) mTouchOffsetX, (int) mTouchOffsetY, mDragInfo); dropTarget.onDragEnter(mDragSource, coordinates0, coordinates1, (int) mTouchOffsetX, (int) mTouchOffsetY, mDragInfo); else /如果这一次为 null ,上一次不为 null ,那么把上一次坐标位置的 cell 去掉 if (mLastDropTarget != null) mLastDropTarget.onDragExit(mDragSource, coordinates0, coordinates1, (int) mTouchOffsetX, (int) mTouchOffsetY, mDragInfo); /记录上次的droptarget mLastDropTarget = dropTarget;3.Touch event总结: 由于launcher的事件比较多比较复杂,所以在事件处理的时候一般采用rootview先用onInterceptTouchEvent(MotionEvent)拦截所有的touch事件,经过判断后分发给childview。判断的规则如下: a.down事件首先会传递到onInterceptTouchEvent()方法 b.如果该ViewGroup的onInterceptTouchEvent()在接收到down事件处理完成之后return false,那么后续的move, up等事件将继续会先传递给该ViewGroup,之后才和down事件一样传递给最终的目标view的onTouchEvent()处理。 c.如果该ViewGroup的onInterceptTouchEvent()在接收到down事件处理完成之后return true,那么后续的move, up等事件将不再传递给onInterceptTouchEvent(),而是和down事件一样传递给该ViewGroup的onTouchEvent()处理,注意,目标view将接收不到任何事件。 d.如果最终需要处理事件的view的onTouchEvent()返回了false,那么该事件将被传递至其上一层次的view的onTouchEvent()处理。 e.如果最终需要处理事件的view 的onTouchEvent()返回了true,那么后续事件将可以继续传递给该view的onTouchEvent()处理。三、几种问题的解决方式1.将所有的应用都排列在桌面上 将所有的应用都排列在桌面是通过首先创建一个三维的boolean型全局数组来记录item的排列情况,第一维是屏数,第二维是纵向上的排列情况,第三维是横向的排列情况,如果那个位置被item所占用就标记为1,否则标记为0.在启动时把全局数组初始化为0,然后在添加的时候把相应的位置置1.凡是涉及到workspace上item的变化,比如移动、添加、删除操作时都需要维护数组,保持数组的正确性,因为在安装新程序时依据数组的状态去判断把item加到什么位置。2.动态增加屏幕动态增加屏幕是通过worksapce .addchild(view)的方式实现。基本思路是:首先预先规定所允许的最大的屏幕数,然后在需要增加屏幕而且当前屏幕数没有超过最大屏幕数的时候通过(CellLayout)mInflater.inflate(R.layout.workspace_screen,null)创建一个celllayout实例出来,然后通过addchild把它加入进去。在屏幕上的item被删除时通过从最后一屏起判断屏幕上是否有item,如果有的话保留,没有的话则删除最后一屏,以此类推。3.预制桌面 a.添加普通的应用程序快捷方式: 在./res/xml下的default_workspace.xml文件中加入默认要放置的普通的应用程序。加入的格式为: /放置y方向的位置(在行中的位置)packageName和className可以通过点击程序,然后在打印出的log中找到comp=.,例如如下信息:comp=com.estrongs.android.taskmanager/com.estrongs.android.taskmanager.TaskManager。其中com.estrongs.android.taskmanager为packageName, com.estrongs.android.taskmanager.TaskManager为className。workspace的布局如下:(0,0)(1,0)(2,0)(3,0)(4,0)(0,1)(1,1)(2,1)(3,1)(4,1)(0,2)(1,2)(2,2)(3,2)(4,2) b.添加widget: 在./package/apps/VLauncher/res/xml下的default_workspace.xml文件中加入默认要放置的普通的应用程序。加入的格式为: /在y方向上所占格数例如,要在第3屏的第一行第二列放置开始放置一个x方向上占两个单位格,y方向上占两个单位格的时钟,可以加入以下代码: 4.改变主界面的排列方式 要修改桌面的排列方式,如下,先根据横竖屏设置修改workspace_screen.xml里shortAxisCells和longAxisCells的参数,然后在Launcher.java中修改NUMBER_CELLS_X和NUMBER_CELLS_Y的值,在2.3版本中刚开始往数据库中添加item的时候会去判断,如果不修改NUMBER_CELLS_X和NUMBER_CELLS_Y的话会导致一部分的item显示不出来,导致预制apk的失败。5.增加worksapce上的屏数 要增加屏数,首先在根据横竖屏在launcher.xml中的com.android.launcher.Workspace 中删除或增加 ,然后在Launcher.java中修改SCREEN_COUNT的值即可。四、x
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 手扶电梯安全员及答案
- 建筑拆除阶段性评估与验收方案
- 发展社区嵌入式托育和家庭托育点实施方案
- 质证咨询陈述方案论证
- 水泥稳定层施工方案范本
- 数字艺术作品版权保护与版权保护市场策略研究报告
- 2025年闸门运行工试题及答案
- 初级电工证考试题库及答案
- 2025年地热能与天然气联合供热的区域经济影响分析报告
- 建筑公司油画活动方案设计
- 2025年江西省高考生物试卷真题(含标准答案及解析)
- 2025年辅警笔试题库行测及答案指导
- 运维7×24小时服务保障方案
- 单招临床医学试题及答案2025年版
- 2025年建筑行业员工劳动合同
- 《医疗机构医疗质量安全专项整治行动方案》解读课件
- 继电器知识培训课件
- 2025年辽宁省中考语文真题卷含答案解析
- 职工干部禁毒知识培训课件
- 2026届新高考地理热点冲刺复习全球气候变化及影响
- 供销社招聘考试题及答案
评论
0/150
提交评论