Android客制化------动态控制导航栏与状态栏
来源:互联网 发布:光纤交换机端口 编辑:程序博客网 时间:2024/05/22 05:07
我们可能经常需要根据一些apk(没有源码,只有单纯的一个app)的打开与关闭去动态的显示状态栏与导航栏。甚至去控制状态栏的下拉事件。
需要去实现一点我们首先得了解Android中Activity的生命周期,下面请出谷爹的周期图。
onResume() 此状态下,activity处在前台,用户可以与它进行交互。
这里就是我们需要去动手脚的地方了,我们通过在Android源码中的Activity.java这个类的onResume()方法去加以甄别进而判断是否显示导航栏以及状态栏。因为所有的Activity都会继承自Activity.java。
diff --git a/frameworks/base/core/java/android/app/Activity.java b/frameworks/base/core/java/android/app/Activity.javaindex d6db8c2..d70cf9c 100644--- a/frameworks/base/core/java/android/app/Activity.java+++ b/frameworks/base/core/java/android/app/Activity.java@@ -1092,10 +1092,28 @@ public class Activity extends ContextThemeWrapper * @see #onPostResume * @see #onPause */+ private String kidzone; protected void onResume() { if (DEBUG_LIFECYCLE) Slog.v(TAG, "onResume " + this); getApplication().dispatchActivityResumed(this); mCalled = true;+ + kidzone = getPackageName();+ if(kidzone.equals("你的apk包名") || kidzone.equals("你的apk包名")){+ //发送隐藏广播+ Intent intent = new Intent();+ intent.setAction("xxx");+ intent.putExtra("flag", true);+ this.sendBroadcast(intent);+ }else {+ //发送显示广播+ Intent intent = new Intent();+ intent.setAction("xxx");+ intent.putExtra("flag", false);+ this.sendBroadcast(intent);+ } } /**
同时我们去SystemUI中接收相关广播执行相关动作。
diff --git a/frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java b/frameworks/base/packages/SystemUI/src/com/androidindex a7ef867..78c7ed7 100644--- a/frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java+++ b/frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java@@ -480,7 +480,16 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode { Log.d("screenshot","disable screenshot button"); mNavigationBarView.getScreenshotButton().setVisibility(View.GONE); }- + }else if(action.equals("xxx")){+ boolean flag =intent.getBooleanExtra("flag", false);+ if(flag){+ //此处就是隐藏状态栏以及导航栏 + mStatusBarWindow.setVisibility(View.INVISIBLE);+ mNavigationBarView.setVisibility(View.INVISIBLE);+ }else{+ mStatusBarWindow.setVisibility(View.VISIBLE);+ mNavigationBarView.setVisibility(View.VISIBLE);+ } }else{ takeScreenshot(); }diff --git a/frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowView.java b/frameworks/base/packages/SystemUI/src/com/anindex 4901823..f2cb4cc 100644--- a/frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowView.java+++ b/frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowView.java@@ -33,6 +33,13 @@ import com.android.systemui.R; import com.android.systemui.statusbar.BaseStatusBar; import com.android.systemui.statusbar.policy.NotificationRowLayout;+import android.content.BroadcastReceiver;+import android.content.Intent;+import android.content.IntentFilter;+import android.util.Log; public class StatusBarWindowView extends FrameLayout {@@ -50,6 +57,11 @@ public class StatusBarWindowView extends FrameLayout super(context, attrs); setMotionEventSplittingEnabled(false); setWillNotDraw(!DEBUG); //注册相关广播+ IntentFilter intentFilter = new IntentFilter();+ intentFilter.addAction("xxx");+ context.registerReceiver(new MyBroadcastReciver(), intentFilter); } @Override@@ -85,8 +97,26 @@ public class StatusBarWindowView extends FrameLayout return super.dispatchKeyEvent(event); }+ private boolean flag;+ private class MyBroadcastReciver extends BroadcastReceiver {+ @Override+ public void onReceive(Context context, Intent intent) {+ String action = intent.getAction();+ if (action.equals("xxx")) {+ //得到flag+ flag =intent.getBooleanExtra("flag", false);+ }+ }+ }+ @Override public boolean onInterceptTouchEvent(MotionEvent ev) { //这个地方就是是否能够下拉状态栏啦 + if(flag){ + return true;+ }else{ boolean intercept = false; if (mNotificationPanel.isFullyExpanded() && mScrollView.getVisibility() == View.VISIBLE) { intercept = mExpandHelper.onInterceptTouchEvent(ev);@@ -101,6 +131,7 @@ public class StatusBarWindowView extends FrameLayout cancellation.recycle(); } return intercept;+ } } @Override
不要着急,在这里我们还要进行最后一项工作,此处虽然我们已经达到隐藏的效果了,但是我们会显示一条黑色矩形,也就是导航栏高度的占据整个屏幕的黑色矩形,我们需要去处理一下。
diff --git a/frameworks/base/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java b/frameworks/base/policy/src/com/android/internal/policy/impl/index 6bbd7b3..3c3bef1 100644--- a/frameworks/base/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java+++ b/frameworks/base/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java@@ -111,6 +111,13 @@ import static android.view.WindowManager.LayoutParams.*; import static android.view.WindowManagerPolicy.WindowManagerFuncs.LID_ABSENT; import static android.view.WindowManagerPolicy.WindowManagerFuncs.LID_OPEN; import static android.view.WindowManagerPolicy.WindowManagerFuncs.LID_CLOSED;++import android.content.BroadcastReceiver;+import android.content.Intent;+import android.content.IntentFilter;+import android.util.Log; /** * WindowManagerPolicy implementation for the Android phone UI. This * introduces a new method suffix, Lp, for an internal lock of the@@ -857,6 +864,11 @@ public class PhoneWindowManager implements WindowManagerPolicy { public void init(Context context, IWindowManager windowManager, WindowManagerFuncs windowManagerFuncs) { mContext = context; + IntentFilter intentFilter = new IntentFilter();+ intentFilter.addAction("xxx");+ context.registerReceiver(new MyBroadcastReciver(), intentFilter); mWindowManager = windowManager; mWindowManagerFuncs = windowManagerFuncs; mHeadless = "1".equals(SystemProperties.get("ro.config.headless", "0"));@@ -1000,6 +1012,20 @@ public class PhoneWindowManager implements WindowManagerPolicy { } }+ private boolean Hideflag;+ private class MyBroadcastReciver extends BroadcastReceiver {+ @Override+ public void onReceive(Context context, Intent intent) {+ String action = intent.getAction();+ if (action.equals("xxx")) {+ Hideflag =intent.getBooleanExtra("flag", false);+ }+ }+ }++ /** * Read values from config.xml that may be overridden depending on * the configuration of the device.@@ -5154,6 +5180,29 @@ public class PhoneWindowManager implements WindowManagerPolicy { return 0; }+ Resources res = mContext.getResources();+ if(Hideflag){+ //去除黑色矩形+ mStatusBarHeight = 0;+ mNavigationBarHeightForRotation[mPortraitRotation] =+ mNavigationBarHeightForRotation[mUpsideDownRotation] =0;+ mNavigationBarHeightForRotation[mLandscapeRotation] =+ mNavigationBarHeightForRotation[mSeascapeRotation] = 0;+ }else{+ + mStatusBarHeight =+ res.getDimensionPixelSize(com.android.internal.R.dimen.status_bar_height);+ mNavigationBarHeightForRotation[mPortraitRotation] =+ mNavigationBarHeightForRotation[mUpsideDownRotation] =+ res.getDimensionPixelSize(com.android.internal.R.dimen.navigation_bar_height);+ mNavigationBarHeightForRotation[mLandscapeRotation] =+ mNavigationBarHeightForRotation[mSeascapeRotation] = res.getDimensionPixelSize(+ com.android.internal.R.dimen.navigation_bar_height_landscape);+ + } int tmpVisibility = win.getSystemUiVisibility() & ~mResettingSystemUiFlags & ~mForceClearedSystemUiFlags;
至此我们就大功告成啦。
如有不对的地方,欢迎留言指出,谢谢。
阅读全文
0 0
- Android客制化------动态控制导航栏与状态栏
- Android动态控制状态栏以及系统导航栏显示和隐藏
- Android动态控制状态栏
- 动态控制状态栏显示与隐藏
- 导航栏与状态栏
- 导航栏与状态栏
- 状态栏与底部导航栏
- Android隐藏状态栏、导航栏
- Android 4.4 沉浸式透明状态栏与导航栏
- 兼容 Android 4.4 透明状态栏与导航栏
- 兼容 Android 4.4 透明状态栏与导航栏
- 兼容 Android 4.4 透明状态栏与导航栏
- Android 4.4 沉浸式透明状态栏与导航栏
- Android 沉浸式透明状态栏与导航栏
- 兼容 Android 4.4 透明状态栏与导航栏
- android 自定义状态栏和导航栏分析与实现
- Android 改变statusbar背景-沉浸式状态栏与导航栏
- Android 4.4 沉浸式透明状态栏与导航栏
- window.innerwidth documet.body.clientwidth
- javascript ---- Phaser做引擎小游戏
- Python cmd进入文件夹目录指令
- 将windows下的PLSQL转移到Ubuntu上
- h5移动端兼容开发小结
- Android客制化------动态控制导航栏与状态栏
- GBDT构建组合特征
- 小明的难题
- 关于jxl的一点知识
- 表单
- ORACLE 建库过程总结
- UE4 导出全景图和全景视频
- iOS 允许HTTP请求
- 1.jQuery 入门