Android11.0 导航栏添加图标截屏

需求: 导航栏添加截屏和电源键图标,控制截屏和用于设备重启关机功能。设置中添加延时截屏和控制截屏图标显示开关。
在这里插入图片描述

1. 导航栏添加图标

1.1 添加布局文件和图标icon

在layout目录下添加nav_power.xml和screenshot.xml文件

  • frameworks/base/packages/SystemUI/res/layout/nav_power.xml
<?xml version="1.0" encoding="utf-8"?>
<com.android.systemui.statusbar.policy.KeyButtonViewxmlns:android="http://schemas.android.com/apk/res/android"xmlns:systemui="http://schemas.android.com/apk/res-auto"android:id="@+id/nav_power"android:layout_width="@dimen/navigation_key_width"android:layout_height="match_parent"android:layout_weight="0"android:scaleType="center"android:contentDescription="@string/accessibility_home"android:paddingStart="@dimen/navigation_key_padding"android:paddingEnd="@dimen/navigation_key_padding"/>
  • frameworks/base/packages/SystemUI/res/layout/screenshot.xml
<?xml version="1.0" encoding="utf-8"?>
<com.android.systemui.statusbar.policy.KeyButtonViewxmlns:android="http://schemas.android.com/apk/res/android"xmlns:systemui="http://schemas.android.com/apk/res-auto"android:id="@+id/screenshot"android:layout_width="@dimen/navigation_key_width"android:layout_height="match_parent"android:layout_weight="0"systemui:keyCode="0"android:scaleType="center"android:contentDescription="@string/accessibility_home"android:paddingStart="@dimen/navigation_key_padding"android:paddingEnd="@dimen/navigation_key_padding"/>

drawable目录下添加ic_sysbar_power_button.xml和ic_sysbar_screenshot_button.xml

  • frameworks/base/packages/SystemUI/res/drawable/ic_sysbar_power_button.xml
<vector xmlns:android="http://schemas.android.com/apk/res/android"android:width="24dp"android:height="24dp"android:viewportWidth="24"android:viewportHeight="24"><pathandroid:fillColor="?attr/singleToneColor"android:pathData="M11,2h2v10h-2zM18.37,5.64l-1.41,1.41c2.73,2.73 2.72,7.16 -0.01,9.89 -2.73,2.73 -7.17,2.73 -9.89,0.01 -2.73,-2.73 -2.74,-7.18 -0.01,-9.91l-1.41,-1.4c-3.51,3.51 -3.51,9.21 0.01,12.73 3.51,3.51 9.21,3.51 12.72,-0.01 3.51,-3.51 3.51,-9.2 0,-12.72z"/>
</vector>
  • frameworks/base/packages/SystemUI/res/drawable/ic_sysbar_screenshot_button.xml
<vector xmlns:android="http://schemas.android.com/apk/res/android"android:width="24dp"android:height="24dp"android:viewportWidth="24"android:viewportHeight="24"><pathandroid:fillColor="?attr/singleToneColor"android:pathData="M17,1.01L7,1c-1.1,0 -2,0.9 -2,2v18c0,1.1 0.9,2 2,2h10c1.1,0 2,-0.9 2,-2L19,3c0,-1.1 -0.9,-1.99 -2,-1.99zM17,21L7,21v-1h10v1zM17,18L7,18L7,6h10v12zM17,4L7,4L7,3h10v1zM9.5,8.5L12,8.5L12,7L8,7v4h1.5zM12,17h4v-4h-1.5v2.5L12,15.5z"/>
</vector>

1.2 加载布局

  • frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarInflaterView.java
public static final String HOME = "home";
// add start
public static final String SCREENSHOT = "screenshot";
public static final String NAV_POWER = "nav_power";
// end// 获取默认布局资源配置,关系到下一步修改图标显示位置顺序
protected String getDefaultLayout() {final int defaultResource = QuickStepContract.isGesturalMode(mNavBarMode)? R.string.config_navBarLayoutHandle: mOverviewProxyService.shouldShowSwipeUpUI()? R.string.config_navBarLayoutQuickstep: R.string.config_navBarLayout;return getContext().getString(defaultResource);
}...private View createView(String buttonSpec, ViewGroup parent, LayoutInflater inflater) {View v = null;...if (HOME.equals(button)) {v = inflater.inflate(R.layout.home, parent, false);// add start} else if (SCREENSHOT.equals(button)) {v = inflater.inflate(R.layout.screenshot, parent, false);} else if (NAV_POWER.equals(button)) {v = inflater.inflate(R.layout.nav_power, parent, false);}// end

1.3 控制导航栏按键显示位置

  • frameworks/base/packages/SystemUI/res/values-sw372dp/config.xml
<string name="config_navBarLayout" translatable="false">left[.25W],screenshot[.5WC],back[.5WC];home;recent[.5WC],nav_power[.5WC],right[.25W]</string>

这个根据设备的分辨率来修改,有可能需要修改其他目录下的config,搜索config_navBarLayout

1.4 添加的按键设置图标

  • frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java
private KeyButtonDrawable mBackIcon;
private KeyButtonDrawable mHomeDefaultIcon;
// add start
private KeyButtonDrawable mScreenshotIcon;
private KeyButtonDrawable mNavPowerIcon;
// end ...public NavigationBarView(Context context, AttributeSet attrs) {super(context, attrs);...mButtonDispatchers.put(R.id.home, new ButtonDispatcher(R.id.home));// add startmButtonDispatchers.put(R.id.screenshot, new ButtonDispatcher(R.id.screenshot));mButtonDispatchers.put(R.id.nav_power, new ButtonDispatcher(R.id.nav_power));// end ...
}// add start
public ButtonDispatcher getScreenshotButton() {return mButtonDispatchers.get(R.id.screenshot);
}public ButtonDispatcher getNavPowerButton() {return mButtonDispatchers.get(R.id.nav_power);
}
// end...private void updateIcons(Configuration oldConfig) {...if (orientationChange || densityChange || dirChange) {mBackIcon = getBackDrawable();}// add startmScreenshotIcon = getDrawable(R.drawable.ic_sysbar_screenshot_button);mNavPowerIcon = getDrawable(R.drawable.ic_sysbar_power_button);// end
}...public void updateNavButtonIcons() {...getHomeButton().setImageDrawable(homeIcon);getBackButton().setImageDrawable(backIcon);// add startgetScreenshotButton().setImageDrawable(mScreenshotIcon);getNavPowerButton().setImageDrawable(mNavPowerIcon);// end...
}

1.5 设置监听事件

  • frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarFragment.java
import android.os.SystemClock; // add startprivate static final long AUTODIM_TIMEOUT_MS = 2250;
// add start
private static final long SCREENSHOT_TIME_INTERVAL = 3000;
private long mLastClickScreenshotTime = 0;
// endprivate void prepareNavigationBarView() {mNavigationBarView.reorient();...// add startButtonDispatcher screenshotButton = mNavigationBarView.getScreenshotButton();screenshotButton.setOnClickListener(this:: screenshotClick);screenshotButton.setVisibility(View.VISIBLE);ButtonDispatcher navPowerButton = mNavigationBarView.getNavPowerButton();navPowerButton.setOnClickListener(this:: navPowerClick);navPowerButton.setVisibility(View.VISIBLE);// end
}...// add start
private void navPowerClick(View v) {Intent intent=new Intent("android.intent.action.NAV_POWER");getContext().sendBroadcast(intent);
}private void screenshotClick(View v) {long nowTime = SystemClock.elapsedRealtime();if (nowTime - mLastClickScreenshotTime < SCREENSHOT_TIME_INTERVAL) {return;}Intent intent=new Intent("android.intent.action.SCREENSHOT");getContext().sendBroadcast(intent);mLastClickScreenshotTime = nowTime;
}
// end

1.6 截屏和电源键功能实现

  • frameworks/base/services/core/java/com/android/server/policy/PhoneWindowManager.java
 @Overridepublic void init(Context context, IWindowManager windowManager,WindowManagerFuncs windowManagerFuncs) {...// add start// register for nav_power click broadcastsfilter=new IntentFilter();filter.addAction("android.intent.action.NAV_POWER");context.registerReceiver(mNavPowerReceiver, filter);// register for screenshot broadcastsfilter=new IntentFilter();filter.addAction("android.intent.action.SCREENSHOT");context.registerReceiver(mScreenshotReceiver, filter);// end...
}// add start
BroadcastReceiver mScreenshotReceiver = new BroadcastReceiver() {@Overridepublic void onReceive(Context context, Intent intent) {mHandler.post(mScreenshotRunnable);}
};BroadcastReceiver mNavPowerReceiver = new BroadcastReceiver() {@Overridepublic void onReceive(Context context, Intent intent) {showGlobalActionsInternal();}
};
// end

底下的patch中有Settings中添加延时截屏和控制图标显示开关的修改
传送门

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CEO对今天的CIO们真正的要求是什么?

在当今数字化和信息时代&#xff0c;企业的首席信息官&#xff08;CIO&#xff09;的角色变得至关重要。CIO不仅需要具备深厚的技术知识&#xff0c;还需要在商业战略、创新和领导力方面展现出卓越的能力。作为企业的首席执行官&#xff08;CEO&#xff09;&#xff0c;他们对C…

wangzherongyao PM

第一场&#xff0c;对面没前排唯一的亚瑟也是输出&#xff0c;两法师&#xff0c;压力不大&#xff0c;黄忠打这类阵容就是砍瓜切菜&#xff0c; 本人对百里守约没啥好感&#xff0c;因为百里、墨子、钟馗这类英雄纯属技能概率英雄还要看对面脸 第二场&#xff1a; 9分钟前一切…

前端做excel的录入解析,将excel的数据传给后端,显示在页面上。

具体的流程如图所示&#xff1a; 1.点击excel录入按钮 2.打开弹框 3.点击上传按钮&#xff0c;会自动打开计算机本地文件&#xff0c;选择想上传的文件&#xff0c;点击打开 4.会将excel的数据解析成一个表格&#xff0c;可以在表格中做删除操作&#xff0c;点击确定 5.将exc…

Mac的docker安装redis

Mac的docker安装redis 1、docker search redis NAME DESCRIPTION STARS OFFICIAL AUTOMATED redis Redis is an open source key-value store that… 12205 …

七大排序算法——快速排序,通俗易懂的思路讲解与图解(完整Java代码)

文章目录 一、排序的概念排序的概念排序的稳定性七大排序算法 二、快速排序核心思想Hoare法挖坑法前后指针法(选学) 三、性能分析四、算法优化优化基准的选取优化少量数据时的排序方案优化后的完整代码 五、七大排序算法 一、排序的概念 排序的概念 排序&#xff1a;所谓排序…

DNS协议解析原理

0. 前言 为了保证网址的正常访问&#xff0c;域名解析协议&#xff08;DNS&#xff09;其实在背后做出了很多努力&#xff0c;本文将透彻讲解 DNS 协议的原理&#xff0c;了解我们每天都在接触的网址到底是怎么工作的。 1. 什么是 DNS 协议 在学习 DNS 协议之前&#xff0c;我…

前端uni-app自定义精美全端复制文本插件,支持全端文本复制插件 可设置复制按钮颜色

随着技术的发展&#xff0c;开发的复杂度也越来越高&#xff0c;传统开发方式将一个系统做成了整块应用&#xff0c;经常出现的情况就是一个小小的改动或者一个小功能的增加可能会引起整体逻辑的修改&#xff0c;造成牵一发而动全身。 通过组件化开发&#xff0c;可以有效实现…

一场内容生产的革命 :从PGC、UGC到AIGC

1 概念解读 1.1 什么是PGC&#xff1f; PGC 是指专业生成内容&#xff08;Professional Generated Content&#xff09;&#xff0c;它指的是由专业的内容创作者或团队进行创作、编辑和发布的内容。PGC创作方式起源于传统媒体时代&#xff0c;如报纸、杂志、电视和电影等&…

【沐风老师】3DMAX灯光放置插件LightPlacer使用方法教程

3DMAX灯光放置插件LightPlacer使用方法 3DMAX灯光放置插件LightPlacer&#xff0c;用于3dMax放置和管理灯光的插件&#xff0c;可以在3dMax中一键制作所需的灯光&#xff0c;且通过插件创建出来的灯光属性可以在该面板下进行直接修改&#xff0c;并不需要切换至堆栈。该插件的有…

城市餐饮油烟的监测与治理

摘要&#xff1a;为控制餐饮油烟污染&#xff0c;改善城市大气污染和生态环境&#xff0c;针对城市餐饮油烟污染现状&#xff0c;提出相应的治理政策。加快餐饮油烟污染立法进度&#xff0c;推进相关法律法规修订&#xff0c;加大油烟污染执法力度&#xff1b;维护清洗油烟净化…

MySQL(备份还原索引视图入门)

文章目录 第一节 备份和还原1、题目2、题目作答 第二节 索引1.题目2.题目作答 第三节 视图1 题目2 题目作答 第一节 备份和还原 1、题目 CREATE DATABASE beifen;use beifen;CREATE TABLE books(bk_id INT NOT NULL PRIMARY KEY,bk_title VARCHAR(50) NOT NULL,copyright YEA…

MOVEit再现新漏洞,多个版本受影响

今年6月&#xff0c;文件共享工具MOVEit Transfer曾曝出SQL 注入漏洞&#xff0c;能让远程攻击者访问其数据库并执行任意代码。最近&#xff0c;MOVEit Transfer 母公司Progress Software又披露了三个新漏洞。 这三个漏洞分别是 CVE-2023-36932、CVE-2023-36933 和 CVE-2023-36…