怎么做淘宝客网站赚钱吗世界建筑网
- 作者: 五速梦信息网
- 时间: 2026年03月21日 06:47
当前位置: 首页 > news >正文
怎么做淘宝客网站赚钱吗,世界建筑网,海外版tiktok免费入口,公司建设网站需求分析首先一起看看下面这张图#xff1a; 通过前面锁屏加载流程可以知道在KeyguardSecurityContainer中使用getSecurityView()根据不同的securityMode inflate出来#xff0c;并添加到界面上的。 我们知道#xff0c;Pattern锁所使用的layout是 R.layout.keyguard_pattern_view 通过前面锁屏加载流程可以知道在KeyguardSecurityContainer中使用getSecurityView()根据不同的securityMode inflate出来并添加到界面上的。 我们知道Pattern锁所使用的layout是 R.layout.keyguard_pattern_view com.android.keyguard.KeyguardPatternView … …com.android.internal.widget.LockPatternViewandroid:idid/lockPatternViewandroid:layout_widthmatch_parentandroid:layout_height0dpandroid:layout_weight1android:layout_marginEnd8dipandroid:layout_marginBottom4dipandroid:layout_marginStart8dipandroid:layout_gravitycenter_horizontalandroid:gravitycenterandroid:clipChildrenfalseandroid:clipToPaddingfalse / …/FrameLayout /com.android.keyguard.KeyguardPatternView那么图案解锁的滑动事件处理就是在LockPatternView是一个系统公共控件下面我们就分析一下这个view是如何处理触摸输入的 frameworks/base/core/java/com/android/internal/widget/LockPatternView.java Overridepublic boolean onTouchEvent(MotionEvent event) {if (!mInputEnabled || !isEnabled()) {return false;}switch(event.getAction()) {case MotionEvent.ACTION_DOWN:handleActionDown(event);return true;case MotionEvent.ACTION_UP:handleActionUp();return true;case MotionEvent.ACTION_MOVE:handleActionMove(event);return true;case MotionEvent.ACTION_CANCEL:if (mPatternInProgress) {setPatternInProgress(false);resetPattern();notifyPatternCleared();}if (PROFILE_DRAWING) {if (mDrawingProfilingStarted) {Debug.stopMethodTracing();mDrawingProfilingStarted false;}}return true;}return false;}几种事件类型 事件简介ACTION_DOWN手指初次触摸到屏幕时触发ACTION_MOVE手指在屏幕上滑动时触发会多次触发ACTION_UP手指离开屏幕时触发ACTION_CANCEL事件被上层拦截时触发ACTION_OUTSIDE手指不在控件区域时触发 不同的MotionEvent对应几个不同的handle方法处理代码行数太多我们这里大致总结如下: ACTION_DOWN(handleActionDown)根据触摸事件的坐标使用算法detectAndAddHit(x, y)获取是否有命中的点如果有会调用addCellToPattern将命中的Cell添加到mPattern中后即回调mOnPatternListener.onPatternStart()通知监听器KeyguardPatternView实现并监听了OnPatternListener做了清除安全提示内容的动作。另外计算需要重绘区域并调用invalidate进行局部重绘。ACTION_MOVE(handleActionMove)在这里 LockPatternView会对所有的历史坐标加当前事件坐标遍历for (int i 0; i historySize 1; i)获取命中点另外如果ACTION_DOWN时没有获取到命中点流程同上面的ACTION_UP,然后也会回调mOnPatternListener.onPatternStart()。最后会把所有motionevent对应的重绘区域进行union并调用invalidate进行局部重绘。 关于历史坐标 为了效率Android系统在处理ACTION_MOVE事件时会将连续的几个多触点移动事件打包到一个MotionEvent对象中。我们可以通过getX(int)和getY(int)来获得最近发生的一个触摸点事件的坐标然后使用getHistorical(int,int)和getHistorical(int,int)来获得时间稍早的触点事件的坐标二者是发生时间先后的关系。所以我们应该先处理通过getHistoricalXX相关函数获得的事件信息然后在处理当前的事件信息。 for (int i 0; i historySize 1; i) {final float x i historySize ? event.getHistoricalX(i) : event.getX();final float y i historySize ? event.getHistoricalY(i) : event.getY();… }ACTION_UP(handleActionUp)如果mPattern不为空的话会重置mPatternInProgress取消动画然后回调mOnPatternListener.onPatternDetected(final ListLockPatternView.Cell pattern)这时候就开始图案解锁的验证了。ACTION_CANCEL重置pattern状态回调mOnPatternListener.onPatternCleared() 图案解锁验证 src/com/android/keyguard/KeyguardPatternView.java private class UnlockPatternListener implements LockPatternView.OnPatternListener {…Overridepublic void onPatternDetected(final ListLockPatternView.Cell pattern) {if (DEBUG) Log.d(TAG, onPatternDetected);mKeyguardUpdateMonitor.setCredentialAttempted();mLockPatternView.disableInput();if (mPendingLockCheck ! null) {mPendingLockCheck.cancel(false);}final int userId KeyguardUpdateMonitor.getCurrentUser();if (pattern.size() LockPatternUtils.MIN_PATTERN_REGISTER_FAIL) {mLockPatternView.enableInput();onPatternChecked(userId, false, 0, false /* not valid - too short /);return;}if (LatencyTracker.isEnabled(mContext)) {LatencyTracker.getInstance(mContext).onActionStart(ACTION_CHECK_CREDENTIAL);LatencyTracker.getInstance(mContext).onActionStart(ACTION_CHECK_CREDENTIAL_UNLOCKED);}mPendingLockCheck LockPatternChecker.checkCredential(mLockPatternUtils,LockscreenCredential.createPattern(pattern), // 这里跟进去会发现将 pattern转化成了 byte[]userId,new LockPatternChecker.OnCheckCallback() {Overridepublic void onEarlyMatched() {if (DEBUG) Log.d(TAG, onEarlyMatched);if (LatencyTracker.isEnabled(mContext)) {LatencyTracker.getInstance(mContext).onActionEnd(ACTION_CHECK_CREDENTIAL);}onPatternChecked(userId, true / matched /, 0 / timeoutMs /,true / isValidPattern /);}Overridepublic void onChecked(boolean matched, int timeoutMs) {if (DEBUG) Log.d(TAG, onChecked matched: matched);if (LatencyTracker.isEnabled(mContext)) {LatencyTracker.getInstance(mContext).onActionEnd(ACTION_CHECK_CREDENTIAL_UNLOCKED);}mLockPatternView.enableInput();mPendingLockCheck null;if (!matched) {onPatternChecked(userId, false / matched /, timeoutMs,true / isValidPattern */);}}Overridepublic void onCancelled() {if (DEBUG) Log.d(TAG, onCancelled);// We already got dismissed with the early matched callback, so we// cancelled the check. However, we still need to note down the latency.if (LatencyTracker.isEnabled(mContext)) {LatencyTracker.getInstance(mContext).onActionEnd(ACTION_CHECK_CREDENTIAL_UNLOCKED);}}});if (pattern.size() MIN_PATTERN_BEFORE_POKE_WAKELOCK) {mCallback.userActivity();mCallback.onUserInput();}}…}在绘制密码后手指抬起的时候如果已存的有效点数达到4个及以上就会使用LockPatternChecker.checkCredential 方法调用 task.execute() 启动一个AsyncTask 并在doInBackground中调用LockPatternUtils.checkCredential 进行密码验证此时pattern会被转化成字节形式LockscreenCredential.createPattern(pattern) 这里跟进去会发现将 pattern转化成了 byte[] // LockPatternUtils.java public static byte[] patternToByteArray(ListLockPatternView.Cell pattern) {if (pattern null) {return new byte[0];}final int patternSize pattern.size();byte[] res new byte[patternSize];for (int i 0; i patternSize; i) {LockPatternView.Cell cell pattern.get(i);resi (cell.getRow() * 3 cell.getColumn() 1);}return res; }最终和密码锁PIN码锁一样都是远程调用到LockSettingsService 的 checkCredential 接口进行验证。 Keyguard接收用户输入的密码会通过Binder到framework层的LockSettingsServiceLockSettingsService经过一系列调用会通过getGateKeeperService获取GateKeeperService然后调用verifyChallenge方法将密码继续忘底层传递framework的调用栈如下 java.lang.Throwab comandroid.locksettings.1locksettings.LockSettingsService. spBasedDoVerifyCredential(LockSettingsService. java:2724)COT3767075server.ocksettingsLockSettingsService.doVerifyCredentia1(LockSettingsSeryice.java:2020comandroservercom android.server.locksettings.LockSettingsService.doVerifyCredential(LockSettingsService. jaya:1999atcom android.server.locksettings.LockSettingsService. checkCredential(LockSettingsService. java:1972)com android.internal.widget.ILockSettings$Stub.onTransact(ILockSettings.java:542atatexecTransactInternal(Binder.java:1159)execTransact(Binder.java:1123)atSyntheticPasswordllanager. unwrapPasswordBasedSyntheticPassword(SyntheticPasswordllanager. java: 1016 android.os.Binderandroid.os.Binder
- 上一篇: 怎么做淘宝客手机网站推广建设工程网站广州
- 下一篇: 怎么做淘宝客网站赚钱吗在百度上怎么注册网站
相关文章
-
怎么做淘宝客手机网站推广建设工程网站广州
怎么做淘宝客手机网站推广建设工程网站广州
- 技术栈
- 2026年03月21日
-
怎么做淘宝返利网站吗ninaszjs wordpress
怎么做淘宝返利网站吗ninaszjs wordpress
- 技术栈
- 2026年03月21日
-
怎么做私人彩票网站网站建设公司 校园网站
怎么做私人彩票网站网站建设公司 校园网站
- 技术栈
- 2026年03月21日
-
怎么做淘宝客网站赚钱吗在百度上怎么注册网站
怎么做淘宝客网站赚钱吗在百度上怎么注册网站
- 技术栈
- 2026年03月21日
-
怎么做淘宝客网站做淘客海珠营销型网站建设公司
怎么做淘宝客网站做淘客海珠营销型网站建设公司
- 技术栈
- 2026年03月21日
-
怎么做淘宝联盟网站三河网站seo
怎么做淘宝联盟网站三河网站seo
- 技术栈
- 2026年03月21日
