1.导航栏添加控件:
这个对于Android开发的小菜一碟,这里直接上代码略过,
重点放在后期各种事件的处理。
添加控件
diff --git a/packages/SystemUI/res/layout-sw600dp/navigation_bar.xml b/packages/SystemUI/res/layout-sw600dp/navigation_bar.xml
index b576dfa..e275fb1 100755
--- a/packages/SystemUI/res/layout-sw600dp/navigation_bar.xml
+++ b/packages/SystemUI/res/layout-sw600dp/navigation_bar.xml
@@ -108,6 +108,18 @@
android:visibility="invisible"
systemui:keyCode="24"
/>
+
+ <com.android.systemui.statusbar.policy.KeyButtonView android:id="@+id/hide"
+ android:layout_width="120dp"
+ android:layout_height="match_parent"
+ android:layout_weight="0"
+ android:paddingLeft="0dp"
+ android:paddingRight="0dp"
+ android:scaleType="centerInside"
+ android:src="@drawable/ic_sysbar_hide_down"
+ android:clickable="true"
+ />
+
<Space
android:layout_width="match_parent"
android:layout_height="match_parent"
@@ -288,6 +300,18 @@
android:visibility="invisible"
systemui:keyCode="24"
/>
+
+ <com.android.systemui.statusbar.policy.KeyButtonView android:id="@+id/hide"
+ android:layout_width="84dp"
+ android:layout_height="match_parent"
+ android:layout_weight="0"
+ android:paddingLeft="0dp"
+ android:paddingRight="0dp"
+ android:scaleType="centerInside"
+ android:src="@drawable/ic_sysbar_hide_down"
+ android:clickable="true"
+ />
+
<Space
android:layout_width="match_parent"
android:layout_height="match_parent"
初始化控件
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/Nav
index 68973e6..84cc3b4 100755
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java
@@ -77,7 +77,7 @@ public class NavigationBarView extends LinearLayout {
int mDisabledFlags = 0;
int mNavigationIconHints = 0;
- private Drawable mBackIcon, mBackLandIcon, mBackAltIcon, mBackAltLandIcon;
+ private Drawable mBackIcon, mBackLandIcon, mBackAltIcon, mBackAltLandIcon,down;
private Drawable mRecentIcon;
private Drawable mRecentLandIcon;
@@ -269,6 +269,10 @@ public class NavigationBarView extends LinearLayout {
public View getScreenshotButton(){
return mCurrentView.findViewById(R.id.screenshot);
}
+ //by lxs
+ public View gethideButton() {
+ return mCurrentView.findViewById(R.id.hide);
+ }
private void getIcons(Resources res) {
mBackIcon = res.getDrawable(R.drawable.ic_sysbar_back);
@@ -278,6 +282,13 @@ public class NavigationBarView extends LinearLayout {
mRecentIcon = res.getDrawable(R.drawable.ic_sysbar_recent);
mRecentLandIcon = mRecentIcon;
}
+ //by lxs
+ public void downIcons(Resources res) {
+ ((ImageView)gethideButton()).setImageDrawable(res.getDrawable(R.drawable.ic_sysbar_hide_down));
+ }
+ public void upIcons(Resources res) {
+ ((ImageView)gethideButton()).setImageDrawable(res.getDrawable(R.drawable.ic_sysbar_hide_up));
+ }
上面downIcons()和upIcons()只是对外提供一个接口来改变本控件图片状态,这是我做其他项目时对于该控件的状态处理,可忽略,后面略过
2.事件处理
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java
index 0c47736..80ad395 100755
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java
@@ -1651,13 +1651,13 @@ final Object mScreenshotLock = new Object();
+ mNavigationBarView.gethideButton().setOnTouchListener(mHideTouchListener);
mNavigationBarView.getRecentsButton().setOnTouchListener(mRecentsPreloadOnTouchListener);
mNavigationBarView.getRecentsButton().setLongClickable(true);
mNavigationBarView.getRecentsButton().setOnLongClickListener(mLongPressBackRecentsListener);
@@ -2700,9 +2700,21 @@ private String popupAppName = null;
dialog.dismiss();
}
};
-
-
-
+ //by lxs stsrt
+ private View.OnClickListener ClickListener = new View.OnClickListener() {
+ public void onClick(View v) {
+ Log.d("lxs","短按事件");
+ }
+ };
+ private View.OnLongClickListener LongListener =new View.OnLongClickListener() {
+ @Override
+ public boolean onLongClick(View v) {
+ Log.d("lxs","长按事件");
+ return true;
+ }
+ };
@@ -2710,8 +2722,10 @@
+ private long mLastLockToAppLongPresslxs;
+ private long time = System.currentTimeMillis();
+ private View.OnTouchListener mHideTouchListener = new View.OnTouchListener() {
+ private String popupAppName = null;
+ public boolean onTouch(View v, MotionEvent event) {
+ int action = event.getAction() & MotionEvent.ACTION_MASK;
+ if (action == MotionEvent.ACTION_DOWN) {
+ Log.d("lxs","onTouch screenshot ACTION_DOWN");
+ mLastLockToAppLongPresslxs=System.currentTimeMillis();
//此处可添加手指一触摸按键就响应的事件
+ } else if (action == MotionEvent.ACTION_CANCEL) {
+ } else if (action == MotionEvent.ACTION_UP) {
+ //此处来判断是否是长按还是短按事件
+ time = System.currentTimeMillis();
+ if ((time - mLastLockToAppLongPresslxs) < 1000) {
+ if(mContext.getResources().getConfiguration().enableMultiWindow()){
+ //add by huangjc for Multi ScreenShot
+ if(dialog!=null)
+ dialog.dismiss();
+ showSingleChoiceButton();
+ }else {
+ Intent intent = new Intent("rk.android.screenshot.action");
+ mContext.sendBroadcast(intent);
+ }
+ Log.d("lxs","onTouch screenshot ACTION_UP=======短按");
+ }else{
+ Intent intent1 = new Intent(Intent.ACTION_MAIN);
+ intent1.setClassName("com.android.settings", "com.android.settings.Settings");
+ intent1.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+ mContext.startActivity(intent1);
+ Log.d("lxs","onTouch screenshot ACTION_UP=======长按");
+ }
+ }
+ return false;
+ }
+ };
//$_rbox_$_modify_$_huangjc,add add/remove bar button
private View.OnTouchListener mHidebarPreloadOnTouchListener = new View.OnTouchListener() {
如上,我原先是想添加3个方法(OnClickListener,OnLongClickListener和OnTouchListener)来做处理,
后来发现OnLongClickListener被上层拦截了,处理比较麻烦,所以我就用OnTouchListener来用按键时长来判断长按短按,这样两个时间相减得的时间就是按键时长
通过按键时长来控制是否长按还是短按,如上代码是实现了短按截图,长按1S以上进入Setting,
此处还可以做音量短按加减一格和长按快速加减以及其他。
注意按键事件后retrun的返回值,具体了解事件分发,这个很有趣,有兴趣的可以交流。这个只是在导航栏添做的处理,如需其他地方处理事件用OnClickListener和OnLongClickListener也是可以的。