Android Launcher——ui框架

本文详细解释了Launcher应用中的DragController、DeleteZone、ClippedImageView和Workspace等关键组件如何处理触摸事件,以及它们在屏幕拖放操作中的角色,包括删除图标、屏幕切换和桌面布局管理。还提到了大厂面试资源的相关内容。
摘要由CSDN通过智能技术生成

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定义如下:

中间增加了一个层次,如果有需要可以定义自己的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.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左边距

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则近万的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img

img

img

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:Android)

最后

想要了解更多关于大厂面试的同学可以点赞支持一下,除此之外,我也分享一些优质资源,包括:Android学习PDF+架构视频+源码笔记高级架构技术进阶脑图、Android开发面试专题资料,高级进阶架构资料 这几块的内容。非常适合近期有面试和想在技术道路上继续精进的朋友。

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

脑图、Android开发面试专题资料,高级进阶架构资料** 这几块的内容。非常适合近期有面试和想在技术道路上继续精进的朋友。

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值