MTK Android12 最近历史任务 最左侧的清除历史任务改到页面底部

news2025/3/14 12:50:42

Android最近历史任务页面 -清除所有- 功能按钮放到底部

文章目录

  • 需求
    • 需求原因
  • 修改的核心文件
  • 实现方案
    • 最近历史任务基本UI结构了解
    • 代码实现
      • 思路
      • 实现方案
        • RecentsView
        • TaskOverlayFactory
        • 在overview_actions_container
        • OverviewActionsView
      • 实际效果
  • 总结


需求

最近历史任务重,全部清除按钮迁移到页面底部,常显。

需求原因

  • 其实很多客户都有反馈过,或者我们自己在使用自己手机时候,最近历史任务界面比较多的时候,右滑到最左边才会出现全部清除按钮,使用不方便,
    需要放到下边常显。

如下界面所示,修改之前:

在这里插入图片描述

修改的核心文件

\vendor\mediatek\proprietary\packages\apps\Launcher3\quickstep\src\com\android\quickstep\TaskOverlayFactory.java
\vendor\mediatek\proprietary\packages\apps\Launcher3\quickstep\src\com\android\quickstep\views\OverviewActionsView.java
\vendor\mediatek\proprietary\packages\apps\Launcher3\quickstep\src\com\android\quickstep\views\RecentsView.java
\vendor\mediatek\proprietary\packages\apps\Launcher3\quickstep\res\layout\overview_actions_container.xml

#参考资料

  • 网上很多参考资料参考,思路永远一致,但是不同芯片平台,相同平台不同安卓版本 还是有一些区别的,根据自己实际环境,调试。

比如:在Android11之前最近历史任务在SystemUI中,在Android11 版本及之后,最近历史任务已经转移到了Launcher 里面了。

  • 这里只是给一个思路,我自己在RKAndroid11 和 Rk Android12 上面都实践过,思路一致,修改点少许改动,即可实现。

SystemUI 调整Recents中全部清除按钮位置

Android 11.0 最近任务的全部清除由左边移到下边显示

Android 13.0 Launcher3定制化之最近任务的全部清除由左边移到下边显示

实现方案

最近历史任务基本UI结构了解

源文件说明
TaskOverlayFactoryFactory class to create and add an overlays on the TaskView 创建和添加UI 覆盖在TaskView
OverviewActionsViewView for showing action buttons in Overview 在UI上展示覆盖的按钮
RecentsViewA list of recent tasks. 最近历史任务列表
overview_actions_containerOverviewActionsView 的布局

下面以RK 产品最近历史任务作为基本说明,上面的机器显示的最近历史任务界面中 下方的OverView 层 实际开发需求影藏起来了,不利于说明UI结构。
在这里插入图片描述

代码实现

思路

  • 上面的UI结构图和列举的UI关联类说明,这里给一下 实现思路
  • 将最近历史任务列表里面的清除所有按钮 永久影藏
  • 在TaskOverlayFactory 和 OverviewActionsView 中添加UI和功能实现
  • 在布局overview_actions_container 中 添加删除功能按钮

实现方案

RecentsView
  1. 一直影藏 全部清除按钮
    在RecentsView 构造方法中,设置清除所有按钮mClearAllButton INVISIBLE
	mClearAllButton.setVisibility(View.INVISIBLE);   //隐藏左侧的“全部清除”按钮
 public RecentsView(Context context, AttributeSet attrs, int defStyleAttr,
            BaseActivityInterface sizeStrategy) {
        super(context, attrs, defStyleAttr);
    。。。。。。。。。。。。。。。
        mClearAllButton.setOnClickListener(this::dismissAllTasks);
		mClearAllButton.setVisibility(View.INVISIBLE);   //隐藏左侧的“全部清除”按钮
    。。。。。。。。。。
    }
  1. isClearAllHidden 是否隐藏的判断,直接设置为true
  /**
     * Whether the Clear All button is hidden or fully visible. Used to determine if center
     * displayed page is a task or the Clear All button.
     *
     * @return True = Clear All button not fully visible, center page is a task. False = Clear All
     * button fully visible, center page is Clear All button.
     */
    public boolean isClearAllHidden() {
        //return mClearAllButton.getAlpha() != 1f;
		Log.d(TAG, " isClearAllHidden.. return true");

		return true;
    }
TaskOverlayFactory

1) OverlayUICallbacks 内部接口中添加清除所有的接口方法 clearAllRecentTask()

这里本身定义的有 分享onShare 、 截屏 onScreenshot 的功能按钮

 /**
     * Callbacks the Ui can generate. This is the only way for a Ui to call methods on the
     * controller.
     */
    public interface OverlayUICallbacks {
        /** User has indicated they want to share the current task. */
        void onShare();

        /** User has indicated they want to screenshot the current task. */
        void onScreenshot();
		void clearAllRecentTask();
    }

2) OverlayUICallbacksImpl 实现上述接口OverlayUICallbacks中的clearAllRecentTask 方法 clearAllRecentTask,定义清除所有的功能

protected class OverlayUICallbacksImpl implements OverlayUICallbacks {
            protected final boolean mIsAllowedByPolicy;
            protected final Task mTask;

            public OverlayUICallbacksImpl(boolean isAllowedByPolicy, Task task) {
                mIsAllowedByPolicy = isAllowedByPolicy;
                mTask = task;
            }

            public void onShare() {
                if (mIsAllowedByPolicy) {
                    endLiveTileMode(() -> mImageApi.startShareActivity(null));
                } else {
                    showBlockedByPolicyMessage();
                }
            }

            @SuppressLint("NewApi")
            public void onScreenshot() {
                endLiveTileMode(() -> saveScreenshot(mTask));
            }
			 @Override
             public void clearAllRecentTask() {
			   Log.d(TAG, " clearAllRecentTask...");
               mThumbnailView.getTaskView().getRecentsView().dismissAllTasks(mThumbnailView.getTaskView().getRecentsView());
            }
        }
在overview_actions_container

布局文件中添加 UI布局 的UI按钮

        <Button
            android:id="@+id/recents_clear_all_btn"
            style="@style/OverviewActionButton"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:drawableStart="@drawable/ic_screenshot"
            android:text="@string/recents_clear_all"
            android:theme="@style/ThemeControlHighlightWorkspaceColor"
            />

OverviewActionsView

加载布局,给布局设置接口回调和点击功能
1) onFinishInflate 方法周公加载 布局文件的UI按钮 并设置监按钮点击监听事件

findViewById(R.id.recents_clear_all_btn).setOnClickListener(this);
 @Override
    protected void onFinishInflate() {
        super.onFinishInflate();
        View share = findViewById(R.id.action_share);
        share.setOnClickListener(this);
        findViewById(R.id.action_screenshot).setOnClickListener(this);
		findViewById(R.id.recents_clear_all_btn).setOnClickListener(this);
         if (ENABLE_OVERVIEW_SHARE.get()) {
            share.setVisibility(VISIBLE);
            findViewById(R.id.oav_three_button_space).setVisibility(VISIBLE);
        }
    }

2) onClick 中回调 view 点击事件,然后回调接口事件 mCallbacks.clearAllRecentTask();


    @Override
    public void onClick(View view) {
        if (mCallbacks == null) {
			Log.d(TAG, " mCallbacks == null...");
            return;
        }
        int id = view.getId();
        if (id == R.id.action_share) {
            mCallbacks.onShare();
        } else if (id == R.id.action_screenshot) {
            mCallbacks.onScreenshot();
        } else if (id == R.id.recents_clear_all_btn) {
			  Log.d(TAG, "onClick recents_clear_all_btn...");
              mCallbacks.clearAllRecentTask();
        }
    }

3) updateDisabledFlags 更新,永为true

LayoutUtils.setViewEnabled(this, true);
  /**
     * Updates the proper disabled flag to indicate whether OverviewActionsView should be enabled.
     * Ignores DISABLED_ROTATED flag for determining enabled. Flag is used to enable/disable
     * buttons individually, currently done for select button in subclass.
     *
     * @param disabledFlags The flag to update.
     * @param enable        Whether to enable the disable flag: True will cause view to be disabled.
     */
    public void updateDisabledFlags(@ActionsDisabledFlags int disabledFlags, boolean enable) {
        if (enable) {
            mDisabledFlags |= disabledFlags;
        } else {
            mDisabledFlags &= ~disabledFlags;
        }
        //
        boolean isEnabled = (mDisabledFlags & ~DISABLED_ROTATED) == 0;
        //LayoutUtils.setViewEnabled(this, isEnabled);
		Log.d(TAG, " updateDisabledFlags...");
		LayoutUtils.setViewEnabled(this, true);
    }

实际效果

在这里插入图片描述

总结

  • 简单实现了全部清除功能 放到页面下方
  • 熟悉最近历史任务的基本功能,基本结构,基本框架
  • 其它最近历史任务功能 待 研究

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2314876.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

TCP协议支持全双工原因TCP发送接收数据是生产者消费者模型

一、TCP支持全双工的原因 TCP协议支持全双工&#xff0c;即使用TCP协议进行通信时&#xff0c;服务端和客户端可以同时进行数据的发送和接收&#xff0c;互不干扰&#xff0c;实现同时双向传输数据。 这是因为使用TCP协议通信时&#xff0c;读写套接字的文件描述符既用来发送…

文件操作2

7. ⽂件读取结束的判定 7.1 被错误使用的 feof 牢记&#xff1a;在文件读取过程中&#xff0c;不能用 feof 函数的返回值直接来判断文件的是否结束。 feof 的作用是&#xff1a;当文件读取结束的时候&#xff0c;判断读取结束的原因是否是&#xff1a;遇到文件尾结束。 1. …

《又是二叉树?递归与回溯的经典应用》

“ 我喜欢晴天&#xff0c;你恰好是最好的太阳” 226.翻转二叉树 力扣题目链接(opens new window) 翻转一棵二叉树。 这道题我们可以通过递归法解决&#xff0c;我们只要递归的把每一个节点的左右孩子反转一下就能解决了。 代码如下&#xff1a; var invertTree function(ro…

Qt/C++音视频开发82-系统音量值获取和设置/音量大小/静音

一、前言 在音视频开发中&#xff0c;音量的控制分两块&#xff0c;一个是控制播放器本身的音量&#xff0c;绝大部分场景都是需要控制这个&#xff0c;这个不会影响系统音量的设置。还有一种场景是需要控制系统的音量&#xff0c;因为播放器本身的音量是在系统音量的基础上控…

从零到精通文本指令:打造个人AI助理的完整指令库(Prompt 指令实操)

文章目录 从零到精通文本指令&#xff1a;打造个人AI助理的完整指令库(Prompt 指令实操)创作指令创作指令**润色指令****扩写指令** 问答指令直接问答材料问答时间逻辑问答 总结、摘要、翻译指令总结信息抽取翻译 从零到精通文本指令&#xff1a;打造个人AI助理的完整指令库(Pr…

C# NX二次开发:获取模型中所有的草图并获取草图中的对象

大家好&#xff0c;今天接着讲NX二次开发获取草图相关。 获取草图的方法是从workPart中获取&#xff0c;如下面的例子所示&#xff1a; List<Tag> tags new List<Tag>(); SketchCollection sketchCollection workPart.Sketches; …

基于SpringBoot和MybatisPlus实现通用Controller

基于SpringBoot和MybatisPlus实现通用Controller&#xff0c;只需要创建实体类和mapper接口&#xff0c;单表增删改查接口就已经实现&#xff0c;提升开发效率 1.定义通用controller package com.xian.controller;import cn.hutool.core.map.MapUtil; import com.baomidou.my…

锤头线和倒锤头线

1、锤头线 是指一根没有上影线或上影线很短,而下影线很长,实体却很小的K线。其K线实体可以是阴线或是阳线,类似于T字。 锤头线的特征有以下三点: 实体很小,下影线长度大于或等于实体的两倍。下影线越长时,如股价处于低位,则上涨的可能性越大。 如股价处于高位,则下跌…

蓝桥杯嵌入式组第十二届省赛题目解析+STM32G431RBT6实现源码

文章目录 1.题目解析1.1 分而治之&#xff0c;藕断丝连1.2 模块化思维导图1.3 模块解析1.3.1 KEY模块1.3.2 LED模块1.3.3 LCD模块1.3.4 TIM模块1.3.5 UART模块1.3.5.1 uart数据解析 2.源码3.第十二届题目 前言&#xff1a;STM32G431RBT6实现嵌入式组第十二届题目解析源码&#…

STM32上实现简化版的AUTOSAR DEM模块

文章目录 摘要摘要 在一些可以不使用AUTOSAR的项目中,往往也有故障检测和DTC存储的需求,开发一套类似于AUTOSAR DEM模块的软件代码,能够满足DTC的检出和存储,使用FalshDB代替Nvm模块,轻松构建持久化存储,如果你也有这样的需求,请阅读本篇,希望能够帮到你。 /*********…

如何用终端运行一个SpringBoot项目

在项目开发阶段&#xff0c;为了能够快速测试一个SpringBoot项目的执行结果&#xff0c;就可以采用终端&#xff08;黑窗&#xff09;运行查看&#xff0c;因为我们不能要求每一个客户都安装idea并且适配我们的项目版本。 下面将展示打包运行这两个方面的过程&#xff1a; 创建…

多线程与并发编程 面试专题

多线程与并发编程 面试专题 线程的基础概念基础概念线程的创建线程的状态线程的终止方式start 与 run 区别线程的常用方法 锁锁的分类深入synchronized深入ReentrantLock死锁问题 阻塞队列线程池 线程的基础概念 基础概念 进程与线程 进程&#xff1a;指运行中的程序。 比如我…

米尔电子-LR3568-烧录鸿蒙

最近开始搞鸿蒙&#xff0c;用的是米尔的LR3568。 开贴记录。 首先要在LR3568上烧录鸿蒙 一、安装准备 1.从米尔电子上下载资料 网址:米尔开发者中心 注册完成后&#xff0c;进入页面&#xff0c;选择我的产品&#xff0c;添加PN和SN PN和SN可以在包装盒上找到 添加到这里…

基于Flink SQL的实时指标多维分析模型

数据流程介绍 1.创建源表kafka接入消息队列数据&#xff0c;定义字段映射规则&#xff1b; 2.创建目标表es_sink配置Elasticsearch输出&#xff1b; 3.通过多级视图&#xff08;tmp→tmp_dedup→tmp1/tmp2→tmp3→tmp_groupby&#xff09;实现数据清洗、去重、状态计算&#x…

【从零开始学习计算机科学】数据库系统(二)关系数据库 与 关系代数

【从零开始学习计算机科学】数据库系统(二)关系数据库 与 关系代数 关系数据库结构化查询语言SQL数据定义语言(DDL)数据查询语言(Data Query Language, DQL)数据操纵语言(Data Manipulation Language, DML)数据控制语言(Data Control Language, DCL)关系型数据库的优…

Linux驱动开发实战(四):设备树点RGB灯

Linux驱动开发实战&#xff08;四&#xff09;&#xff1a;设备树点RGB灯 文章目录 Linux驱动开发实战&#xff08;四&#xff09;&#xff1a;设备树点RGB灯前言一、驱动实现1.1 驱动设计思路1.2 关键数据结构1.3 字符设备操作函数1.4 平台驱动探测函数1.5 匹配表和平台驱动结…

vue中,watch里,this为undefined的两种解决办法

提示&#xff1a;vue中&#xff0c;watch里&#xff0c;this为undefined的两种解决办法 文章目录 [TOC](文章目录) 前言一、问题二、方法1——使用function函数代替箭头函数()>{}三、方法2——使用that总结 前言 ‌‌‌‌‌尽量使用方法1——使用function函数代替箭头函数()…

设计模式C++

针对一些经典的常见的场景, 给定了一些对应的解决方案&#xff0c;这个就叫设计模式。 设计模式的作用&#xff1a;使代码的可重用性高&#xff0c;可读性强&#xff0c;灵活性好&#xff0c;可维护性强。 设计原则&#xff1a; 单一职责原则&#xff1a;一个类只做一方面的…

前端构建工具进化论:从Grunt到Turbopack的十年征程

前端构建工具进化论&#xff1a;从Grunt到Turbopack的十年征程 一、石器时代&#xff1a;任务自动化工具&#xff08;2012-2014&#xff09; 1.1 Grunt&#xff1a;首个主流构建工具 // Gruntfile.js 典型配置 module.exports function(grunt) {grunt.initConfig({concat: {…

设备预测性维护:企业降本增效的关键密码​

在当今竞争激烈的商业战场中&#xff0c;企业犹如一艘在波涛汹涌大海上航行的巨轮&#xff0c;要想乘风破浪、稳步前行&#xff0c;降本增效便是那至关重要的 “船锚”&#xff0c;帮助企业在复杂的市场环境中站稳脚跟。而设备预测性维护&#xff0c;正是开启企业降本增效大门的…