Android 14.0 Launcher3定制化之桌面分页横线改成圆点显示功能实现
1.前言
在14.0的系统rom产品定制化开发中,在进行launcher3的定制化中,在双层改为单层的开发中,在原生的分页
是横线,而为了美观就采用了系统原来的另外一种分页方式,就是圆点比较美观,接下来就来分析下相关的实现,然后实现其功能
2.Launcher3定制化之桌面分页横线改成圆点显示功能实现的核心类
packages/apps/Launcher3/res/layout/launcher.xmlpackages/apps/Launcher3/src/com/android/launcher3/pageindicators/PageIndicatorDots.java
3.Launcher3定制化之桌面分页横线改成圆点显示功能实现的核心功能分析和实现
在Launcher3中的核心布局中,最核心的就是workspace hotseat folder等核心部件中,在
Launcher3中的核心布局的相关控件就是在launcher.xml中这个Launcher主页面中显示的,这里显示Launcher3桌面的核心控件,
DragLayer Workspace WorkspacePageIndicatorLine drop_target_bar hotseat等主要控件的布局
在这里面WorkspacePageIndicatorLine就是所谓的分页横线控件,而PageIndicatorDots.java就是
Launcher3的另外一种分页圆点显示控件,所以接下来分析下launcher.xml的相关源码
3.1 launcher.xml中相关部件源码分析
在实现Launcher3定制化之桌面分页横线改成圆点显示功能实现的核心功能中,通过上述的分析得知,
在launcher.xml中的相关源码中这里就是关于桌面布局的核心布局文件,接下来看下相关源码修改
<com.android.launcher3.LauncherRootViewxmlns:android="http://schemas.android.com/apk/res/android"xmlns:launcher="http://schemas.android.com/apk/res-auto"android:id="@+id/launcher"android:layout_width="match_parent"android:layout_height="match_parent"android:fitsSystemWindows="true"><com.android.launcher3.dragndrop.DragLayerandroid:id="@+id/drag_layer"android:layout_width="match_parent"android:layout_height="match_parent"android:clipChildren="false"android:clipToPadding="false"android:importantForAccessibility="no"><com.android.launcher3.views.AccessibilityActionsViewandroid:layout_width="match_parent"android:layout_height="match_parent"android:contentDescription="@string/home_screen"/><!-- The workspace contains 5 screens of cells --><!-- DO NOT CHANGE THE ID --><com.android.launcher3.Workspaceandroid:id="@+id/workspace"android:layout_width="match_parent"android:layout_height="match_parent"android:layout_gravity="center"android:theme="@style/HomeScreenElementTheme"launcher:pageIndicator="@+id/page_indicator" /><!-- DO NOT CHANGE THE ID --><includeandroid:id="@+id/hotseat"layout="@layout/hotseat" />- <com.sprd.ext.pageindicators.WorkspacePageIndicatorLine+ <com.android.launcher3.pageindicators.PageIndicatorDotsandroid:id="@+id/page_indicator"android:layout_width="match_parent"android:layout_height="@dimen/workspace_page_indicator_height"android:layout_gravity="bottom|center_horizontal"android:theme="@style/HomeScreenElementTheme" /><includeandroid:id="@+id/drop_target_bar"layout="@layout/drop_target_bar" /><com.android.launcher3.views.ScrimViewandroid:layout_width="match_parent"android:layout_height="match_parent"android:id="@+id/scrim_view"android:background="@android:color/transparent" /><includeandroid:id="@+id/apps_view"layout="@layout/all_apps"android:layout_width="match_parent"android:layout_height="match_parent" /><includeandroid:id="@+id/overview_panel"layout="@layout/overview_panel" /></com.android.launcher3.dragndrop.DragLayer></com.android.launcher3.LauncherRootView>
通过上述的Launcher3中的核心主屏幕部件launcher.xml中的相关源码分析得知,在这里
Launcher.xml中的布局文件中,com.android.launcher3.pageindicators.WorkspacePageIndicator
就是Launcher3主屏幕的workspaces的布局分页横线控件的显示分页的,所以需要改成
圆点分页控件就需要修改为com.android.launcher3.pageindicators.PageIndicatorDots
这样通过上述的修改,就完成了修改为Launcher3布局分页圆点显示的功能的修改,接下来
看下其他方面关于横线替换成圆点的相关修改,接下来分析下PageIndicatorDots.java
中的相关源码实现
3.2 PageIndicatorDots中关于实现圆点绘制布局的相关源码的修改
通过上述的Launcher3中的核心控件的分析 和以前在10.0到12.0的相关修改横线分页到
圆点分页都是需要实现 setInsets(Rect insets)等相关方法的,通过这些的修改来
完成对圆点分页的适配工作,接下来具体分析下PageIndicatorDots中的相关源码布局
通过在Insettable中的接口实现 setInsets(Rect insets)来在这个类里面添加具体的方法
import com.android.launcher3.R;import com.android.launcher3.Utilities;import com.android.launcher3.util.Themes;-+import com.android.launcher3.Launcher;+import android.graphics.Rect;+import com.android.launcher3.DeviceProfile;+import android.view.Gravity;+import android.widget.FrameLayout;+import com.android.launcher3.Insettable;-public class PageIndicatorDots extends View implements PageIndicator {+public class PageIndicatorDots extends View implements Insettable,PageIndicator {private float mCurrentPosition;private float mFinalPosition;private ObjectAnimator mAnimator;-+ private Launcher mLauncher;private float[] mEntryAnimationRadiusFactors;public PageIndicatorDots(Context context) {@@ -114,7 +119,7 @@ public class PageIndicatorDots extends View implements PageIndicator {mCirclePaint.setColor(Themes.getAttrColor(context, R.attr.folderPaginationColor));mDotRadius = getResources().getDimension(R.dimen.page_indicator_dot_size) / 2;setOutlineProvider(new MyOutlineProver());-+ mLauncher = Launcher.getLauncher(context);mIsRtl = Utilities.isRtl(getResources());}
Launcher3定制化之桌面分页横线改成圆点显示功能实现的核心功能中,通过上述的分析得知,
在上述的PageIndicatorDots方法中,通过实现Insettable的接口,接下来就可以在
这里添加setInsets(Rect insets)的实现,通过需要实例化Launcher的实现,在实现
setInsets(Rect insets)的时候用到相关的实现具体实现如下
+ @Override+ public void setInsets(Rect insets) {+ DeviceProfile grid = mLauncher.getDeviceProfile();+ FrameLayout.LayoutParams lp = (FrameLayout.LayoutParams) getLayoutParams();++ if (grid.isVerticalBarLayout()) {+ Rect padding = grid.workspacePadding;+ lp.leftMargin = padding.left + grid.workspaceCellPaddingXPx;+ lp.rightMargin = padding.right + grid.workspaceCellPaddingXPx;+ lp.bottomMargin = padding.bottom;+ } else {+ lp.leftMargin = lp.rightMargin = 0;+ lp.gravity = Gravity.CENTER_HORIZONTAL | Gravity.BOTTOM;+ lp.bottomMargin = grid.hotseatBarSizePx + insets.bottom;+ }+ setLayoutParams(lp);+ }
在通过在使用的过程中,会发现在计算分页数量的时候,这里会出现异常,所以需要在
异常的地方做修改,排除分页滚动为0的情况,具体分析实现如下:
@Overridepublic void setScroll(int currentScroll, int totalScroll) {if (SHOW_DOT_PAGINATION.get() && mActivePage != 0 && currentScroll == 0) {CURRENT_POSITION.set(this, (float) mActivePage);return;}if (mNumPages <= 1) {return;}if (mShouldAutoHide) {animatePaginationToAlpha(VISIBLE_ALPHA);}if (mIsRtl) {currentScroll = totalScroll - currentScroll;}int scrollPerPage = totalScroll / (mNumPages - 1);+ if(scrollPerPage == 0)return;int pageToLeft = currentScroll / scrollPerPage;int pageToLeftScroll = pageToLeft * scrollPerPage;int pageToRightScroll = pageToLeftScroll + scrollPerPage;@@ -336,4 +342,22 @@ public class PageIndicatorDots extends View implements PageIndicator {}}}
通过上面几部分的修改,在Launcher3中,就完美实现了在双层改成单层的时候,关于分页横线
修改为分页圆点的核心功能的实现,最终就完成了功能的实现
相关文章:
Android 14.0 Launcher3定制化之桌面分页横线改成圆点显示功能实现
1.前言 在14.0的系统rom产品定制化开发中,在进行launcher3的定制化中,在双层改为单层的开发中,在原生的分页 是横线,而为了美观就采用了系统原来的另外一种分页方式,就是圆点比较美观,接下来就来分析下相关…...
SemiDrive E3 MCAL 开发系列(3)– Wdg 模块的使用
一、 概述 本文将会介绍 SemiDrive E3 MCAL Wdg 模块的基本配置,并且会结合实际操作的介绍,帮助新手快速了解并掌握这个模块的使用,文中的 MCAL 是基于 PTG3.0 的版本,开发板是官方的 E3640 网关板。 二、 Wdg 模块的主要配置 …...
AI推荐算法的演进之路
推荐算法 基于大数据和AI技术,提供全流程一站式推荐平台,协助企业构建个性化推荐应用,提升企业应用的点击率留存率和永久体验。目前,主要的推荐方法包括:基于内容推荐、协同过滤推荐、基于关联规则推荐、基于效用推荐…...
Tomcat安装,配置文件、组件
一、Tomcat的基本功能 1.1.Tomcat是什么? Tomcat服务器是一个免费的开放源代码的Web应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP程序的首选。一般来说,T…...
精读《React Hooks 最佳实践》
简介 React 16.8 于 2019.2 正式发布,这是一个能提升代码质量和开发效率的特性,笔者就抛砖引玉先列出一些实践点,希望得到大家进一步讨论。 然而需要理解的是,没有一个完美的最佳实践规范,对一个高效团队来说&#x…...
varFormatter 数据格式化库 以性能优先的 快速的 内存对象格式转换
varFormatter 数据格式化 技术 开源技术栏 对象/变量格式化工具库,其支持将一个对象进行按照 JSON XML HTML 等格式进行转换,并获取到结果字符串! 目录 文章目录 varFormatter 数据格式化 技术目录介绍获取方式 使用实例格式化组件的基本使…...
基于PHP的在线英语学习平台
有需要请加文章底部Q哦 可远程调试 基于PHP的在线英语学习平台 一 介绍 此在线英语学习平台基于原生PHP开发,数据库mysql。系统角色分为学生,教师和管理员。(附带参考设计文档) 技术栈:phpmysqlphpstudyvscode 二 功能 学生 1 注册/登录/…...
基于微信小程序电影院订票选座系统 (后台JSP+JDBC+Mysql)答辩常规问题和如何回答(答辩指导)
博主介绍:黄菊华老师《Vue.js入门与商城开发实战》《微信小程序商城开发》图书作者,CSDN博客专家,在线教育专家,CSDN钻石讲师;专注大学生毕业设计教育和辅导。 所有项目都配有从入门到精通的基础知识视频课程ÿ…...
C++知识点总结(22):模拟算法真题 ★★★☆☆《安全警报》
安全警报 1. 审题 题目描述 Z市最大的金融公司:太平洋金融遭到了入侵,一名黑客潜入到了公司中,公司紧急启动安保程序,将大楼封锁,并安排作为安全主管的你对楼层进行搜查。所以你准备写一个程序,输入搜查楼…...
蓝桥杯练习系统(算法训练)ALGO-993 RP大冒险
资源限制 内存限制:64.0MB C/C时间限制:200ms Java时间限制:600ms Python时间限制:1.0s 问题描述 请尽情使用各种各样的函数来测试你的RP吧~~~ 输入格式 一个数N表示测点编号。 输出格式 一个0~9的数。 样例输入 0 样…...
Unity的相机跟随和第三人称视角
Unity相机跟随和第三人称视角 介绍镜头视角跟随人物方向进行旋转的镜头视角固定球和人的镜头视角 思路跟随人物方向进行旋转的镜头视角固定球和人的镜头视角 镜头旋转代码人物移动的参考代码注意 介绍 最近足球项目的镜头在做改动,观察了一下实况足球的视角&#x…...
哪个超声波清洗机品牌值得入手?销量榜品牌值得选购!
在科技日益发展的今天,超声波清洗技术以其高效、便捷和深度清洁的特点,已经深入到生活的诸多领域,从精密仪器到珠宝首饰,从眼镜框到假牙,甚至是厨房用品的日常护理,都能见到超声波清洗机的身影。面对市场上…...
Stwo:基于Circle STARK和M31的下一代STARK证明系统
1. 引言 StarkWare团队和Polygon Labs团队,历时数月,构造了基于Mersenne素数域M31的Circle STARK协议,通过使用M31 over a circle,可基于任意有限域构造高效STARKs,具体见2024年2月19日论文《Circle STARKs》。 基于…...
笔记本以太网集线器Hub充电可能导致网络异常(貌似是我把服务器网关写错了)
文章目录 笔记本以太网集线器(Hub)充电导致网络异常概述原理分析电源与信号干扰设备热度设备兼容性问题 解决方案升级固件提高设备散热效率选择兼容性好的设备 总结 今天用笔记本以太网直连服务器,一开始能连通,结果以太网hub插上…...
npm ERR! code ETIMEDOUT
在新建vue项目的时候报错 npm ERR! code ETIMEDOUT npm ERR! syscall connect npm ERR! errno ETIMEDOUT npm ERR! network request to https://registry.npmjs.org/vue%2fcli failed, reason: connect ETIMEDOUT 104.16.2.35:443 npm ERR! network This is a problem relate…...
动态规划(算法竞赛、蓝桥杯)--分组背包DP
1、B站视频链接:E16 背包DP 分组背包_哔哩哔哩_bilibili #include <bits/stdc.h> using namespace std; const int N110; int v[N][N],w[N][N],s[N]; // v[i,j]:第i组第j个物品的体积 s[i]:第i组物品的个数 int f[N][N]; // f[i,j]:前i组物品,能放…...
太阳能供电井盖-物联网智能井盖监测系统-旭华智能
在这个日新月异的科技时代,城市的每一个角落都在悄然发生变化。而在这场城市升级的浪潮中,智能井盖以其前瞻性的科技应用和卓越的安全性能,正悄然崭露头角,变身马路上的智能“眼睛”,守护城市安全。 传统的井盖监测系统…...
贪心 Leetcode 455 分发饼干
分发饼干 Leetcode 455 学习记录自代码随想录 假设你是一位很棒的家长,想要给你的孩子们一些小饼干。但是,每个孩子最多只能给一块饼干。 对每个孩子 i,都有一个胃口值 g[i],这是能让孩子们满足胃口的饼干的最小尺寸࿱…...
策略开发:EMA如何计算
EMA的计算原理 EMA 是MA(平滑移动平均线)的另一种形式。全名“加权指数移动平均线”。 2/13就是12日移动平均线的平滑因子,他的意思是指:给予新价格 2/13的权重,给予过去的EMA 11/13的权重。 在计算的时候第一天的M…...
学习Android的第二十天
目录 Android Toast 吐司 常量 常用方法 例子 Android Notification 状态栏通知 Notification 的基本布局 扩展布局 Notification ( 状态栏通知 ) 相关的方法 例子: 参考文档 Android AlertDialog 弹出框 Android Dialog 继承图谱 AlertDialog 几种常…...
stm32G473的flash模式是单bank还是双bank?
今天突然有人stm32G473的flash模式是单bank还是双bank?由于时间太久,我真忘记了。搜搜发现,还真有人和我一样。见下面的链接:https://shequ.stmicroelectronics.cn/forum.php?modviewthread&tid644563 根据STM32G4系列参考手…...
【力扣数据库知识手册笔记】索引
索引 索引的优缺点 优点1. 通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。2. 可以加快数据的检索速度(创建索引的主要原因)。3. 可以加速表和表之间的连接,实现数据的参考完整性。4. 可以在查询过程中,…...
DockerHub与私有镜像仓库在容器化中的应用与管理
哈喽,大家好,我是左手python! Docker Hub的应用与管理 Docker Hub的基本概念与使用方法 Docker Hub是Docker官方提供的一个公共镜像仓库,用户可以在其中找到各种操作系统、软件和应用的镜像。开发者可以通过Docker Hub轻松获取所…...
中南大学无人机智能体的全面评估!BEDI:用于评估无人机上具身智能体的综合性基准测试
作者:Mingning Guo, Mengwei Wu, Jiarun He, Shaoxian Li, Haifeng Li, Chao Tao单位:中南大学地球科学与信息物理学院论文标题:BEDI: A Comprehensive Benchmark for Evaluating Embodied Agents on UAVs论文链接:https://arxiv.…...
【HarmonyOS 5.0】DevEco Testing:鸿蒙应用质量保障的终极武器
——全方位测试解决方案与代码实战 一、工具定位与核心能力 DevEco Testing是HarmonyOS官方推出的一体化测试平台,覆盖应用全生命周期测试需求,主要提供五大核心能力: 测试类型检测目标关键指标功能体验基…...
蓝牙 BLE 扫描面试题大全(2):进阶面试题与实战演练
前文覆盖了 BLE 扫描的基础概念与经典问题蓝牙 BLE 扫描面试题大全(1):从基础到实战的深度解析-CSDN博客,但实际面试中,企业更关注候选人对复杂场景的应对能力(如多设备并发扫描、低功耗与高发现率的平衡)和前沿技术的…...
定时器任务——若依源码分析
分析util包下面的工具类schedule utils: ScheduleUtils 是若依中用于与 Quartz 框架交互的工具类,封装了定时任务的 创建、更新、暂停、删除等核心逻辑。 createScheduleJob createScheduleJob 用于将任务注册到 Quartz,先构建任务的 JobD…...
质量体系的重要
质量体系是为确保产品、服务或过程质量满足规定要求,由相互关联的要素构成的有机整体。其核心内容可归纳为以下五个方面: 🏛️ 一、组织架构与职责 质量体系明确组织内各部门、岗位的职责与权限,形成层级清晰的管理网络…...
C# 类和继承(抽象类)
抽象类 抽象类是指设计为被继承的类。抽象类只能被用作其他类的基类。 不能创建抽象类的实例。抽象类使用abstract修饰符声明。 抽象类可以包含抽象成员或普通的非抽象成员。抽象类的成员可以是抽象成员和普通带 实现的成员的任意组合。抽象类自己可以派生自另一个抽象类。例…...
全志A40i android7.1 调试信息打印串口由uart0改为uart3
一,概述 1. 目的 将调试信息打印串口由uart0改为uart3。 2. 版本信息 Uboot版本:2014.07; Kernel版本:Linux-3.10; 二,Uboot 1. sys_config.fex改动 使能uart3(TX:PH00 RX:PH01),并让boo…...
