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 几种常…...
WarcraftHelper:让经典魔兽争霸III在现代系统上重获新生
WarcraftHelper:让经典魔兽争霸III在现代系统上重获新生 【免费下载链接】WarcraftHelper Warcraft III Helper , support 1.20e, 1.24e, 1.26a, 1.27a, 1.27b 项目地址: https://gitcode.com/gh_mirrors/wa/WarcraftHelper 你是否还记得那些在网吧通宵鏖战魔…...
Linux系统中的Postlog 命令详解
在 Linux 系统中,并没有一个标准的命令叫做 Postlog。这可能是因为在不同的上下文或者特定的软件中,Postlog 可能指的是不同的命令或者功能。不过,我们可以探讨几个与日志(logging)相关的概念和命令,这些可…...
Pixel Mind Decoder 生成技术文档:基于代码注释的情绪可读性分析
Pixel Mind Decoder 生成技术文档:基于代码注释的情绪可读性分析 1. 代码注释的情绪分析价值 在软件开发过程中,代码注释是开发者之间沟通的重要桥梁。但很少有人关注这些注释背后隐藏的情绪状态——它们可能是疲惫的深夜加班产物,也可能是…...
ROS2 Nav2避障实战:用DWA算法让TurtleBot3在室内绕开障碍物(附Python代码)
ROS2 Nav2避障实战:用DWA算法让TurtleBot3在室内绕开障碍物(附Python代码) 在机器人自主导航领域,避障能力直接决定了系统的可靠性和实用性。想象一下,当你把TurtleBot3放在充满桌椅的房间里,它能像人类一…...
Mediapipe手势识别实战——基于关节角度计算实现动态手势分类
1. 从Mediapipe基础到动态手势识别 第一次接触Mediapipe的手部关键点检测时,我被它的21个关节点输出惊艳到了。但很快发现一个问题:单纯画出关节点和连线,就像给手部画了张"骨架图",根本无法理解手势含义。直到尝试用关…...
数据团队该醒醒了:AI智能体不是你的下一个仪表盘众
7.1 初识三维模型 7.1.1 三维模型的数据载体 随着计算机图形技术的发展,我们或多或少都会见过或者听说过三维模型。笔者始终记得小时候第一次在电视上看到三维动画《变形金刚:超能勇士》的震撼感受;而现在我们已经可以在手机上玩三维游戏《王…...
终极PEFT技术教程:用少量数据高效微调大模型的完整指南
终极PEFT技术教程:用少量数据高效微调大模型的完整指南 【免费下载链接】notebooks Notebooks using the Hugging Face libraries 🤗 项目地址: https://gitcode.com/gh_mirrors/note/notebooks GitHub 加速计划 / note / notebooks项目提供了丰富…...
GLM-OCR在网络安全中的应用:恶意软件截图与钓鱼网站界面分析
GLM-OCR在网络安全中的应用:恶意软件截图与钓鱼网站界面分析 最近和几个做安全的朋友聊天,他们都在抱怨一个事儿:每天要处理海量的恶意软件截图和钓鱼网站页面,眼睛都快看花了。这些图片里藏着大量关键信息,比如勒索软…...
CCF中学生计算机程序设计(提高篇)电子版
->入门篇<- ->基础篇<- ->CSP-S核心讲义<- 这本书可以为C的同学提供帮助,都给你免费还不点赞关注 –>CCF中学生计算机程序设计(提高篇).pdf –>网页浏览 通过网盘分享的文件:代码源全套入门提高 链接…...
Switch 2 第三方扩展坞:适配难题下的新选择
Switch 2 适配难题催生第三方扩展坞新机遇任天堂推出 Switch 2 时更改了控制器连接新系统的无线协议以及通过 USB - C 输出视频的方式,这使得所有第三方制造商都得从头开始研发适配产品。搞清楚如何与 Switch 2 “对话”,并确保在系统更新后仍能保持稳定…...
