锁屏界面下拉显示systemUI快捷设置----下拉距离判断

锁屏界面下拉状态栏

vendor/mediatek/proprietary/packages/apps/SystemUI/src/com/android/systemui/statusbar/DragDownHelper.java

mMinDragDistance:最小距离,防止用户误触导致动画触发
mTouchSlop:最小距离,小于这个距离,认为是长按,滑动超过这个距离才认为是滚动
public DragDownHelper(Context context, View host, ExpandHelper.Callback callback,
            DragDownCallback dragDownCallback,
            FalsingManager falsingManager) {
        mMinDragDistance = context.getResources().getDimensionPixelSize(
                R.dimen.keyguard_drag_down_min_distance);
        final ViewConfiguration configuration = ViewConfiguration.get(context);
        mTouchSlop = configuration.getScaledTouchSlop();
        mSlopMultiplier = configuration.getScaledAmbiguousGestureMultiplier();
        mCallback = callback;
        mDragDownCallback = dragDownCallback;
        mHost = host;
        mFalsingManager = falsingManager;
    }
//
    @Override
    public boolean onInterceptTouchEvent(MotionEvent event) {
        final float x = event.getX();
        final float y = event.getY();
//手指按下记录左边点
        switch (event.getActionMasked()) {
            case MotionEvent.ACTION_DOWN:
                mDraggedFarEnough = false;
                mDraggingDown = false;
                mStartingChild = null;
                mInitialTouchY = y;
                mInitialTouchX = x;
                Log.d("TAG","mInitialTouchY 111 : "+mInitialTouchY+" mTouchSlop: "+mTouchSlop);
                break;
//滑动时,当滑动超过长按的判断,认为开始滚动时,return true,拦截触摸事件
//从这之后,才会走到onTouchEvent
            case MotionEvent.ACTION_MOVE:
                final float h = y - mInitialTouchY;
                // Adjust the touch slop if another gesture may be being performed.
                final float touchSlop =
                        event.getClassification() == MotionEvent.CLASSIFICATION_AMBIGUOUS_GESTURE
                        ? mTouchSlop * mSlopMultiplier
                        : mTouchSlop;
                if (h > touchSlop && h > Math.abs(x - mInitialTouchX)) {
                    mFalsingManager.onNotificatonStartDraggingDown();
                    mDraggingDown = true;
                    captureStartingChild(mInitialTouchX, mInitialTouchY);
                    mInitialTouchY = y;
                    Log.d("TAG","mInitialTouchY 222 : "+mInitialTouchY);
                    mInitialTouchX = x;
                    mDragDownCallback.onTouchSlopExceeded();
                    return mStartingChild != null || mDragDownCallback.isDragDownAnywhereEnabled();
                }
                break;
        }
        return false;
    }
@Override
    public boolean onTouchEvent(MotionEvent event) {
    if (!mDraggingDown) {
        return false;
    }
    final float x = event.getX();
    final float y = event.getY();
    Log.d("TAG","Y: "+y);

    switch (event.getActionMasked()) {
        case MotionEvent.ACTION_MOVE:
        	//move的时候计算y方向的位移
            mLastHeight = y - mInitialTouchY;
            captureStartingChild(mInitialTouchX, mInitialTouchY);
            if (mStartingChild != null) {
                handleExpansion(mLastHeight, mStartingChild);
            } else {
                mDragDownCallback.setEmptyDragAmount(mLastHeight);
            }
            if (mLastHeight > mMinDragDistance) {
                if (!mDraggedFarEnough) {
                    mDraggedFarEnough = true;
                    mDragDownCallback.onCrossedThreshold(true);
                }
            } else {
                if (mDraggedFarEnough) {
                    mDraggedFarEnough = false;
                    mDragDownCallback.onCrossedThreshold(false);
                }
            }
            return true;
        case MotionEvent.ACTION_UP:
            Log.w("TAG","mDraggedFarEnough: "+mDraggedFarEnough+" mMinDragDistance: "+mMinDragDistance+" mLastHeight: "+mLastHeight+" mInitialTouchY: "+mInitialTouchY);
            //松手后,判断是否位移足够的距离,mDragDownCallback.onDraggedDown这个里面显示system UI状态栏和快捷设置图标
            if (!mFalsingManager.isUnlockingDisabled() && !isFalseTouch()
                    && mDragDownCallback.onDraggedDown(mStartingChild,
                    (int) (y - mInitialTouchY))) {
                if (mStartingChild == null) {
                    cancelExpansion();
                } else {
                    mCallback.setUserLockedChild(mStartingChild, false);
                    mStartingChild = null;
                }
                mDraggingDown = false;
            } else {
                stopDragging();
                return false;
            }
            break;
        case MotionEvent.ACTION_CANCEL:
            stopDragging();
            return false;
    }
    return false;
}
	//mDraggedFarEnough这个就是move的时候根据高度修改的变量
    private boolean isFalseTouch() {
        if (!mDragDownCallback.isFalsingCheckNeeded()) {
            return false;
        }
        return mFalsingManager.isFalseTouch() || !mDraggedFarEnough;
    }

vendor/mediatek/proprietary/packages/apps/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayout.java

public boolean onDraggedDown方法中,
//打开锁屏shade模式,也就是快捷设置一行显示
Dependency.get(ShadeController.class).goToLockedShade(startingChild);
再次下滑触发2行快捷方式图标

这里没有仔细验证过,先记录一下,有可能不对:
vendor/mediatek/proprietary/packages/apps/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelViewController.java

private void flingQsWithCurrentVelocity(float y, boolean isCancelMotionEvent) {
        float vel = getCurrentQSVelocity();
        final boolean expandsQs = flingExpandsQs(vel);
        Log.i(TAG," expandsQs: "+expandsQs);
        if (expandsQs) {
            logQsSwipeDown(y);
        }
        flingSettings(vel, expandsQs && !isCancelMotionEvent ? FLING_EXPAND : FLING_COLLAPSE);
    }
    //计算速度和位移
    //如果时快速下滑
    //如果滑动速度很慢,那么滑动距离需要超过快捷设置列表的50%
    private boolean flingExpandsQs(float vel) {
        if (mFalsingManager.isUnlockingDisabled() || isFalseTouch()) {
            return false;
        }
        Log.i(TAG," flingExpandsQs: "+vel+" mFlingAnimationUtils.getMinVelocityPxPerSecond(): "+mFlingAnimationUtils.getMinVelocityPxPerSecond());
        if (Math.abs(vel) < mFlingAnimationUtils.getMinVelocityPxPerSecond()) {
            return getQsExpansionFraction() > 0.5f;
        } else {
            return vel > 0;
        }
    }
getQsExpansionFraction:距离计算百分比
mQsMinExpansionHeight:单行距离
mQsMaxExpansionHeight:双行距离
mQsExpansionHeight:当前显示的距离
private float getQsExpansionFraction() {
        Log.i(TAG," mQsExpansionHeight: "+mQsExpansionHeight+" mQsMinExpansionHeight: "+mQsMinExpansionHeight+" mQsMaxExpansionHeight: "+mQsMaxExpansionHeight);
        return Math.min(
                1f, (mQsExpansionHeight - mQsMinExpansionHeight) / (mQsMaxExpansionHeight
                        - mQsMinExpansionHeight));
    }
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值