写点什么

Android Launcher——ui 框架

  • 2021 年 11 月 06 日
  • 本文字数:2118 字

    阅读完需:约 7 分钟

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 中定义


/**


* @Description:用户点击前一个桌面按钮


* @param v


* @Others:


*/


@SuppressWarnings({"UnusedDeclaration"})


public void previousScreen(View v) {


if (!isAllAppsVisible()) {


mWorkspace.scrollLeft();


}


}


--3.在 ClippedImageView 初始化(Launcher.setupViews)中添加了长按事件 OnLongClickListener 有当长按 ClippedImageView,会执行


launcher.onlongclick 方法,方法执行显示 5 个桌面的预览微缩图显示,具体实现不做深入说明,后面将作深入研究。


4.RelativeLayout--android:id="@+id/all_apps_button_cluster",如前面截图右边灰色竖状条,它是一个相对布局对象,上面承载了三个 view


中间是一个 HandleView,是一个进入 allappview 的按钮,HandleView 的上下都是一个进入 google 搜索的 imageview


--HandleView


--1.点击事件 传递给 Launcher.onClick 进行处理 显示应用菜单 view


--2.长按事件 传递给 Launcher.onLongClick 进行处理,方法执行显示 5 个桌面的预览微缩图显示


--google 搜索的 imageview


--onClick 响应:android:onClick="launchHotSeat"


5.AllApps2D -- 菜单 view,在 launcher.xml 中引用的是:


<include


layout="@layout/all_apps" />


all_apps.xml 定义如下:


<merge xmlns:android="http://schemas.android.com/apk/res/android">


<include layout="@layout/all_apps_2d" />


</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:


<com.android.launcher2.Ce


《Android学习笔记总结+最新移动架构视频+大厂安卓面试真题+项目实战源码讲义》
浏览器打开:qq.cn.hn/FTe 免费领取
复制代码


llLayout


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 上边距

评论

发布
暂无评论
Android Launcher——ui框架