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

这篇具有很好参考价值的文章主要介绍了Android11.0 导航栏添加图标截屏。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

需求: 导航栏添加截屏和电源键图标,控制截屏和用于设备重启关机功能。设置中添加延时截屏和控制截屏图标显示开关。
Android11.0 导航栏添加图标截屏,系统修改,RK11.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.KeyButtonView
    xmlns: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.KeyButtonView
    xmlns: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">
  <path
      android: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">
  <path
      android: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 start
    mButtonDispatchers.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 start
	mScreenshotIcon = 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 start
	getScreenshotButton().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 start

private static final long AUTODIM_TIMEOUT_MS = 2250;
// add start
private static final long SCREENSHOT_TIME_INTERVAL = 3000;
private long mLastClickScreenshotTime = 0;
// end

private void prepareNavigationBarView() {
     mNavigationBarView.reorient();
     ...
     // add start
     ButtonDispatcher 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
 @Override
 public void init(Context context, IWindowManager windowManager,
     WindowManagerFuncs windowManagerFuncs) {
     ...
     // add start
     // register for nav_power click broadcasts
     filter=new IntentFilter();
     filter.addAction("android.intent.action.NAV_POWER");
     context.registerReceiver(mNavPowerReceiver, filter);
     
     // register for screenshot broadcasts
     filter=new IntentFilter();
     filter.addAction("android.intent.action.SCREENSHOT");
     context.registerReceiver(mScreenshotReceiver, filter);
     // end
     ...
}

// add start
BroadcastReceiver mScreenshotReceiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
        mHandler.post(mScreenshotRunnable);
    }
};

BroadcastReceiver mNavPowerReceiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
        showGlobalActionsInternal();
    }
};
// end

底下的patch中有Settings中添加延时截屏和控制图标显示开关的修改
传送门文章来源地址https://www.toymoban.com/news/detail-551789.html

到了这里,关于Android11.0 导航栏添加图标截屏的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Android11.0 launcher修改为单层

    OS: RK3568 Android11.0 现在的产品基本都是按照手机样式去做,所以需要把系统默认的Launcher样式,去掉抽屉改为单层显示,也就是把所有的app添加到workspace中。 以下修改是在设备横屏模式下进行 。 1.添加一个宏开关控制Launcher单双层显示 源码: /packages/apps/Launcher3/src/com/android/

    2024年02月08日
    浏览(58)
  • Android 11.0 framework关于systemUI定制之导航栏透明背景的功能实现

    在11.0的系统rom产品定制化开发中,在对于系统原生SystemUI的导航栏背景在沉浸式导航栏的 情况下默认是会随着背景颜色的变化而改变的,在一些特定背景下导航栏的背景也是会改变的,所以由于产品开发需要 要求需要设置导航栏背景为透明的,所以就需要在Activity创建的时候

    2024年02月04日
    浏览(50)
  • Android 11.0 系统开机自启动第三方app

      在11.0的系统rom定制化开发中,由于有些第三方app,需要在接收到开机广播后,启动app,但是在10.0以后第三方app就接收不到开机广播了 只有系统app才可以接收到开机广播了,所以在app内通过接收开机广播自启动就没法实现了 这就需要在系统中添加监听开机完成广播的功能,

    2024年02月16日
    浏览(86)
  • Android11.0 生成系统签名.jks文件并对Apk进行签名

    V2签名 对应用手动进行系统签名,需要platform.pk8,platform.x509.pem,signapk.jar这三个文件,应用的AndroidManifest.xml中需要添加 android:sharedUserId=“android.uid.system” ,然后输入以下命令就可得到签名后的apk文件: 如果你的应用 targetSdkVersion=30 ,在7.0以上的设备上安装不成功,会报以

    2024年02月07日
    浏览(56)
  • Android11.0系统中实现静默安装并启动App以及静默卸载

    本文描述Android11中通过修改系统PackageInstaller应用支持静默安装App,并启动安装的App。 PackageInstaller是系统中专门负责app安装的App,静默安装逻辑添加到此应用中,应用所在路径 /frameworks/base/packages/PackageInstaller/src/com/android/packageinstaller/ 添加SilenceInstallManager,路径为 /frameworks

    2024年02月03日
    浏览(68)
  • Android 11.0 系统限制上网系统之iptables用IOemNetd实现创建子链功能的实现

    在11.0的系统rom定制化开发中,对于限制系统上网功能中,需要在system中netd网络这块的产品开发中,会要求设置屏蔽ip地址之内的功能, liunx中iptables命令也是比较重要的,接下来就来在IOemNetd这块实现创建子链的相关功能 在android原生系统中,iptables是在网络过滤包模块非常重

    2024年02月13日
    浏览(96)
  • Android 11.0 系统限制上网系统之iptables用IOemNetd实现删除子链功能的实现

    在11.0的系统rom定制化开发中,对于限制系统上网功能中,在system中netd网络这块的产品开发中,会要求设置屏蔽ip地址之内的功能, liunx中iptables命令也是比较重要的,接下来就来在IOemNetd这块实现删除创建子链的相关功能 在android原生系统中,iptables是在网络过滤包模块非常重

    2024年02月16日
    浏览(50)
  • Android11.0 系统限制上网系统之iptables用IOemNetd实现app上网黑名单的实现

    在11.0的系统rom定制化开发中,对于系统限制网络的使用,在system中netd网络这块的产品需要中,会要求设置屏蔽某个app上网的功能, liunx中iptables命令也是比较重要的,接下来就来在IOemNetd这块实现app上网黑名单的的相关功能,就是在 系统中只能不允许某个app上网,就是除了这

    2024年02月15日
    浏览(50)
  • Android 11.0 系统限制上网系列之iptables用IOemNetd实现app某个时间段禁止上网的功能实现

    在11.0的系统rom定制化开发中,对于系统限制网络的使用,在system中netd网络这块的产品需要中,会要求设置app某个时间段禁止上网的功能, liunx中iptables命令也是比较重要的,接下来就来在IOemNetd这块实现app某个时间段禁止上网的的相关功能,就是在 系统中只能允许某个app某个

    2024年02月14日
    浏览(52)
  • Android13系统导航栏添加隐藏导航栏功能按钮

    最近有个项目,客户要求在底部导航栏中添加一个可以隐藏整个导航栏的功能按钮,效果如下图: 具体方法如下: 1. 在frameworks/base做如下修改: 2. 上面修改中有一行代码android:src=\\\"@drawable/ic_sysbar_hide\\\"引用了一个ic_sysbar_hide.xml文件,该文件内容如下:其实就是那个隐藏按钮的

    2024年04月23日
    浏览(65)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包