Android 9.0pie에서는 빠른 시작 프로그램에 따라 내비게이션 표시줄의 동작이 달라집니다.
                                            
                                                
                                                
                                                
                                                
                                                
                                                 10114 단어  Android
                    
 나는 공교롭게도 돈이 없어서 픽셀3를 사지 못했지만, 항간에 떠도는 소문에 의하면
Pixel3 탐색 모음입니다.
 그런 것 같습니다.
그리고 설정을 통해 이 일대를 바꿀 수 있을 것 같다.
System UI 이 시스템 응용 프로그램은 가정 응용 프로그램에 따라 행동이 달라집니다?!그게 마음에 걸려서 오랜만에 소스를 불렀어요.
사전에 다 써서 완전히 자기가 쓴 필기다.
설정으로 바꿀 수 있는 곳.
수중에 실제 단말기는 없고 시뮬레이터만 있다
https://android.benigumo.com/20180809/pie-navigation-bar/
보다
 이 화면에 미끄러질 때의 행동을 바꾸는 설정이 있는 것 같다.
http://androidxref.com/9.0.0_r3/xref/packages/apps/Settings/res/xml/gestures.xml
화면 설정의 자원을 보면
48    <Preference
49        android:key="gesture_swipe_up_input_summary"
50        android:title="@string/swipe_up_to_switch_apps_title"
51        android:fragment="com.android.settings.gestures.SwipeUpGestureSettings"
52        settings:controller="com.android.settings.gestures.SwipeUpPreferenceController" />
있습니다.설정할 수 있는 단말기와 설정할 수 없는 단말기의 차이는?
44    static boolean isGestureAvailable(Context context) {
45        if (!context.getResources().getBoolean(R.bool.config_swipe_up_gesture_setting_available)) {
46            return false;
47        }
48
49        final ComponentName recentsComponentName = ComponentName.unflattenFromString(
50                context.getString(R.string.config_recentsComponentName));
51        final Intent quickStepIntent = new Intent(ACTION_QUICKSTEP)
52                .setPackage(recentsComponentName.getPackageName());
53        if (context.getPackageManager().resolveService(quickStepIntent,
54                PackageManager.MATCH_SYSTEM_ONLY) == null) {
55            return false;
56        }
57        return true;
58    }
두 가지 조건이 있다.첫째, config_swipe_up_gesture_setting_available는 단말기의 config에서 안 된다고 합니다. 정말 안 됩니다.
http://androidxref.com/9.0.0_r3/xref/frameworks/base/core/res/res/values/config.xml#3448, 기본값은 false일 수 있습니다.
3444    <!-- Whether or not swipe up gesture is enabled by default -->
3445    <bool name="config_swipe_up_gesture_default">false</bool>
3446
3447    <!-- Whether or not swipe up gesture's opt-in setting is available on this device -->
3448    <bool name="config_swipe_up_gesture_setting_available">false</bool>
두 번째는 좀 복잡해요.config_터미널의 config에recentsComponentName이 있습니다. 거기에recentApps를 표시하는 구성 요소가 적혀 있습니다.(AOSP
com.android.launcher3/com.android.quickstep.RecentsActivity그래서 그 사람과 같은 포장에 속하는 아이Intent.ACTION_QUICKSTEP가 주운 아이라면 OK.(AOSPpackages/apps/Launcher3/quickstep/src/com/android/quickstep/TouchInteractionService.java프레임워크/res의 config입니다.xml과 Launcher3는 모두 단말기 출하 상태이기 때문에 두 번째 if문구가 없어도 되겠죠?그렇게 생각하지만 터미널 배송 상태부터 Launcher3가 ACTION_을 업데이트했습니다.QUICKSTEP를 주워도 틀리지 않으려고 하는 건가요?
SwipeUp Preference Controller는 무엇을 하는 ON/OFF
응용 프로그램의 열기/닫기
SWIPE_UP_TO_SWITCH_APPS_ENABLED에 대한 시스템 설정 값만 설정합니다.http://androidxref.com/9.0.0_r3/xref/packages/apps/Settings/src/com/android/settings/gestures/SwipeUpPreferenceController.java
이 변화를 감시하는 것은 AOSP와 Launcher3입니다.
219        @Override
220        public void onChange(boolean selfChange) {
221            super.onChange(selfChange);
222            mHandler.removeMessages(MSG_SET_SWIPE_UP_ENABLED);
223            mHandler.obtainMessage(MSG_SET_SWIPE_UP_ENABLED, getValue() ? 1 : 0, 0).sendToTarget();
224        }
설정 값 전환을 계기로61    public static TouchController[] createTouchControllers(Launcher launcher) {
62        boolean swipeUpEnabled = OverviewInteractionState.getInstance(launcher)
63                .isSwipeUpGestureEnabled();
64        if (!swipeUpEnabled) {
65            return new TouchController[] {
66                    launcher.getDragController(),
67                    new OverviewToAllAppsTouchController(launcher),
68                    new LauncherTaskViewController(launcher)};
69        }
70        if (launcher.getDeviceProfile().isVerticalBarLayout()) {
71            return new TouchController[] {
72                    launcher.getDragController(),
73                    new OverviewToAllAppsTouchController(launcher),
74                    new LandscapeEdgeSwipeController(launcher),
75                    new LauncherTaskViewController(launcher)};
76        } else {
77            return new TouchController[] {
78                    launcher.getDragController(),
79                    new PortraitStatesTouchController(launcher),
80                    new LauncherTaskViewController(launcher)};
81        }
82    }
이 근처에서 터치 이벤트 처리 프로그램의 클래스 중 어느 것을 사용해야 합니까재평가를 받다.Quickstep
아까부터 자주 나왔던 퀵스텝이라는 단어.그리고 Overview 같은 거.
자꾸 이 녀석이 징그럽다.
SystemUI의 NavigationBarView 근처에서 이러한 소스가 발견되었습니다.
233                if (mIsVertical) {
234                    exceededScrubTouchSlop =
235                            yDiff > NavigationBarCompat.getQuickScrubTouchSlopPx() && yDiff > xDiff;
236                    exceededSwipeUpTouchSlop =
237                            xDiff > NavigationBarCompat.getQuickStepTouchSlopPx() && xDiff > yDiff;
238                    pos = y;
239                    touchDown = mTouchDownY;
240                    offset = pos - mTrackRect.top;
241                    trackSize = mTrackRect.height();
242                } else {
243                    exceededScrubTouchSlop =
244                            xDiff > NavigationBarCompat.getQuickScrubTouchSlopPx() && xDiff > yDiff;
245                    exceededSwipeUpTouchSlop =
246                            yDiff > NavigationBarCompat.getQuickStepTouchSlopPx() && yDiff > xDiff;
247                    pos = x;
248                    touchDown = mTouchDownX;
249                    offset = pos - mTrackRect.left;
250                    trackSize = mTrackRect.width();
251                }
이 부근의 논리로 보면488    private boolean proxyMotionEvents(MotionEvent event) {
489        final IOverviewProxy overviewProxy = mOverviewEventSender.getProxy();
490        event.transform(mTransformGlobalMatrix);
491        try {
492            if (event.getActionMasked() == MotionEvent.ACTION_DOWN) {
493                overviewProxy.onPreMotionEvent(mNavigationBarView.getDownHitTarget());
494            }
495            overviewProxy.onMotionEvent(event);
496            if (DEBUG_OVERVIEW_PROXY) {
497                Log.d(TAG_OPS, "Send MotionEvent: " + event.toString());
498            }
499            return true;
500        } catch (RemoteException e) {
501            Log.e(TAG, "Callback failed", e);
502        } finally {
503            event.transform(mTransformLocalMatrix);
504        }
505        return false;
506    }
NavigationBar에서 보내는 터치 이벤트는 누구나 받아들일 수 있나요?
개인적으로'빠른 시작 프로그램에 따라 네비게이션 표시줄의 행동이 달라진다'고 생각하지만 제3자의 빠른 시작 프로그램이 Pixel Launcher처럼 Recent Apps의 화면을 표시하고 Quickstep를 처리할 수 있을지는 그렇지 않은 것 같다.
257    public OverviewProxyService(Context context) {
258        mContext = context;
259        mHandler = new Handler();
260        mConnectionBackoffAttempts = 0;
261        mRecentsComponentName = ComponentName.unflattenFromString(context.getString(
262                com.android.internal.R.string.config_recentsComponentName));
263        mQuickStepIntent = new Intent(ACTION_QUICKSTEP)
264                .setPackage(mRecentsComponentName.getPackageName());
따라서 터미널 공급업체는 xml 파일에서 config_를 사용할 수 있습니다RecentsComponentName을 결정하는 것만 Quickstep을 처리하는 대상이 됩니다.WebView처럼 조만간 제3자 응용 프로그램에서 열릴 수 있지만 Android 9.0에서는 이런 입이 없다.
총결산
https://www.jianshu.com/p/83ce8731fb13
Reference
이 문제에 관하여(Android 9.0pie에서는 빠른 시작 프로그램에 따라 내비게이션 표시줄의 동작이 달라집니다.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/YusukeIwaki/items/d3b4591819d26b908df9텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
                                
                                
                                
                                
                                
                                우수한 개발자 콘텐츠 발견에 전념
                                (Collection and Share based on the CC Protocol.)