当前位置: 首页 > article >正文

Android 13 Launcher3最近任务列表“全部清除“按钮位置优化实战

一、问题背景与实现难点

在Android 13横屏设备开发中,系统默认将最近任务列表的"全部清除"按钮布局在屏幕左侧,这与用户习惯的底部布局存在明显差异。相较于Android 8.1时代SystemUI模块的实现,Android 13将相关逻辑迁移至Launcher3模块,需要重点修改以下核心文件:

  1. 布局结构重构:需处理原有左侧按钮与新底部按钮的共存问题

  2. 事件传递机制:确保新按钮触发正确的清除逻辑

  3. 动画兼容处理:保持清除动画的连贯性

  4. 多语言适配:确保新增按钮的文本适配

二、关键技术实现路径
1. 布局文件重构(overview_actions_container.xml)

xml

复制

<LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="vertical"android:layout_alignParentBottom="true"><!-- 原有操作按钮容器 --><LinearLayoutandroid:id="@+id/action_buttons"android:orientation="horizontal"><!-- 截图、分屏等按钮 --></LinearLayout><!-- 新增底部清除按钮 --><Buttonandroid:id="@+id/recents_clear_all_btn"style="@style/OverviewActionButton"android:layout_width="match_parent"android:layout_height="48dp"android:text="@string/recents_clear_all"android:drawableStart="@drawable/ic_clear_all"android:gravity="center_vertical|start"/>
</LinearLayout>

运行 HTML

2. 事件处理层改造(OverviewActionsView.java)

java

复制

@Override
protected void onFinishInflate() {super.onFinishInflate();// 绑定新按钮View clearAllBtn = findViewById(R.id.recents_clear_all_btn);clearAllBtn.setOnClickListener(this);// 隐藏旧版按钮View oldClearAll = findViewById(R.id.old_clear_all);oldClearAll.setVisibility(GONE);
}@Override
public void onClick(View v) {if (mCallbacks == null) return;switch(v.getId()) {case R.id.recents_clear_all_btn:// 执行新版清除逻辑mCallbacks.onClearAllRequested();break;// 其他按钮处理...}
}
3. 清除逻辑改造(RecentsView.java)

java

复制

public void dismissAllTasks(View triggerView) {// 添加平移动画AnimatorSet animSet = new AnimatorSet();animSet.playTogether(ObjectAnimator.ofFloat(triggerView, "translationY", 0, 100),ObjectAnimator.ofFloat(triggerView, "alpha", 1, 0));animSet.setDuration(200);// 执行清除逻辑animSet.addListener(new AnimatorListenerAdapter() {@Overridepublic void onAnimationEnd(Animator animation) {mActivity.getModel().getTasks().clearAll();}});animSet.start();
}
4. 工厂类适配(TaskOverlayFactory.java)

java

复制

public class TaskOverlayFactory {private final ClearAllPositionHandler mPositionHandler;public interface ClearAllPositionHandler {void updatePosition(Rect displayRect);}@Overridepublic void onTaskViewUpdated(TaskView taskView) {// 根据当前方向调整位置if (mPositionHandler != null) {mPositionHandler.updatePosition(taskView.getDisplayRect());}}
}
三、兼容性处理方案
  1. 多方向适配:通过DisplayRotationListener检测屏幕方向

java

复制

public class RotationAwareButton extends Button {private final DisplayRotationListener mRotationListener = rotation -> {updateLayoutParams(rotation);};private void updateLayoutParams(int rotation) {LayoutParams params = (LayoutParams) getLayoutParams();switch(rotation) {case Surface.ROTATION_90:params.gravity = Gravity.BOTTOM|Gravity.START;break;case Surface.ROTATION_270:params.gravity = Gravity.BOTTOM|Gravity.END;break;default:params.gravity = Gravity.BOTTOM|Gravity.CENTER;}requestLayout();}
}
  1. 内存泄漏防护:使用WeakReference包装回调

java

复制

private static class SafeCallbackWrapper implements Callback {private final WeakReference<Callback> mWeakRef;SafeCallbackWrapper(Callback original) {mWeakRef = new WeakReference<>(original);}@Overridepublic void onClearAll() {Callback cb = mWeakRef.get();if (cb != null) cb.onClearAll();}
}
四、性能优化建议
  1. 布局层级优化:使用ConstraintLayout代替多层LinearLayout

  2. 动画资源复用:通过AnimatorSet缓存复用清除动画

  3. 异步加载机制:对清除操作采用后台线程处理

java

复制

private final Executor mBgExecutor = Executors.newSingleThreadExecutor();void performClearAll() {mBgExecutor.execute(() -> {// 执行耗时操作SystemServicesProxy.getInstance().killAllRecentTasks();// 更新UImMainHandler.post(() -> {mAdapter.notifyDataSetChanged();});});
}
五、测试验证方案
  1. 自动化测试用例

java

复制

@Test
public void testClearAllButtonPosition() {onView(withId(R.id.recents_view)).perform(swipeUp());onView(withId(R.id.recents_clear_all_btn)).check(isCompletelyDisplayed()).check(isBottomAligned());rotateDeviceToLandscape();onView(withId(R.id.recents_clear_all_btn)).check(isBottomAligned());
}
  1. 手动测试矩阵

测试场景预期结果
横屏模式按钮居底显示
任务数量为0时按钮自动隐藏
快速点击防抖处理,仅响应一次点击
低内存状态保持正常响应

通过以上技术方案的实施,可有效实现Android 13横屏设备最近任务列表"全部清除"按钮的底部布局优化,同时保证系统的稳定性和操作流畅性。建议在代码修改完成后进行多场景压力测试,重点验证横竖屏切换时的布局稳定性及多任务场景下的内存表现。

转载请注明出处Android 13 Launcher3最近任务列表“全部清除“按钮位置优化实战-CSDN博客,谢谢! 

相关文章:

Android 13 Launcher3最近任务列表“全部清除“按钮位置优化实战

一、问题背景与实现难点 在Android 13横屏设备开发中&#xff0c;系统默认将最近任务列表的"全部清除"按钮布局在屏幕左侧&#xff0c;这与用户习惯的底部布局存在明显差异。相较于Android 8.1时代SystemUI模块的实现&#xff0c;Android 13将相关逻辑迁移至Launche…...

基于k3s部署Nginx、MySQL、SpringBoot和Redis的详细教程

1. 安装k3s集群 1.1 单节点快速部署 # 使用root或sudo权限执行 curl -sfL https://get.k3s.io | sh -# 验证安装 sudo kubectl get nodes # 输出应为Ready状态 sudo systemctl status k3s1.2 配置kubectl权限&#xff08;可选&#xff09; mkdir -p ~/.kube sudo cp /etc/r…...

SQL Server数据库简介及应用

SQL Server以高性能、高可用性著称&#xff0c;支持Windows/Linux跨平台部署&#xff0c;满足混合云需求。其内存优化表、列存储索引加速数据处理&#xff0c;AlwaysOn可用性组保障业务连续性。安全体系集成身份验证与加密&#xff0c;符合企业合规要求。与Azure无缝集成&#…...

麒麟V10 arm cpu aarch64 下编译 RocketMQ-Client-CPP 2.2.0

国产自主可控服务器需要访问RocketMQ消息队列&#xff0c;最新的CSDK是2020年发布的 rocketmq-client-cpp-2.2.0 这个版本支持TLS模式。 用默认的版本安装遇到一些问题&#xff0c;记录一下。 下载Releases apache/rocketmq-client-cpp GitHubhttps://github.com/apache/roc…...

【商城实战(49)】解锁小程序端适配与优化,让商城飞起来

【商城实战】专栏重磅来袭&#xff01;这是一份专为开发者与电商从业者打造的超详细指南。从项目基础搭建&#xff0c;运用 uniapp、Element Plus、SpringBoot 搭建商城框架&#xff0c;到用户、商品、订单等核心模块开发&#xff0c;再到性能优化、安全加固、多端适配&#xf…...

使用码云搭建CocoaPods远程私有库

一、创建远程私有索引库 用来存放私有框架的详细描述信息.podspec文件 1. 创建私有库 假设码云上创建的私有库为repo-spec 2. 查看本地已存在的索引库 pod repo list 3. 将远程私有索引库添加到本地 pod repo add [https://gitee.com/jingluoguo/repo-spec.git](https://gi…...

深度学习有哪些算法?

深度学习包含多种算法和模型&#xff0c;广泛应用于图像处理、自然语言处理、语音识别等领域。以下是主要分类及代表性算法&#xff1a; 一、基础神经网络 多层感知机&#xff08;MLP&#xff09; 最简单的深度学习模型&#xff0c;由多个全连接层组成&#xff0c;用于分类和回…...

专访LayaAir引擎最有价值专家-施杨

在 LayaAir 引擎的资源商店中&#xff0c;许多开发者都会注意到一个熟悉的名字——“射手座”。他不仅贡献了大量高质量的 Shader 资源&#xff0c;让一些开发者通过他的作品了解到 LayaAir 引擎在 3D 视觉效果上的更多可能&#xff0c;也让大家能够以低成本直接学习并应用这些…...

AJAX的理解和原理还有概念

你想问的可能是 AJAX&#xff08;Asynchronous JavaScript and XML&#xff09; &#xff0c;它并不是一门新的编程语言&#xff0c;而是一种在无需重新加载整个网页的情况下&#xff0c;能够与服务器进行异步通信并更新部分网页的技术。以下从基本概念、原理、优点、使用场景等…...

自然语言处理:文本聚类

介绍 大家好&#xff0c;博主又来和大家分享自然语言处理领域的知识了。今天给大家分享的内容是自然语言处理中的文本聚类。 文本聚类在自然语言处理领域占据着重要地位&#xff0c;它能将大量无序的文本按照内容的相似性自动划分成不同的类别&#xff0c;极大地提高了文本处…...

RabbitMQ 集群降配

这里写自定义目录标题 摘要检查状态1. 检查 RabbitMQ 服务状态2. 检查 RabbitMQ 端口监听3. 检查 RabbitMQ 管理插件是否启用4. 检查开机自启状态5. 确认集群高可用性6. 检查使用该集群的服务是否做了断开重连 实操1. 负载均衡配置2. 逐个节点降配&#xff08;滚动操作&#xf…...

uniapp工程中解析markdown文件

在uniapp中如何导入markdown文件&#xff0c;同时在页面中解析成html&#xff0c;请参考以下配置&#xff1a; 1. 安装以下3个依赖包 npm install marked highlight.js vite-plugin-markdown 2. 创建vite.config.js配置文件 // vite.config.js import { defineConfig } fro…...

数据结构:二叉树(一)·(重点)

前言 什么树&#xff1f;what&#xff1f; 树的概念与结构 概念&#xff1a; 树是⼀种⾮线性的数据结构&#xff0c;它是由 n &#xff08; n>0 &#xff09; 个有限结点组成⼀个具有层次关系的集合。 结构&#xff1a; 有⼀个特殊的结点&#xff0c;称为根结点&#…...

DevEco Studio的使用

目录 1.创建ArkTS工程 2.ArkTS工程目录结构&#xff08;Stage模型&#xff09; 构建第一个页面 构建第二个页面 实现页面间的跳转 1.创建ArkTS工程 若首次打开DevEco Studio&#xff0c;请点击Create Project创建工程。如果已经打开了一个工程&#xff0c;请在菜单栏选择…...

十七、实战开发 uni-app x 项目(仿京东)- 后端指南

前面我们已经用uniappx进行了前端实战学习 一、实战 开发uni-app x项目(仿京东)-规划-CSDN博客 二、实战 开发uni-app x项目(仿京东)-项目搭建-CSDN博客 三、实战开发 uni-app x 项目(仿京东)- 技术选型-CSDN博客 四、实战开发 uni-app x 项目(仿京东)- 页面设计-C…...

数据开发岗笔试题>>sql(hive) ,excel [2025]

sql SELECT user_id, AVG(loan_amount) AS avg_loan_amount FROM loan GROUP BY user_id HAVING AVG(loan_amount) > 20000; 授信表&#xff1a;credit 字段包含user_id(用户id)&#xff0c;credit_id(授信id)&#xff0c;credit_time(授信时间yyyy-MM-dd HH:mm:ss)&#x…...

内存模型以及分区,需要详细到每个区放什么。

1. 内存模型以及分区&#xff0c;需要详细到每个区放什么。 JVM 分为堆区和栈区&#xff0c;还有方法区&#xff0c;初始化的对象放在堆里面&#xff0c;引用放在栈里面&#xff0c; class 类信息常量池&#xff08;static 常量和 static 变量&#xff09;等放在方法区new: …...

python strip/rstrip/lstrip详细讲解(涵盖许多例子、作用以及复杂行为处理)

python strip/rstrip/lstrip详细讲解: 在Python中,strip、lstrip、rstrip 是用于字符串处理的常用方法,主要功能是去除字符串首尾的指定字符。它们的区别如下: 1. strip([chars]) 作用 :删除字符串开头和结尾 处所有属于 chars 的字符,直到遇到不属于 chars 的字符为止…...

Spring Boot集成PageHelper:轻松实现数据库分页功能

Spring Boot集成PageHelper&#xff1a;轻松实现数据库分页功能 1. 为什么需要分页&#xff1f; 分页是处理大数据量查询的核心技术&#xff0c;其重要性体现在&#xff1a; 性能优化&#xff1a;避免单次查询返回过多数据导致内存溢出或响应延迟。用户体验&#xff1a;前端展…...

OpenGL ES 入门指南:从基础到实战

引言&#xff1a;为什么需要 OpenGL ES&#xff1f; 在当今的嵌入式设备&#xff08;如智能手机、汽车仪表盘、智能家居中控屏&#xff09;中&#xff0c;流畅的图形渲染能力是用户体验的核心。OpenGL ES&#xff08;OpenGL for Embedded Systems&#xff09; 作为行业标准&am…...

docker安装milvus向量数据库Attu可视化界面

Docker 部署 Milvus 及 Attu 可视化工具完整指南 一、环境准备 安装 Docker 及 Docker Compose Docker 版本需 ≥20.10.12Docker Compose 版本需 ≥2.20.0&#xff08;推荐 V2&#xff09; 验证 Docker 环境 docker --version && docker-compose --version若出现&…...

Elasticsearch 索引

一、简介 在 Elasticsearch 中&#xff0c;索引&#xff08;Index&#xff09;是存储相关文档的地方&#xff0c;类似于关系数据库中的数据库。索引是 Elasticsearch 中最重要的概念之一&#xff0c;用于组织和存储数据。 二、索引的基本概念 索引&#xff08;Index&#xf…...

ArcGIS10. 8简介与安装,附下载地址

目录 ArcGIS10.8 1. 概述 2. 组成与功能 3. 10.8 特性 下载链接 安装步骤 1. 安装准备 2. 具体步骤 3.补丁 其他版本安装 ArcGIS10.8 1. 概述 ArcGIS 10.8 是由美国 Esri 公司精心研发的一款功能强大的地理信息系统&#xff08;GIS&#xff09;平台。其核心功能在于…...

Idea中使用Git插件_合并当前分支到master分支_冲突解决_很简单---Git工作笔记005

由于之前用svn习惯了,用的git少,其实在idea中使用git,解决冲突,合并分支,非常的简单,一起来看一下吧. 一定要注意操作之前,一定要确保自己的分支代码,都已经commit提交了,并且push到远程了. 不要丢东西. 可以看到首先,在idea的左下角有个 git,点开以后 可以看到有显示的分支…...

Docker简易使用说明

Docker使用说明 文章目录 Docker使用说明一. 安装二. 测试三. 镜像加速 一. 安装 安装其实没什么可说的&#xff0c;但凡有显示界面的OS&#xff0c;如windows/Mac&#xff0c;直接上官方网站下载安装即可 二. 测试 若安装好docker后&#xff0c;应当先检测docker的网络通信…...

【Linux】应用层自定义协议 + 序列化和反序列化

应用层自定义协议 序列化和反序列化 一.应用层1.再谈 "协议"2.序列化 和 反序列化 二. Jsoncpp1.序列化2.反序列化 三. Tcp全双工 面向字节流四.自定义协议 保证报文的完整性1.Makefile2.Mutex.hpp3.Cond.hpp4.Log.hpp5.Thread.hpp6.ThreadPool.hpp7.Common.hpp8.…...

Matlab 雷达导引头伺服系统的建模与仿真研究

1、内容简介 Matlab 177-雷达导引头伺服系统的建模与仿真研究 可以交流、咨询、答疑 2、内容说明 略[摘 要]基于 Malah/Simuink 雷达导引|头同服系统的建模与仿真&#xff0c;首先对雷达导引头同服系统按照预定回路和跟踪回路的步骤分别进行建模以及相关控制参数计算,接着构建…...

华为ipd流程华为流程体系管理华为数字化转型流程数字化管理解决方案介绍81页精品PPT

华为流程体系最佳实践主要包括构建完善的流程框架&#xff0c;明确各层级流程要素与职责&#xff0c;梳理涵盖研发、采购、营销、服务、资产管理等多领域的流程&#xff0c;通过梳理业务场景和核心能力搭建差异化流程框架&#xff0c;采用自上而下与自下而上相结合的建模方法&a…...

深入理解 HTML 中的统一资源定位器(URL)

一、引言 在互联网的世界中&#xff0c;我们每天都在与各种网页打交道。而网页能够被准确地访问和获取&#xff0c;离不开一个关键的元素 —— 统一资源定位器&#xff08;Uniform Resource Locators&#xff0c;简称 URL&#xff09;。它就像是网络世界中的地址&#xff0c;指…...

网络流基本概念及实现算法

基本概念 流网络 对于一个有向图, 抽象成水管里的水的模型, 每根管子有容量限制, 计为 G ( V , E ) G (V, E) G(V,E), 首先不考虑反向边 对于任意无向图, 都可以将反向边转化为上述形式 如果一条边不存在, 定义为容量为 0 0 0, 形式上来说就是 c ( u , v ) 0 c(u, v) 0 c(…...