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

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也是可以的。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值