Android 9.0pie에서는 빠른 시작 프로그램에 따라 내비게이션 표시줄의 동작이 달라집니다.

10114 단어 Android
Android에 익숙한 내비게이션 표시줄

나는 공교롭게도 돈이 없어서 픽셀3를 사지 못했지만, 항간에 떠도는 소문에 의하면
Pixel3 탐색 모음입니다.

그런 것 같습니다.
그리고 설정을 통해 이 일대를 바꿀 수 있을 것 같다.
  • https://android.benigumo.com/20180809/pie-navigation-bar/
  • https://android.benigumo.com/20190508/android-q-beta3-navigation-bar/
  • 이후 홈 응용 프로그램에 따라 내비게이션의 행동이 달라진다(?)마치.
    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를 표시하는 구성 요소가 적혀 있습니다.(AOSPcom.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                }
    
    이 부근의 논리로 보면
  • 24dp 이상 위로 이동하면 NavigationBar가 Launcher3에 "quickstep 처리하십시오."
  • 좌우로 24dp 이상 이동하면 NavigationBar가 Launcher3에게 "quick scrub를 처리하십시오."
  • 이런 느낌?그리고 원래 Motion Event는 기본적으로 Navigation Bar에서 Launcher 3로 발송되는 거예요?
    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에서는 이런 입이 없다.
     

    총결산

  • NavigationBarView는 Launcher3(터미널 공급업체는 xml 파일에서 변경할 수 있음)에 터치 이벤트, 퀵스크럽, 퀵스텝 등
  • 을 보냅니다.
  • 타사의 이니시에이터 응용 프로그램은 컨덕터를 열지 않았습니다.터미널 공급업체가 xml에서 지정한 구성 요소만 NavigationBarView의 터치 이벤트를 받거나 RecentApps를 표시할 수 있습니다.
  • 참고로 조사 도중에 중국의 슈퍼 해커들이 이 기사에 쓰지 않은 부분을 상세하게 쓴 것을 발견했다.
    https://www.jianshu.com/p/83ce8731fb13

    좋은 웹페이지 즐겨찾기