1.前言
在10.0的系统rom定制化开发中,在对于launcher3的一些开发定制中,在对hotseat的一些开发中,需要实现动态hotseat居中
的功能,就是在拖拽图标进入和拖出hotseat,都可以保持hotseat居中的功能,接下来分析下相关功能实现
具体如图:
hotseat
2.Launcher3拖拽图标进入hotseat自适应布局功能实现四的核心类
packages\apps\Launcher3\src\com\android\launcher3\CellLayout.java
packages/apps/Launcher3/src/com/android/launcher3/BaseActivity.java
3.Launcher3拖拽图标进入hotseat自适应布局功能实现四的核心功能分析和实现
Launcher顾名思义,就是桌面的意思,也是android系统启动后第一个启动的应用程序,
:Launcher3负责管理和展示用户手机桌面上的各个应用程序图标。它通过GridView或者LinearLayout等布局管理器将
图标进行排列,并支持滑动、放大缩小等手势操作
Hotseat也是属于在导航栏底部的BubbleTextView的布局,只是不显示app图标
CellLayout:主屏幕中的每一页,其父布局就是Workspace,左右滑动屏幕,就是每一个CellLayout的变化过程,这个类中有很多处理拖拽相关方法
3.1 新增一部分关于处理拖拽图标重叠的工具类
在实现Launcher3拖拽图标进入hotseat自适应布局功能实现四中,通过分析得知,在进行
一些拖拽的过程中,在只有两个三个hotseat的时候,这时候会出现hotseat重叠的问题,这时候就需要先清除掉hotseat的所有view,然后添加hotseat,
package com.android.launcher3.util;
import android.content.Context;
import android.content.Intent;
import android.content.pm.ShortcutInfo;
import android.database.sqlite.SQLiteDatabase;
import android.os.UserHandle;
import com.android.launcher3.BaseDraggingActivity;
import com.android.launcher3.Launcher;
import com.android.launcher3.LauncherState;
import com.android.launcher3.model.data.AppInfo;
import java.io.FileDescriptor;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.List;
public class LauncherAppMonitorCallback {
//Launcher activity Callbacks
public void onLauncherPreCreate(Launcher launcher) { }
public void onLauncherCreated() { }
public void onLauncherPreResume() { }
public void onLauncherResumed() { }
public void onLauncherStart() { }
public void onLauncherStop() { }
public void onLauncherPrePaused() { }
public void onLauncherPaused() { }
public void onLauncherDestroy() { }
public void onLauncherRequestPermissionsResult(int requestCode, String[] permissions,
int[] grantResults) { }
public void onSettingsActivityRequestPermissionsResult(int requestCode, String[] permissions,
int[] grantResults) { }
public void onLauncherFocusChanged(boolean hasFocus) { }
public void onQuickstepLauncherStart() { }
public void onRecentsActivityCreate(BaseDraggingActivity activity) { }
public void onRecentsActivityStart() { }
public void onHomeIntent() { }
public void onBindingWorkspaceFinish () { }
public void onBindingAllAppFinish (AppInfo[] apps) { }
//Launcher app Callbacks
public void onAppCreated(Context context) { }
public void onReceive(Intent intent) { }
public void onUIConfigChanged() { }
public void onThemeChanged() { }
public void onGridChanged() { }
public void onDbUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { }
public void onStateSetStart(LauncherState toState) { }
public void onStateSetEnd(LauncherState toState) { }
public void onTaskStackUpdated(boolean hasTask) { }
public void onOrientationStateChanged() { }
public void onAppSharedPreferenceChanged(String key) { }
public void onPackageRemoved(String packageName, UserHandle user) { }
public void onPackageAdded(String packageName, UserHandle user) { }
public void onPackageChanged(String packageName, UserHandle user) { }
public void onPackagesAvailable(String[] packageNames, UserHandle user, boolean replacing) { }
public void onPackagesUnavailable(String[] packageNames, UserHandle user, boolean replacing) { }
public void onPackagesSuspended(String[] packageNames, UserHandle user) { }
public void onPackagesUnsuspended(String[] packageNames, UserHandle user) { }
public void onPackagesUpdated(String[] packageNames, UserHandle user, int op) { }
public void onShortcutsChanged(String packageName, List<ShortcutInfo> shortcuts, UserHandle user) { }
public void onAllAppsListUpdated(List<AppInfo> apps) { }
public void onLauncherLocaleChanged() { }
public void onLauncherOrientationChanged () { }
public void onLauncherScreensizeChanged() { }
public void onl oadAllAppsEnd(ArrayList<AppInfo> apps) { }
public void onHomeStyleChanged(String style) { }
//Launcher database callbacks
public void dump(String prefix, FileDescriptor fd, PrintWriter w, boolean dumpAll) { }
}
在实现Launcher3拖拽图标进入hotseat自适应布局功能实现四中,通过分析得知,
新增的uitl下的LauncherAppMonitorCallback.java中的相关源码中,这里主要就是处理
在Launcher3中关于绑定hotseat的一些事件回调,在这里主要就是Launcher3中关于hotseat的
一些回调事件,作为辅助类的存在
3.2 BaseActivity.java中关于初始化LauncherAppMonitor的一些相关操作
在实现Launcher3拖拽图标进入hotseat自适应布局功能实现四中,通过分析得知,
BaseActivity.java中的相关源码分析得知,在这里只是作为Activity的基类来实现某些功能的
所以这里来具体初始化相关功能实现
//add core start
import com.android.launcher3.util.LauncherAppMonitor;
//add core end
public abstract class BaseActivity extends Activity implements ActivityContext {
//add core start
protected LauncherAppMonitor mAppMonitor;
public LauncherAppMonitor getAppMonitor() {
if (mAppMonitor == null) {
mAppMonitor = LauncherAppMonitor.getInstance(this);
}
return mAppMonitor;
}
//add core end
@Override
public void onWindowFocusChanged(boolean hasFocus) {
super.onWindowFocusChanged(hasFocus);
//add core start
getAppMonitor().onLauncherFocusChanged(hasFocus);
//add core end
if (hasFocus) {
addActivityFlags(ACTIVITY_STATE_WINDOW_FOCUSED);
} else {
removeActivityFlags(ACTIVITY_STATE_WINDOW_FOCUSED);
}
}
在实现Launcher3拖拽图标进入hotseat自适应布局功能实现四中,通过分析得知,
BaseActivity.java中的相关源码分析得知,在这里初始化了 关于LauncherAppMonitor的
相关功能,主要是在onWindowFocusChanged(boolean hasFocus) 中添加了
getAppMonitor().onLauncherFocusChanged(hasFocus);来表示窗口焦点发生变化的
功能
3.3 CellLayout.java中关于hotseat布局的一些修改功能
在实现Launcher3拖拽图标进入hotseat自适应布局功能实现四中,通过分析得知,
CellLayout.java中主屏幕中的每一页关于每个app图标hotseat widget的布局绑定
布局,接下来看下具体的功能实现
*
* @param result Array of 2 ints to hold the x and y coordinate of the point
*/
- void cellToCenterPoint(int cellX, int cellY, int[] result) {
+ public void cellToCenterPoint(int cellX, int cellY, int[] result) {
regionToCenterPoint(cellX, cellY, 1, 1, result);
}
public static final class CellInfo extends CellAndSpan {
public final View cell;
final int screenId;
- final int container;
+ public final int container;
在实现Launcher3拖拽图标进入hotseat自适应布局功能实现四中,通过分析得知,
CellLayout.java中的主要功能就是实现关于void cellToCenterPoint(int cellX, int cellY, int[] result)
公有化的调用这个设置CellLayout的中心点,和container参数的调用功能