Android 10.0 Launcher3拖拽图标进入hotseat自适应布局功能实现一
创始人
2024-12-28 05:35:38
0

1.前言

在10.0的系统rom定制化开发中,在对于launcher3的一些开发定制中,在对hotseat的一些开发中,需要实现动态hotseat居中
的功能,就是在拖拽图标进入和拖出hotseat,都可以保持hotseat居中的功能,接下来分析下相关功能实现
具体如图:


2.Launcher3拖拽图标进入hotseat自适应布局功能实现一的核心类

packages\apps\Launcher3\src\com\android\launcher3\Hotseat.java

3.Launcher3拖拽图标进入hotseat自适应布局功能实现一的核心功能分析和实现

Launcher顾名思义,就是桌面的意思,也是android系统启动后第一个启动的应用程序,
:Launcher3负责管理和展示用户手机桌面上的各个应用程序图标。它通过GridView或者LinearLayout等布局管理器将
图标进行排列,并支持滑动、放大缩小等手势操作
Hotseat也是属于在导航栏底部的BubbleTextView的布局,只是不显示app图标

3.1 Hotseat.java相关添加背景功能分析

在实现Launcher3拖拽图标进入hotseat自适应布局功能实现一的核心功能中,通过上述的分析得知,
首选需要给Hotseat添加背景功能,然后需要根据hotseat的数量多少来设置hotseat的宽度高度等
相关参数,这样就实现了第一步的hotseat的居中显示功能,

public class Hotseat extends CellLayout implements LogContainerProvider, Insettable, Transposable {      @ViewDebug.ExportedProperty(category = "launcher")     public boolean mHasVerticalHotseat;     private final HotseatController mController;      public Hotseat(Context context) {         this(context, null);     }      public Hotseat(Context context, AttributeSet attrs) {         this(context, attrs, 0);     }      public Hotseat(Context context, AttributeSet attrs, int defStyle) {         super(context, attrs, defStyle);         mController = LauncherAppMonitor.getInstance(context).getHotseatController(); 		     }      public HotseatController getController() {         return mController;     }      /* Get the orientation specific coordinates given an invariant order in the hotseat. */     public int getCellXFromOrder(int rank) {         return mHasVerticalHotseat ? 0 : rank;     }      public int getCellYFromOrder(int rank) {         return mHasVerticalHotseat ? (getCountY() - (rank + 1)) : 0;     }      public void resetLayout(boolean hasVerticalHotseat) {         removeAllViewsInLayout();         mHasVerticalHotseat = hasVerticalHotseat;         InvariantDeviceProfile idp = mActivity.getDeviceProfile().inv;         if (hasVerticalHotseat) {             setGridSize(1, idp.numHotseatIcons);         } else {             setGridSize(idp.numHotseatIcons, 1);         }        //add core start        // 添加背景       if(idp.numHotseatIcons>0){          setBackgroundResource(R.drawable.shape_corner);       }        //add core end     }      @Override     public void fillInLogContainerData(View v, ItemInfo info, Target target, Target targetParent) {         target.gridX = info.cellX;         target.gridY = info.cellY;         targetParent.containerType = LauncherLogProto.ContainerType.HOTSEAT;     }      @Override     public void setInsets(Rect insets) {         FrameLayout.LayoutParams lp = (FrameLayout.LayoutParams) getLayoutParams();         DeviceProfile grid = mActivity.getWallpaperDeviceProfile();         insets = grid.getInsets();          if (grid.isVerticalBarLayout()) {             lp.height = ViewGroup.LayoutParams.WRAP_CONTENT;             if (grid.isSeascape()) {                 lp.gravity = Gravity.LEFT;                 lp.width = grid.hotseatBarSizePx + insets.left;             } else {                 lp.gravity = Gravity.RIGHT;                 lp.width = grid.hotseatBarSizePx + insets.right;             }         } else {               lp.gravity = Gravity.BOTTOM;               lp.width = ViewGroup.LayoutParams.MATCH_PARENT;               lp.height = grid.hotseatBarSizePx + insets.bottom;         }         Rect padding = grid.getHotseatLayoutPadding();         setPadding(padding.left, padding.top, padding.right, padding.bottom);                  setLayoutParams(lp);         InsettableFrameLayout.dispatchInsets(this, insets);     }      @Override     public boolean onTouchEvent(MotionEvent event) {         // Don't let if follow through to workspace         return true;     }      @Override     public RotationMode getRotationMode() {         return Launcher.getLauncher(getContext()).getRotationMode();     } }

在实现Launcher3拖拽图标进入hotseat自适应布局功能实现一的核心功能中,通过上述的分析得知,
在Hotseat中相关源码分析,可以发现由
resetLayout 就是负责布局的 当hotseat 增加减少时都会重新布局
所以在setBackgroundResource(R.drawable.shape_corner);添加背景就可以了

  public void resetLayout(boolean hasVerticalHotseat) {         removeAllViewsInLayout();         mHasVerticalHotseat = hasVerticalHotseat;         InvariantDeviceProfile idp = mActivity.getDeviceProfile().inv;         if (hasVerticalHotseat) {             setGridSize(1, idp.numHotseatIcons);         } else {             setGridSize(idp.numHotseatIcons, 1);         }        // 添加背景         if(idp.numHotseatIcons>0){          setBackgroundResource(R.drawable.shape_corner);       }     }  shape_corner.xml                                      public void setInsets(Rect insets) {         FrameLayout.LayoutParams lp = (FrameLayout.LayoutParams) getLayoutParams();         DeviceProfile grid = mActivity.getWallpaperDeviceProfile();         insets = grid.getInsets();         //竖屏布局         if (grid.isVerticalBarLayout()) {             lp.height = ViewGroup.LayoutParams.WRAP_CONTENT;             if (grid.isSeascape()) {                 lp.gravity = Gravity.LEFT;                 lp.width = grid.hotseatBarSizePx + insets.left;             } else {                 lp.gravity = Gravity.RIGHT;                 lp.width = grid.hotseatBarSizePx + insets.right;             }         } else {             //modify core start            // 横屏布局            // 平板开发项目 固定横屏,所以要在这里设置参数            // 设置宽高  左边底部的间距              InvariantDeviceProfile idp = mActivity.getDeviceProfile().inv;              int hotseatNums = idp.numHotseatIcons;              lp.width = hotseatNums*grid.hotseatBarSizePx+(hotseatNums+1)*dip2px(15.0f);              lp.height = grid.hotseatBarSizePx + insets.bottom;              if(getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT){                 lp.leftMargin = (int)((1080-lp.width)/2);              }else{ 	lp.leftMargin = (int)((1920-lp.width)/2);              }             lp.gravity = Gravity.BOTTOM;             //modify core end         }         Rect padding = grid.getHotseatLayoutPadding();         // 设置padding 布局            setPadding(0, padding.top, 0,0);                  setLayoutParams(lp);         InsettableFrameLayout.dispatchInsets(this, insets);     }

在实现Launcher3拖拽图标进入hotseat自适应布局功能实现一的核心功能中,通过上述的分析得知,
在Hotseat中相关源码分析,
而setInset() 负责设置绘制布局 的参数 这里设置hotseat的宽高等参数布局
其实只需要修改lp的参数就行了 然后hotseat 会根据长宽等参数 来具体布局每一个hotseat的具体坐标
根据横竖屏来确定lp.leftMargin的值,就可以保证居中显示

相关内容

热门资讯

四分钟了解!竞技联盟扑克软件透... 四分钟了解!竞技联盟扑克软件透明挂辅助作弊,wepoke有挂(有挂技巧)-哔哩哔哩;;AI辅助机器人...
第5了解!wpk外挂辅助器插件... 第5了解!wpk外挂辅助器插件,wepoker系统规律(真实有挂)-哔哩哔哩是一款可以让一直输的玩家...
bug-前端解决node-sa... 在拉取前端项目时,第一步就是npm i下载依赖 但是很多时候经常被node-sass和...
vscode+wsl2+ana... 目录下载anacondaAnaconda使用参考vscode+ubuntu+anac...
第十了解!wepoke脚本外挂... 自定义新版wepoke脚本系统规律,只需要输入自己想要的开挂功能,一键便可以生成出wepoke脚本专...
【接口自动化_12课_基于Fl... 知识非核心点,面试题较少。框架搭建的过程中的细节才是面试要点 第三方接口,...
vscode及pycharm配... 一、vscode配置方法第一步,依次点击“File”->“preference”->“...
软件测试之单元测试 🍅 视频学习:文末有免费的配套视频可观看🍅 点击文末小...
npm小记 1.清除 NPM 的配置,然后重新设置 registry 到一个可靠的源。运行以下命令...
第九个了解!WePoKe软件透... 第九个了解!WePoKe软件透明挂辅助透视挂,wpk德州辅助器(有挂秘笈)-哔哩哔哩是一款可以让一直...