Skip to content

Commit 1c8ca50

Browse files
committed
2 parents 6053559 + cc53a07 commit 1c8ca50

File tree

30 files changed

+1394
-620
lines changed

30 files changed

+1394
-620
lines changed

android-lockpattern/README.md

Lines changed: 183 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,183 @@
1+
android-lockpattern 实现原理解析
2+
====================================
3+
> 本文为 [Android 开源项目实现原理解析](https://github.com/android-cn/android-open-project-analysis) 中 android-lockpattern 部分
4+
> 项目地址:[android-lockpattern](https://code.google.com/p/android-lockpattern/),分析的版本:v3.1,Demo 地址:等待添加
5+
> 分析者:[爱早起](https://github.com/liang7),校对者:[${校对者}](${校对者 Github 地址}),校对状态:未完成
6+
7+
###1. 介绍
8+
9+
####1.1 关于
10+
11+
Android的图案密码解锁
12+
13+
![ScreenShot](image/ScreenShot.png)
14+
15+
####1.2 特点
16+
17+
- 支持: Android 1.6+ (API 4+).
18+
- 无特殊依赖.
19+
- 支持手机与平板的布局.
20+
- Stealth mode (invisible pattern).
21+
- 5种主题:
22+
- Dark/Light
23+
- Light with dark action bar (API 14+)
24+
- Dark/Light dialogs
25+
- 有验证码模式.
26+
27+
###2. 总体设计
28+
29+
用户只需要做一些配置后启动这个LockPatternActivity就能够使用,对外接口很友好,使用很方便,具体实现请参考下面的分析。
30+
31+
###3. 流程图
32+
33+
####3.1 创建解锁图形
34+
35+
![eventbus img](image/CreatePattern.png)
36+
37+
####3.2 验证解锁图形
38+
39+
![eventbus img](image/ComparePattern.png)
40+
41+
###4. 详细设计
42+
43+
####4.1 类关系图
44+
45+
![eventbus img](image/Main.png)
46+
47+
####4.2 核心类功能介绍
48+
49+
#####4.2.1 LockPatternActivity.java
50+
51+
LockPatternActivity 类负责所有外部请求,根据 `ACTION_CREATE_PATTERN` `ACTION_COMPARE_PATTERN` `ACTION_VERIFY_CAPTCHA` 等Action选择操作模式,加载设置后初始化LockPatternView,在用户完成操作后退出并返回结果。
52+
53+
主要方法说明:
54+
55+
- public void onCreate(Bundle savedInstanceState)
56+
首次创建时调用,根据intent设置theme,设置resultIntent,调用loadSettings() initContentView()
57+
- private void loadSettings()
58+
根据metaData与Settings类的内容进行显示模式、最少图形点数、自动存储、自定义加密等配置。
59+
- private void initContentView()
60+
根据Aciton与配置信息初始化UI,实例化OnPatternListener设置到LockPatternView类的对象。
61+
- private void doCheckAndCreatePattern(final List<Cell> pattern)
62+
首先检查pattern是否合法,然后判断Intent是否保存有特征码,如果没有就把pattern加密并提取特征码put到Intent,如果有就把特征码解密并与pattern对比,根据对比结果设置UI。
63+
- private void doComparePattern(final List<Cell> pattern)
64+
首先检查pattern是否合法,然后从Intent或者Settings中get特征码,把特征码解密后与pattern对比,成功则调用finishWithResultOk(null),失败次数超过最大次数则调用finishWithNegativeResult(result_failed)。
65+
- private void finishWithResultOk(char[] pattern)
66+
- private void finishWithNegativeResult(int resultCode)
67+
68+
#####4.2.2 LockPatternView.java
69+
70+
LockPatternView 类主要是显示解锁的图形界面,在用户操作的时候显示连线与动画,用户操作完成后根据结果做提示。
71+
72+
**添加图形点**
73+
74+
- private int getRowHit(float y)
75+
遍历所有图形点行高,寻找坐标y在哪个图案点的行高范围内。
76+
- private int getColumnHit(float x)
77+
遍历所有图形点列宽,寻找坐标x在哪个图案点的列宽范围内。
78+
- private Cell checkForNewHit(float x, float y)
79+
根据```getRowHit(float y)``````getColumnHit(float x)```返回的行、列判断是否是新的图形点,如果是返回新点否则返回null。
80+
- private Cell detectAndAddHit(float x, float y)
81+
调用```checkForNewHit(float x, float y)```返回当前图形点,如图形点非null,继续判断pattern list是否为空,如果不为空就把last与当前的图形点之间同一直线的其他点加入list,然后把当前点加入list。
82+
83+
**按下事件**
84+
85+
- handleActionDown(MotionEvent event)
86+
首先清理屏幕,获取当前手指的坐标,调用```detectAndAddHit(float x, float y)```并判断其返回值发送通知与局部刷新。
87+
88+
**移动事件**
89+
90+
- private void handleActionMove(MotionEvent event)
91+
检查手指移动过程中每一个点的坐标,判断如果pattern list不为空,则把最后一个图形点的坐标与当前手指坐标的区域进行局部刷新,如果在移动过程中加入了新的图形点则以此点坐标继续局部刷新。
92+
93+
**弹起事件**
94+
95+
- private void handleActionUp(MotionEvent event)
96+
检查pattern list如果不为空则停止添加,发送完成消息,全局刷新。
97+
98+
**onDraw**
99+
100+
###5. 对比
101+
102+
####5.1 与Android source code对比
103+
104+
待续
105+
106+
###6. 使用
107+
108+
####6.1 准备
109+
```
110+
<activity
111+
android:name="com.haibison.android.lockpattern.LockPatternActivity"
112+
android:theme="@style/Alp.42447968.Theme.Dark" />
113+
```
114+
####6.2 创建图形锁模式
115+
116+
```
117+
private static final int REQ_CREATE_PATTERN = 1;
118+
119+
Intent intent = new Intent(LockPatternActivity.ACTION_CREATE_PATTERN, null, your-context, LockPatternActivity.class);
120+
startActivityForResult(intent, REQ_CREATE_PATTERN);
121+
```
122+
123+
```
124+
125+
@Override
126+
protected void onActivityResult(int requestCode, int resultCode,
127+
Intent data) {
128+
switch (requestCode) {
129+
case REQ_CREATE_PATTERN: {
130+
if (resultCode == RESULT_OK) {
131+
char[] pattern = data.getCharArrayExtra(
132+
LockPatternActivity.EXTRA_PATTERN);
133+
...
134+
}
135+
break;
136+
}// REQ_CREATE_PATTERN
137+
}
138+
}
139+
```
140+
141+
####6.3 验证图形锁
142+
143+
```
144+
private static final int REQ_ENTER_PATTERN = 2;
145+
146+
char[] savedPattern = ...
147+
148+
Intent intent = new Intent(LockPatternActivity.ACTION_COMPARE_PATTERN, null,
149+
your-context, LockPatternActivity.class);
150+
intent.putExtra(LockPatternActivity.EXTRA_PATTERN, savedPattern);
151+
startActivityForResult(intent, REQ_ENTER_PATTERN);
152+
```
153+
154+
```
155+
@Override
156+
protected void onActivityResult(int requestCode, int resultCode,
157+
Intent data) {
158+
switch (requestCode) {
159+
case REQ_ENTER_PATTERN: {
160+
161+
switch (resultCode) {
162+
case RESULT_OK:
163+
// The user passed
164+
break;
165+
case RESULT_CANCELED:
166+
// The user cancelled the task
167+
break;
168+
case LockPatternActivity.RESULT_FAILED:
169+
// The user failed to enter the pattern
170+
break;
171+
case LockPatternActivity.RESULT_FORGOT_PATTERN:
172+
// The user forgot the pattern and invoked your recovery Activity.
173+
break;
174+
}
175+
176+
int retryCount = data.getIntExtra(
177+
LockPatternActivity.EXTRA_RETRY_COUNT, 0);
178+
179+
break;
180+
}// REQ_ENTER_PATTERN
181+
}
182+
}
183+
```
54.2 KB
Loading
55.7 KB
Loading

android-lockpattern/image/Main.png

156 KB
Loading
156 KB
Loading

circular-floating-action-menu/README.md

Lines changed: 14 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -17,11 +17,12 @@ CircularFloatingActionMenu 实现原理解析
1717
###2. 总体设计
1818
###2.1 核心类功能介绍
1919
主要分成两部分,一部分是构成菜单的view部分,另一部分是动画的操作类
20+
2021
首先是view的部分,主要是三个部件组成:
2122
(1)SubActionButton 选项按钮,即按菜单键弹出来的选项按钮。
2223

23-
这个类继承自FrameLayout控件,实现一个自定义图标的功能
24-
可以根据构造函数传进来的参数来选择不同风格的图案底纹
24+
这个类继承自FrameLayout控件,实现一个自定义图标的功能
25+
可以根据构造函数传进来的参数来选择不同风格的图案底纹
2526
然后将其传给menu菜单以便控制.
2627

2728
(2)FloatingActionButton 菜单按钮,点击即可唤出SubActionButton按钮
@@ -42,8 +43,7 @@ CircularFloatingActionMenu 实现原理解析
4243

4344
(2)DefaultAnimationHandler
4445
这一个默认的动画类,当我们不对动画做修改时就会默认使用这个类里面的动画效果。我们也可以参考这个类来进行设计新的动画效果
45-
动画效果主要是通过
46-
bjectAnimator.ofPropertyValuesHolder(menu.getSubActionItems().get(i).view, pvhX, pvhY, pvhR, pvhsX, pvhsY, pvhA);
46+
动画效果主要是通过ObjectAnimator.ofPropertyValuesHolder(menu.getSubActionItems().get(i).view, pvhX, pvhY, pvhR, pvhsX, pvhsY, pvhA);
4747
来实现
4848

4949
###2.2 如何使用
@@ -136,8 +136,8 @@ public SubActionButton(Activity activity, LayoutParams layoutParams, int theme,
136136
public static final int THEME_DARKER = 3;
137137
```
138138

139-
之后是设定ImageView到这个按钮上,并且设定与父view的距离。(通过setMargins())
140-
这个我们在创建subActionButton时就要调用。核心函数是addView(contentView, params)。这个方法能够在视图上再添加一个view,作为子视图。
139+
之后是设定ImageView到这个按钮上,并且设定与父view的距离。(通过setMargins())
140+
这个我们在创建subActionButton时就要调用。核心函数是addView(contentView,params)。这个方法能够在视图上再添加一个view,作为子视图。
141141
```java
142142
/**
143143
* Sets a content view with custom LayoutParams that will be displayed inside this SubActionButton.
@@ -175,9 +175,10 @@ public SubActionButton(Activity activity, LayoutParams layoutParams, int theme,
175175
}
176176
```
177177
传入activity,视图特性配置,主题的id,背景图,imageview(子视图),mageview(子视图)的特性配置。用这些来配置选项按钮。
178+
178179
##FloatingActionButton
179-
菜单按钮其实跟选项按钮的代码模式差不多,也是由设定子视图和一个建造器组成。
180-
不过它多了几个方法:
180+
菜单按钮其实跟选项按钮的代码模式差不多,也是由设定子视图和一个建造器组成。
181+
不过它多了几个方法:
181182
设定位置,如左下,右下等方位
182183
```java
183184
/**
@@ -251,7 +252,7 @@ FloatingActionButton的建造器
251252
比SubActionButton多了一个位置的属性。
252253

253254
##FloatingActionMenu
254-
这个类也是由一个建造器生成,那么我们从建造器开始说起
255+
这个类也是由一个建造器生成,那么我们从建造器开始说起
255256
我们先看看生成Menu的代码:
256257
```java
257258
FloatingActionMenu rightLowerMenu = new FloatingActionMenu.Builder(this)
@@ -375,6 +376,7 @@ FloatingActionMenu类主要是管理菜单按钮和选项按钮的位置和状
375376
}
376377
```
377378
其中item的x,y是记录视图的终点位置,然后经过动画把view移到x,y的位置上。
379+
378380
stateChangeListener为状态变化的监听器,开关都会响应相应的方法。主要在AnimationHandler中添加具体方法。
379381
```java
380382
/**
@@ -422,9 +424,9 @@ stateChangeListener为状态变化的监听器,开关都会响应相应的方
422424
```
423425

424426
##DefaultAnimationHandler
425-
动画实现的主要类,继承自MenuAnimationHandler
426-
主要通过Animator来实现属性动画。
427-
里面有一个restoreSubActionViewAfterAnimation的方法,它主要是恢复选项按钮到未打开的状态。
427+
动画实现的主要类,继承自MenuAnimationHandler
428+
主要通过Animator来实现属性动画。
429+
里面有一个restoreSubActionViewAfterAnimation的方法,它主要是恢复选项按钮到未打开的状态。
428430
```java
429431
/**
430432
* Restores the specified sub action view to its final state, accoding to the current actionType

event-bus/README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ EventBus 负责存储订阅者、事件相关信息,订阅者和发布者都
2828
![eventbus img](image/class-relation.png)
2929
以上是 EventBus 主要类的关系图,从中我们也可以看出大部分类都与 EventBus 直接关联。上部分主要是订阅者相关信息,中间是 EventBus 类,下面是 发布者发布事件后的调用,具体类的功能请看下面的详细介绍。
3030
###4.2 核心类功能介绍
31-
####4.2.1 EventBus.jva
31+
####4.2.1 EventBus.java
3232
EventBus 类负责所有对外暴露的 API,其中的 register、post、unregister 函数配合上自定义的 EventType 及事件响应函数即可完成核心功能,见 3.2 图。
3333
EventBus 默认可通过静态函数 getDefault 获取单例,当然有需要也可以通过 EventBusBuilder 或 构造函数新建一个 EventBus,每个新建的 EventBus 发布和订阅事件都是相互隔离的,即一个 EventBus 对象中的发布者发布事件,另一个 EventBus 对象中的订阅者不会收到该订阅。
3434
EventBus 中对外 API,主要包括两类:

0 commit comments

Comments
 (0)