Android12源码 导航栏增加虚拟关机按钮实现按钮功能

1、导航栏图标的布局文件位置 frameworks/base/packages/SystemUI/res/values-sw600dp/config.xml中搜素config_navBarLayout

2、导航栏布局文件同时为了适应不同大小的显示屏,同时还有其他的布局文件,位置分别是

frameworks/base/packages/SystemUI/res/values/config.xml中搜索config_navBarLayout

frameworks/base/packages/SystemUI/res/values-sw372dp/config.xml中搜config_navBarLayout

frameworks/base/packages/SystemUI/res/values-sw400dp/config.xml中搜config_navBarLayout

frameworks/base/packages/SystemUI/res/values-sw900dp/config.xml中搜config_navBarLayout

3、增加相关字符,在frameworks/base/packages/SystemUI/res/values/strings.xml最后增加

    <!-- Content description of the power button for accessibility (not shown on the screen). [CHAR LIMIT=NONE] -->
    <string name="accessibility_power">Power</string>

4、增加按键的layout,选择在frameworks/base/packages/SystemUI/res/layout下新建一个power.xml文件

<?xml version="1.0" encoding="utf-8"?>
<com.android.systemui.navigationbar.buttons.KeyButtonView
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:systemui="http://schemas.android.com/apk/res-auto"
    android:id="@+id/power"
    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_power"
    android:paddingStart="@dimen/navigation_key_padding"
    android:paddingEnd="@dimen/navigation_key_padding"
    />

其中, keyCode是按键值, 若不想处理为按键, 则置为0

5、 在frameworks/base/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBarInflaterView.java新增如下

public static final String POWER = "power";

 NavigationBarInflaterView.java里 View createView(String buttonSpec, ViewGroup parent, LayoutInflater inflater)下新增如下

else if(POWER.equals(button)){
            v = inflater.inflate(R.layout.power, parent, false);
        }

 6、在frameworks/base/packages/SystemUI/res/values-sw600dp/config.xml中搜素config_navBarLayout中增加power

7、在frameworks/base/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBar.java的private void prepareNavigationBarView()新增如下

//添加点击监听并是按钮可见
ButtonDispatcher powerButton=mNavigationBarView.getPowerButton();
powerButton.setOnClickListener(mPowerClickListener);
//powerButton.setOnTouchListener(mPowerTouchListener);
powerButton.setVisibility(View.VISIBLE);

 NavigationBar.java里新增如下

//点击事件
private View.OnClickListener mPowerClickListener = new View.OnClickListener(){
		public void onClick(View v){
			Intent intent = new Intent("android.intent.action.POWER_MENU");
			mContext.sendBroadcast(intent);
		}
	};

8、 在frameworks/base/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBarView.java下新增如下

private KeyButtonDrawable mPowerIcon;

 NavigationBarView.java里public NavigationBarView(Context context, AttributeSet attrs)下新增如下

//添加到集合
mButtonDispatchers.put(R.id.power, new ButtonDispatcher(R.id.power));

 NavigationBarView.java里新增如下

//外部调用使用
public ButtonDispatcher getPowerButton() {
        return mButtonDispatchers.get(R.id.power);
    }

  NavigationBarView.java里private void updateIcons(Configuration oldConfig)下新增如下

//虚拟按钮图标样式
mPowerIcon = getDrawable(R.drawable.ic_settings_power);

NavigationBarView.java里 public void updateNavButtonIcons()下新增如下

getPowerButton().setImageDrawable(mPowerIcon);

9、在frameworks/base/services/core/java/com/android/server/policy/PhoneWindowManager.java中public void init(Context context, IWindowManager windowManager,WindowManagerFuncs windowManagerFuncs)下新增如下

//设置广播监听事件
IntentFilter ifPower = new IntentFilter("android.intent.action.POWER_MENU");
            context.registerReceiver(new BroadcastReceiver(){
            @Override
                public void onReceive(Context context, Intent intent) {
                //show global actions dialog
                 showGlobalActionsInternal();
             }
        }, ifPower);

 

10、修改完成之后保存编译 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值