zoukankan      html  css  js  c++  java
  • Android7.1 锁屏滑动无法解锁 Notification Keyguard 显示通知锁屏

    问题:屏幕太大,滑动距离太大,并且滑动不流畅导致无法解锁

    Notification Keyguard 显示通知锁屏 显示分析

    一般情况下解锁根据滑动Y距离的长度和速度,再根据一些因数处理,通过阀值完成解锁。

    一.PaneView.java

    frameworksasepackagesSystemUIsrccomandroidsystemuistatusbarphonePanelView.java

    public boolean onTouchEvent(MotionEvent event) {  

              private int getFalsingThreshold() {

                          protected void loadDimens() {

        @Override
        public boolean onTouchEvent(MotionEvent event) {
            if (mInstantExpanding || mTouchDisabled
                    || (mMotionAborted && event.getActionMasked() != MotionEvent.ACTION_DOWN)) {
                return false;
            }
    
            // On expanding, single mouse click expands the panel instead of dragging.
            String platform = SystemProperties.get("ro.board.platform");
            if (isFullyCollapsed() && event.isFromSource(InputDevice.SOURCE_MOUSE)
                    && !"rk312x".equals(platform) && !"rk3126c".equals(platform)
    		&& !"rk3399".equals(platform)) {
                if (event.getAction() == MotionEvent.ACTION_UP) {
                    expand(true);
                }
                return true;
            }
    
            /*
             * We capture touch events here and update the expand height here in case according to
             * the users fingers. This also handles multi-touch.
             *
             * If the user just clicks shortly, we show a quick peek of the shade.
             *
             * Flinging is also enabled in order to open or close the shade.
             */
    
            int pointerIndex = event.findPointerIndex(mTrackingPointer);
            if (pointerIndex < 0) {
                pointerIndex = 0;
                mTrackingPointer = event.getPointerId(pointerIndex);
            }
            final float x = event.getX(pointerIndex);
            final float y = event.getY(pointerIndex);
    
            if (event.getActionMasked() == MotionEvent.ACTION_DOWN) {
                mGestureWaitForTouchSlop = isFullyCollapsed() || hasConflictingGestures();
                mIgnoreXTouchSlop = isFullyCollapsed() || shouldGestureIgnoreXTouchSlop(x, y);
            }
    
            switch (event.getActionMasked()) {
                case MotionEvent.ACTION_DOWN:
                    startExpandMotion(x, y, false /* startTracking */, mExpandedHeight);
                    mJustPeeked = false;
                    mPanelClosedOnDown = isFullyCollapsed();
                    mHasLayoutedSinceDown = false;
                    mUpdateFlingOnLayout = false;
                    mMotionAborted = false;
                    mPeekTouching = mPanelClosedOnDown;
                    mTouchAboveFalsingThreshold = false;
                    mCollapsedAndHeadsUpOnDown = isFullyCollapsed()
                            && mHeadsUpManager.hasPinnedHeadsUp();
                    if (mVelocityTracker == null) {
                        initVelocityTracker();
                    }
                    trackMovement(event);
                    if (!mGestureWaitForTouchSlop || (mHeightAnimator != null && !mHintAnimationRunning) ||
                            mPeekPending || mPeekAnimator != null) {
                        cancelHeightAnimator();
                        cancelPeek();
                        mTouchSlopExceeded = (mHeightAnimator != null && !mHintAnimationRunning)
                                || mPeekPending || mPeekAnimator != null;
                        onTrackingStarted();
                    }
                    if (isFullyCollapsed() && !mHeadsUpManager.hasPinnedHeadsUp()) {
                        schedulePeek();
                    }
                    break;
    
                case MotionEvent.ACTION_POINTER_UP:
                    final int upPointer = event.getPointerId(event.getActionIndex());
                    if (mTrackingPointer == upPointer) {
                        // gesture is ongoing, find a new pointer to track
                        final int newIndex = event.getPointerId(0) != upPointer ? 0 : 1;
                        final float newY = event.getY(newIndex);
                        final float newX = event.getX(newIndex);
                        mTrackingPointer = event.getPointerId(newIndex);
                        startExpandMotion(newX, newY, true /* startTracking */, mExpandedHeight);
                    }
                    break;
                case MotionEvent.ACTION_POINTER_DOWN:
                    if (mStatusBar.getBarState() == StatusBarState.KEYGUARD) {
                        mMotionAborted = true;
                        endMotionEvent(event, x, y, true /* forceCancel */);
                        return false;
                    }
                    break;
                case MotionEvent.ACTION_MOVE:
                    float h = y - mInitialTouchY;
    
                    // If the panel was collapsed when touching, we only need to check for the
                    // y-component of the gesture, as we have no conflicting horizontal gesture.
                    if (Math.abs(h) > mTouchSlop
                            && (Math.abs(h) > Math.abs(x - mInitialTouchX)
                                    || mIgnoreXTouchSlop)) {
                        mTouchSlopExceeded = true;
                        if (mGestureWaitForTouchSlop && !mTracking && !mCollapsedAndHeadsUpOnDown) {
                            if (!mJustPeeked && mInitialOffsetOnTouch != 0f) {
                                startExpandMotion(x, y, false /* startTracking */, mExpandedHeight);
                                h = 0;
                            }
                            cancelHeightAnimator();
                            removeCallbacks(mPeekRunnable);
                            mPeekPending = false;
                            onTrackingStarted();
                        }
                    }
                    final float newHeight = Math.max(0, h + mInitialOffsetOnTouch);
                    if (newHeight > mPeekHeight) {
                        if (mPeekAnimator != null) {
                            mPeekAnimator.cancel();
                        }
                        mJustPeeked = false;
                    }
    				Log.d("gatsby","-h ->"+-h+" getFalsingThreshold()->"+getFalsingThreshold());//This 
                    if (-h >= getFalsingThreshold()) {
                        mTouchAboveFalsingThreshold = true;
                        mUpwardsWhenTresholdReached = isDirectionUpwards(x, y);
                    }
                    if (!mJustPeeked && (!mGestureWaitForTouchSlop || mTracking) && !isTrackingBlocked()) {
                        setExpandedHeightInternal(newHeight);
                    }
    
                    trackMovement(event);
                    break;
    
                case MotionEvent.ACTION_UP:
                case MotionEvent.ACTION_CANCEL:
                    trackMovement(event);
                    endMotionEvent(event, x, y, false /* forceCancel */);
                    break;
            }
            return !mGestureWaitForTouchSlop || mTracking;
        }
    

     这个阈值是在如下文件中定义的, 它是用下面的值乘以一个因子(1.5)之后得到这个Y-距离.

        private int getFalsingThreshold() {
            float factor = mStatusBar.isWakeUpComingFromTouch() ? 1.5f : 1.0f;
            return (int) (mUnlockFalsingThreshold * factor);
        }
    

     解析配置文件

        protected void loadDimens() {
            final Resources res = getContext().getResources();
            final ViewConfiguration configuration = ViewConfiguration.get(getContext());
            mTouchSlop = configuration.getScaledTouchSlop();
            mHintDistance = res.getDimension(R.dimen.hint_move_distance);
            mUnlockFalsingThreshold = res.getDimensionPixelSize(R.dimen.unlock_falsing_threshold);
        }
    

     二.Gatsby patch

    diff --git a/frameworks/base/packages/SystemUI/res/values/dimens.xml b/frameworks/base/packages/SystemUI/res/values/dimens.xml
    old mode 100644
    new mode 100755
    index e159501..630257c
    --- a/frameworks/base/packages/SystemUI/res/values/dimens.xml
    +++ b/frameworks/base/packages/SystemUI/res/values/dimens.xml
    @@ -272,7 +272,7 @@
         <dimen name="speed_bump_height">16dp</dimen>
     
         <!-- Lockscreen unlocking falsing threshold. -->
    -    <dimen name="unlock_falsing_threshold">80dp</dimen>
    +    <dimen name="unlock_falsing_threshold">30dp</dimen>
     
         <!-- Lockscreen falsing threshold for quick settings. -->
         <dimen name="qs_falsing_threshold">60dp</dimen>
    diff --git a/frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelView.java b/frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelView.java
    index 6587520..3c1bc53 100755
    --- a/frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelView.java
    +++ b/frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelView.java
    @@ -331,6 +331,7 @@ public abstract class PanelView extends FrameLayout {
                         }
                         mJustPeeked = false;
                     }
    +				Log.d("gatsby","-h ->"+-h+" getFalsingThreshold()->"+getFalsingThreshold());
                     if (-h >= getFalsingThreshold()) {
                         mTouchAboveFalsingThreshold = true;
                         mUpwardsWhenTresholdReached = isDirectionUpwards(x, y);
    
  • 相关阅读:
    Kerberos-KDC
    samba后台进程及安全模式简介
    samba服务器详细配置(非域模式)
    windows常用net use命令
    samba常用命令
    ORA-24324、ORA-12560、ORA-12514
    oracle的启动和关闭
    Oracle 监听配置详解(转载)
    linux加入windows域之完美方案(转载)
    怎样识吉他谱
  • 原文地址:https://www.cnblogs.com/crushgirl/p/13889452.html
Copyright © 2011-2022 走看看