Android 7.0 锁屏解锁之向上滑动显示解锁界面分析

by jing.chen

锁屏的解锁操作是在锁屏界面向上滑动实现的,通过向上滑动调出解锁界面(如图案、PIN、密码解锁界面),在解锁界面输入正确的密码之后解锁显示launcher。向上滑动如何调出解锁界面,需要分析PanelView的onTouchEvent事件,用户向上滑动的整个touch事件分析如下:

1、用户手指touch屏幕,产生touch down事件,最底层view StatusBarWindowView会执行onInterceptTouchEvent,看是否需要拦截touch事件,touch down事件在此没有被拦截,再一级级往子View传递,都没有被拦截,之后执行OnTouchEvent,从子View开始往父View传递,一级级往父View传递,也都没有消耗touch down事件;

2、用户移动手指,产生touch move事件,最底层view StatusBarWindowView会执行onInterceptTouchEvent,看是否需要拦截touch事件,touch move事件在此也没有被拦截,再一级级往子View传递,都没有被拦截,之后执行OnTouchEvent,从子View开始往父View传递,一级级往父View传递,到PanelView这里当手指移动的距离达到一定的阈值会调用onTrackingStarted从而设置mTracking的值为true,接收此touch move事件,之后的touch事件直接传到此View。在用户滑动过程会调用setExpandedHeightInternal,进而调用NotificationPanelView的onHeightUpdated进行锁屏上的时间和通知View根据手指的移动距离进行缩小、变透明处理;

3、用户抬起手指,产生touch up事件,PanelView接收到这个事件后会调用endMotionEvent,如果手指从down到up之间移动的距离达到一定阈值会调用onTrackingStopped,从而调出解锁界面;

代码分析如下:

PanelView.java

@Override

public boolean onTouchEvent(MotionEvent event) {

...

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_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();//向上滑动时,手指移动的距离达到一定的阈值会调用onTrackingStarted,设置mTracking值为true,从而接收touch事件

}

}

final float newHeight = Math.max(0, h + mInitialOffsetOnTouch);

if (newHeight > mPeekHeight) {

if (mPeekAnimator != null) {

mPeekAnimator.cancel();

}

mJustPeeked = false;

}

if (-h >= getFalsingThreshold()) {

mTouchAboveFalsingThreshold = true;

mUpwardsWhenTresholdReached = isDirectionUpwards(x, y);

}

if (!mJustPeeked && (!mGestureWaitForTouchSlop || mTracking) && !isTrackingBlocked()) {

setExpandedHeightInternal(newHeight);//用户滑动过程会调用setExpandedHeightInternal,进而调用NotificationPanelView的onHeightUpdated进行锁屏上的时间和通知View根据手指的移动距离进行缩小、变透明处理

}

trackMovement(event);

break;

case MotionEvent.ACTION_UP:

case MotionEvent.ACTION_CANCEL:

trackMovement(event);

endMotionEvent(event, x, y, false /* forceCancel */);

break;

}

return !mGestureWaitForTouchSlop || mTracking;

}

protected void onTrackingStarted() {

endClosing();

mTracking = true;

mCollapseAfterPeek = false;

mBar.onTrackingStarted();

notifyExpandingStarted();

notifyBarPanelExpansionChanged();

}

NotificationPanelView.java

@Override

protected void onHeightUpdated(float expandedHeight, boolean isMovingInKeyguard) {

mExpandedHeightTpv = expandedHeight;

LogUtils.d(TAG,"--------onHeightUpdated");

if (!mQsExpanded || mQsExpandImmediate || mIsExpanding && mQsExpandedWhenExpandingStarted) {

positionClockAndNotifications(isMovingInKeyguard);//锁屏上的时间和通知View根据手指的移动距离进行缩小、变透明处理

}

...

}

endMotionEvent调出解锁界面流程如下:

->PanelView.endMotionEvent(MotionEvent event, float x, float y, boolean forceCancel)

->NotificationPanelView.onTrackingStopped(boolean expand)

->PhoneStatusBar.onTrackingStopped(boolean expand)

->PhoneStatusBar.showBouncer()

->StatusBarKeyguardViewManager.dismiss()

->StatusBarKeyguardViewManager.dismiss(boolean authenticated)

->StatusBarKeyguardViewManager.showBouncer(boolean authenticated)

->KeyguardBouncer.show(boolean resetSecuritySelection, boolean authenticated)

->KeyguardBouncer.mShowRunnable

调用KeyguardBouncer.show(boolean resetSecuritySelection, boolean authenticated)方法并没有重新加载解锁界面,解锁界面是在灭屏时调用StatusBarKeyguardViewManager.reset后重新inflate进来的,在此处只是通过KeyguardBouncer.mShowRunnable将这个解锁界面显示出来,灭屏时解锁界面的调用栈如下:

“main@52911” prio=5 tid=0x1 nid=NA runnable

java.lang.Thread.State: RUNNABLE

at com.android.keyguard.KeyguardSecurityContainer.showSecurityScreen(KeyguardSecurityContainer.java:584)

at com.android.keyguard.KeyguardSecurityContainer.showPrimarySecurityScreen(KeyguardSecurityContainer.java:416)

at com.android.keyguard.KeyguardHostView.onFinishInflate(KeyguardHostView.java:168)

at android.view.LayoutInflater.rInflate(LayoutInflater.java:867)

at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:821)

at android.view.LayoutInflater.parseInclude(LayoutInflater.java:994)

at android.view.LayoutInflater.rInflate(LayoutInflater.java:854)

at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:821)

at android.view.LayoutInflater.inflate(LayoutInflater.java:518)

- locked <0xd005> (a java.lang.Object[])

at android.view.LayoutInflater.inflate(LayoutInflater.java:426)

at android.view.LayoutInflater.inflate(LayoutInflater.java:377)

at com.android.systemui.statusbar.phone.KeyguardBouncer.inflateView(KeyguardBouncer.java:317)

at com.android.systemui.statusbar.phone.KeyguardBouncer.ensureView(KeyguardBouncer.java:307)

at com.android.systemui.statusbar.phone.KeyguardBouncer.needsFullscreenBouncer(KeyguardBouncer.java:347)

at com.android.systemui.statusbar.phone.StatusBarKeyguardViewManager.showBouncerOrKeyguard(StatusBarKeyguardViewManager.java:130)

at com.android.systemui.statusbar.phone.StatusBarKeyguardViewManager.reset(StatusBarKeyguardViewManager.java:192)

至此把用户设定的解锁界面(图案、密码、PIN码)显示出来

android解锁界面分析,Android 7.0 锁屏解锁之向上滑动显示解锁界面分析相关推荐

  1. android锁屏快捷键设置,Android4.0+锁屏程序开发——设置锁屏页面篇

    [如何开发一个锁屏应用] 想要开发一个锁屏应用,似乎很难,其实并没有想象中那么难. 从本质上来说,锁屏界面也只是一个Activity而已,只是这个界面比较特殊,在我们点亮屏幕的时候,这个界面就会出现. ...

  2. Android锁屏状态下信息的显示

    Android窗口的显示很简单,但很多人不知道锁屏状态下窗口的显示,今天就来展示一下. 先上QQ的效果图 1:显示 就一句代码,在需要显示的Activity中onCreate方法中加入 this.ge ...

  3. Android Device Administration 设备管理器——实现一键锁屏

    Android Device Administration 设备管理器--实现一键锁屏 最近研究了一下安全这一块的内容,当然,我是比较水的,所以也拿不出什么好知识点,但是有一些冷门的东西我还是可以聊聊 ...

  4. 设置锁屏方式后,锁屏长按电源键还有锁屏按钮(lockdown)锁屏状态下应该没有,解锁使用后长按才有这个按钮。

    长按电源的菜单列表在frameworks/base/core/res/res/values/config.xml 里面有个<string-array translatable="fal ...

  5. 苹果8如何设置锁屏无线网连接服务器,iPhone8屏幕解锁怎么设置?苹果iPhone8与8 Plus解锁四种方法...

    方法1:使用指纹手指按Home键快速解锁 iOS 11改用按下主屏幕按钮解锁,简单来说就是使用录制了指纹的手指,直接按下屏幕下方的Home键,就可以快速解锁屏幕,进入主界面了,如下图所示. 方法2:使 ...

  6. Android 11.0 锁屏界面滑动解锁不灵的解决方案

    目录 1.概述 2.锁屏界面滑动解锁不灵的解决方案的核心类

  7. Android 9.0 10.0 锁屏滑动滑动解锁不灵

    系统默认锁屏需要滑动才能解锁,但是在一些大屏,滑动解锁确有问题,通常是滑动距离设置的过大导致解不了锁 解决方案: 修改系统默认滑动解锁的值,来方便滑动解锁 首选看源码 PanelView.java 这 ...

  8. Android 10.0锁屏界面默认不显示Notification通知

    在系统开机以后,默认在锁屏界面如果有通知会显示的,但是这样客户觉得非常不方便,要求去掉显示的所有通知,为了满足客户需求 所以就要实现这个功能 在StatusBarNotificationPresent ...

  9. android 8.0 3D锁屏,Android 8.0 锁屏滑动无法解锁

    问题:有一个电阻屏的手机,屏幕小,并且滑动不流畅导致无法解锁 解锁有两个界面 1. Notification Keyguard 显示通知锁屏 2.bouncer输入密码锁屏 一般情况下解锁根据滑动Y距 ...

最新文章

  1. C++ leetcode 26. 删除排序数组中的重复项 给定一个排序数组,你需要在 原地 删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。
  2. 【置顶】方立勋JavaWeb学习地址
  3. SS CMS 全新跨平台 V7.0 版本正式发布
  4. C++小型公司管理系统
  5. SQL2005结合ROW_NUMBER()高效分页存储过程
  6. ecplise git修改提交信息_eclipse git提交忽略文件配置
  7. .NET平台及C#面向对象编程
  8. 百度js选择器fox
  9. 【状压dp】【最短Hamilton路径】
  10. Tiled Map的使用说明
  11. 计算机终端保密检查 玩游戏,计算机终端保密检查工具(光盘版)
  12. 三星 android 调试模式设置,三星galaxy s4 usb调试在哪里 s4 usb调试模式设置方法详解...
  13. 选择粘贴性无html,office无法复制粘贴-Word把内容从一个文档选择性粘贴到另一个文档,具体操作方法...
  14. mt6771(Helio P60)套片开发资料下载,mt6771处理器性能
  15. 纯CSS手里剑绘制优化1
  16. php writeup,PHP_encrypt_1(ISCCCTF) Writeup
  17. 【OpenCV图像处理】十六、图像空域滤波(下)
  18. 美通企业日报 | Gap在华门店总数突破200家;千禧一代环游世界的愿望超过买房...
  19. git操作总结(1):常用操作流程之SSH、上传、下载和改名字
  20. spry提示信息设置html,CSS教程:12.4 借助于Spry实现折叠面板

热门文章

  1. Cuckoo Filter(布谷过滤器)
  2. 用 TFserving 部署深度学习模型
  3. BugkuCTF-Web-你必须让他停下
  4. SIP Via header
  5. 安卓/华为手机恢复出厂设置后如何恢复照片
  6. 学习日记20160915
  7. 双循环是什么意思c语言,什么是双循环
  8. 0xc000007b解决办法支持列表
  9. 《python编程快速上手 让繁琐工作自动化》第四章 实践项目
  10. delay 芯片时序output_时序分析中的一些基本概念