实现的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左边距
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.桌面图标的四种类型
最后
小编这些年深知大多数初中级Android工程师,想要提升自己,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。
因此我收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人
都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
资料⬅专栏获取
助到想自学提升又不知道该从何学起的朋友。**
[外链图片转存中…(img-zOA1WcLt-1718819160002)]
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人
都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
资料⬅专栏获取