导航栏添加控件实现点击和长按事件

来源:互联网 发布:微信撞库软件 编辑:程序博客网 时间:2024/06/16 03:02

1.导航栏添加控件:
这个对于Android开发的小菜一碟,这里直接上代码略过,
重点放在后期各种事件的处理。
添加控件

diff --git a/packages/SystemUI/res/layout-sw600dp/navigation_bar.xml b/packages/SystemUI/res/layout-sw600dp/navigation_bar.xmlindex 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/Navindex 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.javaindex 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也是可以的。
0 0
原创粉丝点击