Android Launcher UI框架详解

1.DragLayer--DragLayer继承FrameLayout,并在此基础上组合了DragController实现拖放功能,DragLayer主要监听下面两个用户事件
  onInterceptTouchEvent
  onTouchEvent
  交给DragController进行处理,DragController根据是否在拖放中等信息控制控件拖放过程处理.
  DragLayer 是Launcher这个activity的顶层view,Launcher2这个应用只有一个activity那就是Laucher.java
  2.DeleteZone--打开launcher.xml,DeleteZone默认是不显示的android:visibility="invisible"
  但是我们每次开始拖放图标的时候DeleteZone就显示了,它是怎么实现的呢?DeleteZone实现了DragController.DragListener接口,DragListener提供两个接口方法,
  onDragStart:隐藏把手,显示DeleteZone
  onDragEnd:显示把手,隐藏DeleteZone
  分别在开始DragController开始拖放和结束拖放的时候被调用.
  另外DeleteZone实现了DropTarget接口,一旦鼠标把图标拖放到DeleteZone,就会调用DeleteZone
  实现的onDrop方法对应用图标进行删除处理.
  3.ClippedImageView--屏幕左右移动按钮,正常图标很小,你只能看到小点,我设置view背景不透明为绿色如前面我的截图
  ClippedImageView要注意三点,
  --1.桌面左右移动时Drawable的变换,变换图标列表可查看home_arrows_right.xml
  ,ClippedImageView通过把drawable传递给worksapce,当桌面切换时通过调用Drawable.setLevel函数实现不同图标显示.
  --2.点击ClippedImageView实现左右桌面切换,查看ClippedImageView的布局文件
  android:onClick="previousScreen",该属性定义了一个ClippedImageView onClick事件响应函数,函数在布局文件对应的Activity中定义
  也就是在Launcher.java中定义

java代码:

  • /**
  • * @Description:用户点击前一个桌面按钮
  • */
  • @SuppressWarnings({"UnusedDeclaration"})
  • public void previousScreen(View v) {
  • if (!isAllAppsVisible()) {
  • mWorkspace.scrollLeft();
  • }
  • }


复制代码


       3在ClippedImageView初始化(LaunchersetupViews)中添加了长按事件OnLongClickListener有当长按ClippedImageView,会执行
  launcheronlongclick方法,方法执行显示5个桌面的预览微缩图显示,具体实现不做深入说明,后面将作深入研究
  4RelativeLayoutandroid:id="@+id/all_apps_button_cluster",如前面截图右边灰色竖状条,它是一个相对布局对象,上面承载了三个view
  中间是一个HandleView,是一个进入allappview的按钮,HandleView的上下都是一个进入google搜索的imageview
  HandleView
  1点击事件 传递给LauncheronClick进行处理 显示应用菜单view
  2长按事件 传递给LauncheronLongClick进行处理,方法执行显示5个桌面的预览微缩图显示
  google搜索的imageview
  onClick响应:android:onClick="launchHotSeat"
  5AllApps2D  菜单view,在launcherxml中引用的是:

java代码:

  • <include layout="@layout/all_apps" />
  • all_apps.xml定义如下:
  • <merge xmlns:android="http://schemas.android.com/apk/res/android">
  • <include layout="@layout/all_apps_2d" />
  • <!--include layout="@layout/all_apps_3d" /-->
  • </merge>


复制代码


       中间增加了一个层次,如果有需要可以定义自己的apps_3d布局

  AllApps2D包括两个view

  1.GridView android:id="@+id/all_apps_2d_grid" 应用菜单grid view 它是一个grid view 用来放应用图标
  GridView对应的Adapter实现类是AppsAdapter,对应的Adapter布局文件是:application_boxed.xml
  2.view android:id="@+id/all_apps_2d_home" 应用菜单view右边的home按钮 ,点击隐藏 AllApps2D
  6.Workspace用户桌面包括5个workspace_screen,默认显示的是:launcher:defaultScreen="0"
  workspace继承了viewgroup,5个workspace_screen作为它的child,值得注意它只接收CellLayout类型的child,workspace重写了addview函数,
  添加非CellLayout的child将抛异常
  Workspace长按事件仍由launcher.onLongClick来监听
  Workspace实现了DropTarget, DragSource两个接口,意味着Workspace既是拖放源,又是拖放目的地
  Workspace实现DragScroller接口,DragScroller接口提供两个方法
  void scrollLeft();
  void scrollRight();
  在拖放过程被DragController调用实现桌面的左右滚动
  CellLayout Workspace下的一个桌面布局,CellLayout也是ViewGroup的子类,上面我的桌面截图红色区域就是CellLayout
  Workspace下有5个CellLayout顺序排列,Workspace下布局文件:android:scrollbars="horizontal"决定了5个CellLayout排列是横向还是纵向的
  CellLayout被划分成不同的cell空间,并使用boolean[][] mOccupied;来标识每个cell是否被占用,先看CellLayout的布局文件workspace_screen.xml:

java代码:

  • <com.android.launcher2.CellLayout
  • xmlns:android="http://schemas.android.com/apk/res/android"
  • xmlns:launcher="http://schemas.android.com/apk/res/com.android.launcher"
  • android:layout_width="match_parent"
  • android:layout_height="match_parent"
  • android:hapticFeedbackEnabled="true"
  • launcher:cellWidth="115dip"//每一个cell的宽度
  • launcher:cellHeight="100dip"//每个cell的高度
  • launcher:longAxisStartPadding="0dip"//cell距离父view CellLayout左边距
  • launcher:longAxisEndPadding="0dip"//cell距离父view CellLayout右边距
  • launcher:shortAxisStartPadding="0dip"//cell距离父view CellLayout上边距
  • launcher:shortAxisEndPadding="80dip"//cell距离父view CellLayout下边距
  • launcher:shortAxisCells="3"//对横屏来说表示CellLayout cells行数
  • launcher:longAxisCells="5"//对横屏来说表示CellLayout cells列数
  • android:background="#FF0000">
  • </com.android.launcher2.CellLayout>


复制代码


       当纵向的控件不够cells排列时,cell将产生重叠,横向不产生重叠,横向每个cell间隔至少为0
  CellLayout覆盖重新实现了onMeasure方法,和onlayout方法,它限定了child view 使用的布局参数类型为CellLayout.LayoutParams因此企图通过修改
  workspace_screen.xml来改变它的桌面布局是不会得以成功的,你必须修改CellLayout类
  CellLayout.LayoutParams说明,CellLayout.LayoutParams下有几个成员需要说明一下
  cellX:该child view占用的第几列的cell(若横向占用多个cell,表示最左边的cellx)
  cellY: 该child view占用的第几行的cell(若纵向占用多个cell,表示最上边的celly)
  cellHSpan:横向跨越的列数
  cellVSpan: 纵向跨越行数
  isDragging:该child是否正在被拖动
  regenerateId:是否重新生成view id
  7.桌面图标的四种类型
  ItemInfo所有类型的父类
  ApplicationInfo 应用图标项 应用菜单view中所有应用图标的数据表示
  FolderInfo 桌面文件夹
  UserFolderInfo 对应实现布局文件R.layout.folder_icon
  LiveFolderInfo 对应实现布局文件R.layout.live_folder_icon
  LauncherAppWidgetInfo 桌面组件
  ShortcutInfo 应用快捷方式 对应实现布局文件R.layout.application

转载于:https://www.cnblogs.com/tangchenglin/archive/2012/04/27/2473755.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值