这个view对于“跟随手势“能做吗
Opened this issue · 11 comments
解释下“跟随手势“:假设屏幕上有两个GestureLockView,一个大的(A),一个小的(a);能不能做到我在A上面绘制手势时,a可以跟随绘制,并且颜色、绘制正确或错误的状态等都保持一致。要注意:我的手势是作用在A上的,a上没有手势落下,只是跟随A自动绘制。(不知道我的描述你有没有理解)
ps:
这两天项目上需要一个手势解锁,本着先用轮子的原则,在github上搜了一下,比较之后感觉GestureLockView的扩展性很好,耦合相对也比较低,比那些几百star的好多了,但是star却很少,可见Android开发现在已经不是那么火热了。。。
现在我需要知道这个库能不能满足我上面的需求,如果可以的话,我需要怎么做?或者有什么相对省时间的思路吗?最后,如果不行的话,我还是需要自己造一个轮子,不过准备在GestureLockView的基础上修改,能给几个注意事项吗?
tks!
明白你的意思了...你说的小(a)应该是手势解锁缩略图吧?记得在仿支付宝和京东金融时也看到了这个效果...当时觉得简单就没在加~看来还是不能太偷懒...
这两天会更新一个版本,添加此功能...
如果你想自己做,我这提供一个思路....(需要自定义缩略图View)
本库提供了手势解锁监听器,你在onProgress方法和onComplete方法里可以实时拿到按下点的数据信息(数字字符串)...
你需要把这个数字字符串和显示的颜色值(或状态)传到自定义缩略图View,让缩略图View重绘显示...
mGestureLockView.setGestureLockListener(new OnGestureLockListener() {
......
/**
* 图案解锁内容改变
*
* @Param progress 解锁进度(数字字符串)
*/
@override
public void onProgress(String progress) {
}
/**
* 图案解锁完成
*
* @param result 解锁结果(数字字符串)
*/
@Override
public void onComplete(String result) {
}
});
思路基本一致,但现在有个问题,GestureLockView在处理连接点的时候有bug,测试的case为:
1 2 3
4 5 6
7 8 9
在跨点连接时,连接点的数据不准,举个case:从7开始连接,然后绕过8,直接连接9,理论上应该自动把8也连上,即正常应该返回789,但实际上8并没有连上。
这个bug应该是点的作用范围设置不准,导致在经过8时,本应归为8的x,y坐标,实际上却没有任何点能处理这个坐标。
每个圆形点的触摸区域本质上其实是一个矩形区域,只要手势在某个矩形区域内,该点就应该被连接上,但如果每个矩形区域之间增加了padding,在处理手势归属问题时又没有把padding算上,那么当手势恰好经过padding区域时,就会造成没有任何点可以处理当前的手势的bug。
你可以 各种调整GestureLockView的宽高以及padding值,看看能不能复现这个bug。。。。。。。。
“每个圆形点的触摸区域本质上其实是一个矩形区域,只要手势在某个矩形区域内,该点就应该被连接上”...
我的想法可能和你不一样,我参照的“支付宝”和“京东金融”的设计...你可以试下这两个APP...
我设计的有效触摸点是圆内,不是整个矩形区域,圆外是不算有效触摸,这个对我的设计而言不是Bug...
建议你做这个需求前看下应用市场上的APP是如何做的...
这里就先不讨论是矩形还是圆形了。。。。。
但是bug是事实啊:
1 2 3
4 5 6
7 8 9
从7开始连接,然后绕过8,直接连接9,会导致8不会被连接,这是事实啊。不管“支付宝”和“京东金融”是怎么设计的,但是他们肯定不会有这个问题吧。你可以 各种调整GestureLockView的宽高以及padding值,看看能不能复现这个bug。。。。。。。。
我Demo里的样例也有这个问题吗?
我应该做过处理的......7越过8连接9时,应该会连接8的...你能把你出Bug的GestureLockView的宽高以及padding值给我发下吗?我试着复现下~(android:padding=""这个属性对我的GestureLockView应该是无效的)
没用demo样例,只是依赖了GestureLockView 的lib,然后直接使用GestureLockView ,我看到默认实现是GestureLockPainter ,是不是GestureLockPainter 的问题?
我的设置为:
- 把GestureLockView的宽高设置为match_parent,
- 四周加了magin值,具体是多少忘了。。。
- 另外我没有对GestureLockView设置padding(我也知道设置无效)
我的设置应该是很普通的,提供的自定义属性我一个也没用,嗯,就是这样。。。
这个Bug是必现的吗?还是偶发的?
我尝试创建了一个新工程依赖GestureLockView的lib,宽高设置为match_parent,四周设置了magin值,做了测试没有出现这个问题。如果再次出现这个Bug,请把这个XML代码发我看下。
(事件触摸机制和GestureLockPainter是没关系的~Painter是绘制者的意思,只会影响视图的显示效果)
我设计的模型如下:
0 1 2
3 4 5
6 7 8
按下6越过7连接8时,会先连接7再连接8。
我加了手势监听器后的日志输出如下:
11-09 14:49:49.740 24667-24667/com.wangnan.myapplication E/TAG: onProgress:6
11-09 14:49:52.248 24667-24667/com.wangnan.myapplication E/TAG: onProgress:67
11-09 14:49:52.248 24667-24667/com.wangnan.myapplication E/TAG: onProgress:678
11-09 14:49:53.827 24667-24667/com.wangnan.myapplication E/TAG: onComplete:678
打印日志时第2行和第3行日志几乎是同时出现的...
get,具体的调用代码我晚上回去再贴,现在记不清具体的代码是怎么设置的了,但这个bug是必现的。
xml:
`
<com.wangnan.library.GestureLockView
android:id="@+id/gestureBottom"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_gravity="center_horizontal"
android:layout_margin="30dp"
/>
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
GestureLockView gestureBottom = findViewById(R.id.gestureBottom);
gestureBottom.setGestureLockListener(new OnGestureLockListener() {
@Override
public void onStarted() {
}
@Override
public void onProgress(String progress) {
Log.e("tag", "onProgress-progress=" + progress);
}
@Override
public void onComplete(String result) {
Log.e("tag", "onComplete-result=" + result);
}
});
}
}
`
代码就就这么简单。
这个bug是必现bug啊,随便一测都测得出来。
0 1 2
3 4 5
6 7 8
我使用你的代码在多个测试机和模拟器做了测试,没有出现“6越过7连接8时,7没有添加进来的情况”...
测试效果:
打印日志:
11-09 23:02:21.907 1731-1731/com.wangnan.myapplication E/tag: onProgress-progress=6
11-09 23:02:23.420 1731-1731/com.wangnan.myapplication E/tag: onProgress-progress=67
11-09 23:02:23.421 1731-1731/com.wangnan.myapplication E/tag: onProgress-progress=678
11-09 23:02:24.140 1731-1731/com.wangnan.myapplication E/tag: onComplete-result=678
能提供下你的测试机型和Android版本吗?
虽然没有发现,但猜到了可能的原因,下个版本会优化下~谢谢反馈