哈尔滨企业做网站湖南关键词网络科技有限公司
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结构了解
源文件 | 说明 |
---|---|
TaskOverlayFactory | Factory class to create and add an overlays on the TaskView 创建和添加UI 覆盖在TaskView |
OverviewActionsView | View for showing action buttons in Overview 在UI上展示覆盖的按钮 |
RecentsView | A list of recent tasks. 最近历史任务列表 |
overview_actions_container | OverviewActionsView 的布局 |
下面以RK 产品最近历史任务作为基本说明,上面的机器显示的最近历史任务界面中 下方的OverView 层 实际开发需求影藏起来了,不利于说明UI结构。
代码实现
思路
- 上面的UI结构图和列举的UI关联类说明,这里给一下 实现思路
- 将最近历史任务列表里面的清除所有按钮 永久影藏
- 在TaskOverlayFactory 和 OverviewActionsView 中添加UI和功能实现
- 在布局overview_actions_container 中 添加删除功能按钮
实现方案
RecentsView
- 一直影藏 全部清除按钮
在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); //隐藏左侧的“全部清除”按钮。。。。。。。。。。}
- 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));}@Overridepublic void clearAllRecentTask() {Log.d(TAG, " clearAllRecentTask...");mThumbnailView.getTaskView().getRecentsView().dismissAllTasks(mThumbnailView.getTaskView().getRecentsView());}}
在overview_actions_container
布局文件中添加 UI布局 的UI按钮
<Buttonandroid: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);
@Overrideprotected 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();
@Overridepublic 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);}
实际效果
总结
- 简单实现了全部清除功能 放到页面下方
- 熟悉最近历史任务的基本功能,基本结构,基本框架
- 其它最近历史任务功能 待 研究