sinawangnan7/GestureLockView

这个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"
    />
` java: ` public class MainActivity extends AppCompatActivity { private String TAG = "MainActivity";
@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没有添加进来的情况”...
测试效果:
debug.gif
打印日志:
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版本吗?

虽然没有发现,但猜到了可能的原因,下个版本会优化下~谢谢反馈