文章目录
在Android设备中,左/右滑两次会出现一个箭头然后退出Activity页面,有些Activity页面不想出现箭头及退出.
以下是对项目中的别人已实现的代码解析.
在config.xml中配置要禁用的Activity
packages/apps/Launcher3/quickstep/res/values/config.xml
resources中gesture_blocking_activitiesg添加Activity到item中,此例中为GestureSandboxActivity
<resources>
<string name="overscroll_plugin_factory_class" translatable="false" />
<string name="task_overlay_factory_class" translatable="false"/>
<!-- Activities which block home gesture -->
<string-array name="gesture_blocking_activities" translatable="false">
<item>com.android.launcher3/com.android.quickstep.interaction.GestureSandboxActivity</item>
</string-array>
后面所有代码都在这个java文件中
frameworks/base/packages/SystemUI/src/com/android/systemui/navigationbar/gestural/EdgeBackGestureHandler.java
config.xml中禁用内容读出来
EdgeBackGestureHandler构造函数中把config.xml中内容读出来,把禁用的Activity读到mGestureBlockingActivities.contains变量中.
// Activities which should not trigger Back gesture.
private final List<ComponentName> mGestureBlockingActivities = new ArrayList<>();
ComponentName recentsComponentName = ComponentName.unflattenFromString(
context.getString(com.android.internal.R.string.config_recentsComponentName));
if (recentsComponentName != null) {
String recentsPackageName = recentsComponentName.getPackageName();
PackageManager manager = context.getPackageManager();
try {
Resources resources = manager.getResourcesForApplication(
manager.getApplicationInfo(recentsPackageName,
PackageManager.MATCH_UNINSTALLED_PACKAGES
| PackageManager.MATCH_DISABLED_COMPONENTS
| PackageManager.GET_SHARED_LIBRARY_FILES));
int resId = resources.getIdentifier(
"gesture_blocking_activities", "array", recentsPackageName);
if (resId == 0) {
Log.e(TAG, "No resource found for gesture-blocking activities");
} else {
String[] gestureBlockingActivities = resources.getStringArray(resId);
for (String gestureBlockingActivity : gestureBlockingActivities) {
mGestureBlockingActivities.add(
ComponentName.unflattenFromString(gestureBlockingActivity));
}
}
} catch (NameNotFoundException e) {
Log.e(TAG, "Failed to add gesture blocking activities", e);
}
}
函数判断是否要对当前Activity进行手势禁用
isGestureBlockingActivityRunning函数用于判断是否要对当前Activity进行手势禁用.
private boolean isGestureBlockingActivityRunning() {
ActivityManager.RunningTaskInfo runningTask =
ActivityManagerWrapper.getInstance().getRunningTask();
ComponentName topActivity = runningTask == null ? null : runningTask.topActivity;
if (topActivity != null) {
mPackageName = topActivity.getPackageName();
} else {
mPackageName = "_UNKNOWN";
}
return topActivity != null && mGestureBlockingActivities.contains(topActivity);
}
监听应用任务变化,判断当前是否要禁用手势
mGestureBlockingActivityRunning为true则要禁用.
private boolean mGestureBlockingActivityRunning;
private TaskStackChangeListener mTaskStackListener = new TaskStackChangeListener() {
@Override
public void onTaskStackChanged() {
mGestureBlockingActivityRunning = isGestureBlockingActivityRunning();
}
@Override
public void onTaskCreated(int taskId, ComponentName componentName) {
if (componentName != null) {
mPackageName = componentName.getPackageName();
} else {
mPackageName = "_UNKNOWN";
}
}
@Override
public void onActivityPinned(String packageName, int userId, int taskId, int stackId) {
mIsInPipMode = true;
}
@Override
public void onActivityUnpinned() {
mIsInPipMode = false;
}
};
禁用
在onMotionEvent函数中,设置mAllowGesture为false就会禁用手势,其中 mGestureBlockingActivityRunning为true时会设置mAllowGesture为false,这个变量赋值后面会提到.
private void onMotionEvent(MotionEvent ev) {
int action = ev.getActionMasked();
if (action == MotionEvent.ACTION_DOWN) {
if (DEBUG_MISSING_GESTURE) {
Log.d(DEBUG_MISSING_GESTURE_TAG, "Start gesture: " + ev);
}
// Verify if this is in within the touch region and we aren't in immersive mode, and
// either the bouncer is showing or the notification panel is hidden
mInputEventReceiver.setBatchingEnabled(false);
mIsOnLeftEdge = ev.getX() <= mEdgeWidthLeft + mLeftInset;
mMLResults = 0;
mLogGesture = false;
mInRejectedExclusion = false;
boolean isWithinInsets = isWithinInsets((int) ev.getX(), (int) ev.getY());
mAllowGesture = !mDisabledForQuickstep && mIsBackGestureAllowed && isWithinInsets
&& !mGestureBlockingActivityRunning
&& !QuickStepContract.isBackGestureDisabled(mSysUiFlags)
&& isWithinTouchRegion((int) ev.getX(), (int) ev.getY());
if (mAllowGesture) {
mEdgeBackPlugin.setIsLeftPanel(mIsOnLeftEdge);
mEdgeBackPlugin.onMotionEvent(ev);
}
安卓手势导航
安卓手势导航是一种通过手指在手机屏幕上滑动、轻触等手势来进行操作的方式,它在安卓系统中越来越受到用户的欢迎,以下是关于它的详细介绍:
优点
- 便捷性:用户可以快速完成常用操作,避免了对实体按键的依赖。
屏幕空间利用:去除传统的导航栏后,能获得更大的屏幕显示空间,享受更好的视觉体验。 - 时尚感:手势操作显得更加现代和时尚,符合当前的科技潮流。
启用方法
不同品牌的安卓手机设置手势导航的方式可能有所差异,但大致步骤相似:
- 打开设置:找到并点击手机主屏幕上的 “设置” 图标,进入设置菜单。
找到 “系统” 选项:在设置菜单中,向下滚动,找到 “系统” 或者 “关于手机” 选项,点击进入。 - 选择 “手势” 或 “导航”:在 “系统” 设置中,可能会看到 “手势” 或 “导航” 选项。
- 启用手势导航:在手势或导航设置中,选择启用手势导航。部分手机可能会提供不同的手势风格,可以根据个人喜好进行选择。
- 学习手势操作:启用手势导航后,系统可能会引导用户学习常用的手势操作,可根据提示进行练习以便熟悉这些手势。
常用手势
- 返回:从屏幕的边缘向内滑动。
- 主页:从屏幕底部向上滑动并停顿,或者直接快速向上滑动。
- 最近任务:从屏幕底部向上滑动并稍微停留,会看到最近使用的应用列表。
- 快速切换应用:在显示的最近任务中,左右滑动可以快速切换不同的应用程序。
品牌特性
- 华为:用户可以通过 “设置”>“系统”>“手势控制” 进行调整,还能设置自定义手势,如屏幕截图和应用快速启动。
- 小米:用户可前往 “设置”>“全屏手势” 进行启用和调整,其手势功能包括长按返回和快速切换应用的便捷操作。
- 三星:用户可以在 “设置”>“显示”>“导航条” 中进行设置,三星设备支持多种手势操作,包括快速启动相机等功能。
注意事项
- 适应期:初次使用手势导航的用户可能需要一定时间来适应新的操作方式。
- 保护膜影响:使用保护膜时要确保其不影响手势的灵敏度,因为手势操作常常涉及到边缘的滑动。
- 误操作:在使用手势导航时,尤其是在不平稳的环境中,可能会出现误操作。
作者:帅得不敢出门 csdn原创谢绝第三方网站转载及收录