ihsg / patternlocker Goto Github PK
View Code? Open in Web Editor NEWAndroid 图形解锁/手势解锁 / 手势密码 / 图案密码 / 九宫格密码
License: Apache License 2.0
Android 图形解锁/手势解锁 / 手势密码 / 图案密码 / 九宫格密码
License: Apache License 2.0
private void updateHitState(MotionEvent event) {
final float x = event.getX();
final float y = event.getY();
for (CellBean c : this.cellBeanList) {
if (!c.isHit && c.of(x, y)) {
if (hitList.size() > 0) {
CellBean lastHit = null;
for (int i = 0; i < cellBeanList.size(); i++) {
if (cellBeanList.get(i).id == hitList.get(hitList.size() - 1)) {
lastHit = cellBeanList.get(i);
break;
}
}
if (lastHit != null) {
if (Math.abs(c.x - lastHit.x) == Math.abs(c.y - lastHit.y)) {
if (lastHit.x > c.x) {
for (CellBean c1 : this.cellBeanList) {
if (!c1.isHit && c1.of(c.x + (lastHit.x - c.x) / 2, c.y + (lastHit.y - c.y) / 2)) {
c1.isHit = true;
this.hitList.add(c1.id);
}
}
} else {
for (CellBean c1 : this.cellBeanList) {
if (!c1.isHit && c1.of(lastHit.x + (c.x - lastHit.x) / 2, lastHit.y + (c.y - lastHit.y) / 2)) {
c1.isHit = true;
this.hitList.add(c1.id);
}
}
}
} else if (Math.abs(c.x - lastHit.x) > Math.abs(c.y - lastHit.y)) {
if (lastHit.x > c.x) {
//处理斜线 2-7 2-9这种
if (c.y == lastHit.y) {
for (CellBean c1 : this.cellBeanList) {
if (!c1.isHit && c1.of(c.x + (lastHit.x - c.x) / 2, c.y)) {
c1.isHit = true;
this.hitList.add(c1.id);
}
}
} else if (lastHit.y > c.y) {
for (CellBean c1 : this.cellBeanList) {
if (!c1.isHit && c1.of(c.x + (lastHit.x - c.x) / 2, c.y + (lastHit.y - c.y) / 2)) {
c1.isHit = true;
this.hitList.add(c1.id);
}
}
} else {
for (CellBean c1 : this.cellBeanList) {
if (!c1.isHit && c1.of(c.x + (lastHit.x - c.x) / 2, lastHit.y + (c.y - lastHit.y) / 2)) {
c1.isHit = true;
this.hitList.add(c1.id);
}
}
}
} else {
if (c.y == lastHit.y) {
for (CellBean c1 : this.cellBeanList) {
if (!c1.isHit && c1.of(lastHit.x + (c.x - lastHit.x) / 2, c.y)) {
c1.isHit = true;
this.hitList.add(c1.id);
}
}
} else if (lastHit.y > c.y) {
for (CellBean c1 : this.cellBeanList) {
if (!c1.isHit && c1.of(lastHit.x + (c.x - lastHit.x) / 2, c.y + (lastHit.y - c.y) / 2)) {
c1.isHit = true;
this.hitList.add(c1.id);
}
}
} else {
for (CellBean c1 : this.cellBeanList) {
if (!c1.isHit && c1.of(lastHit.x + (c.x - lastHit.x) / 2, lastHit.y + (c.y - lastHit.y) / 2)) {
c1.isHit = true;
this.hitList.add(c1.id);
}
}
}
}
} else {
if (lastHit.y > c.y) {
if (lastHit.x == c.x) {
for (CellBean c1 : this.cellBeanList) {
if (!c1.isHit && c1.of(c.x, c.y + (lastHit.y - c.y) / 2)) {
c1.isHit = true;
this.hitList.add(c1.id);
}
}
} else if (lastHit.x > c.x) {
for (CellBean c1 : this.cellBeanList) {
if (!c1.isHit && c1.of(c.x + (lastHit.x - c.x) / 2, c.y + (lastHit.y - c.y) / 2)) {
c1.isHit = true;
this.hitList.add(c1.id);
}
}
} else {
for (CellBean c1 : this.cellBeanList) {
if (!c1.isHit && c1.of(lastHit.x + (c.x - lastHit.x) / 2, c.y + (lastHit.y - c.y) / 2)) {
c1.isHit = true;
this.hitList.add(c1.id);
}
}
}
} else {
if (lastHit.x == c.x) {
for (CellBean c1 : this.cellBeanList) {
if (!c1.isHit && c1.of(c.x, lastHit.y + (c.y - lastHit.y) / 2)) {
c1.isHit = true;
this.hitList.add(c1.id);
}
}
} else if (lastHit.x > c.x) {
for (CellBean c1 : this.cellBeanList) {
if (!c1.isHit && c1.of(c.x + (lastHit.x - c.x) / 2, lastHit.y + (c.y - lastHit.y) / 2)) {
c1.isHit = true;
this.hitList.add(c1.id);
}
}
} else {
for (CellBean c1 : this.cellBeanList) {
if (!c1.isHit && c1.of(lastHit.x + (c.x - lastHit.x) / 2, lastHit.y + (c.y - lastHit.y) / 2)) {
c1.isHit = true;
this.hitList.add(c1.id);
}
}
}
}
}
}
}
c.isHit = true;
this.hitList.add(c.id);
}
}
}
Simple or Sample ?
gradle 进行sync的时候报错了
Unable to resolve dependency for ':app@debug/compileClasspath': Could not resolve com.github.ihsg:PatternLocker:2.1.0.
Open File
Show Details
Unable to resolve dependency for ':app@debugAndroidTest/compileClasspath': Could not resolve com.android.support.test:runner:1.0.2.
Open File
Show Details
Unable to resolve dependency for ':app@debugAndroidTest/compileClasspath': Could not resolve com.android.support.test.espresso:espresso-core:3.0.2.
Open File
Show Details
Unable to resolve dependency for ':app@debugAndroidTest/compileClasspath': Could not resolve com.android.support:multidex-instrumentation:1.0.2.
Open File
Show Details
Unable to resolve dependency for ':app@debugAndroidTest/compileClasspath': Could not resolve com.android.support:appcompat-v7:27.1.1.
Open File
Show Details
Unable to resolve dependency for ':app@debugAndroidTest/compileClasspath': Could not resolve com.android.support:design:27.1.1.
Open File
Show Details
Unable to resolve dependency for ':app@debugAndroidTest/compileClasspath': Could not resolve com.android.support:multidex:1.0.3.
Open File
Show Details
Unable to resolve dependency for ':app@debugAndroidTest/compileClasspath': Could not resolve com.android.support.constraint:constraint-layout:1.1.2.
Open File
Show Details
Unable to resolve dependency for ':app@debugAndroidTest/compileClasspath': Could not resolve androidx.core:core-ktx:0.3.
Open File
Show Details
Unable to resolve dependency for ':app@debugAndroidTest/compileClasspath': Could not resolve com.github.ihsg:PatternLocker:2.1.0.
Open File
Show Details
Unable to resolve dependency for ':app@debugAndroidTest/compileClasspath': Could not resolve com.android.support:appcompat-v7:27.1.1.
Open File
Show Details
Unable to resolve dependency for ':app@debugAndroidTest/compileClasspath': Could not resolve com.android.support:appcompat-v7:27.1.1.
Open File
Show Details
Unable to resolve dependency for ':app@debugAndroidTest/compileClasspath': Could not resolve com.android.support:appcompat-v7:27.1.1.
Open File
Show Details
Unable to resolve dependency for ':app@debugAndroidTest/compileClasspath': Could not resolve com.android.support:appcompat-v7:27.1.1.
Open File
Show Details
Unable to resolve dependency for ':app@debugUnitTest/compileClasspath': Could not resolve com.github.ihsg:PatternLocker:2.1.0.
Open File
Show Details
Unable to resolve dependency for ':app@release/compileClasspath': Could not resolve com.github.ihsg:PatternLocker:2.1.0.
Open File
Show Details
Unable to resolve dependency for ':app@releaseUnitTest/compileClasspath': Could not resolve com.github.ihsg:PatternLocker:2.1.0.
Open File
Show Details
java.lang.NullPointerException
Attempt to invoke interface method 'java.util.Iterator java.util.List.iterator()' on a null object reference
2 com.github.ihsg.patternlocker.PatternLockerView.handleActionDown(PatternLockerView.java:296)
3 com.github.ihsg.patternlocker.PatternLockerView.onTouchEvent(PatternLockerView.java:212)
4 android.view.View.dispatchTouchEvent(View.java:11843)
5 android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2981)
6 android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2611)
7 android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2981)
8 android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2611)
9 android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2981)
10 android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2611)
11 android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2981)
12 android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2611)
13 android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2981)
14 android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2611)
15 android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2981)
16 android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2611)
17 com.android.internal.policy.DecorView.superDispatchTouchEvent(DecorView.java:552)
18 com.android.internal.policy.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1959)
19 android.app.Activity.dispatchTouchEvent(Activity.java:3526)
20 android.support.v7.view.WindowCallbackWrapper.dispatchTouchEvent(WindowCallbackWrapper.java:68)
21 com.android.internal.policy.DecorView.dispatchTouchEvent(DecorView.java:505)
22 android.view.View.dispatchPointerEvent(View.java:12082)
23 android.view.ViewRootImpl$ViewPostImeInputStage.processPointerEvent(ViewRootImpl.java:5325)
24 android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:5109)
25 android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:4623)
26 android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:4676)
27 android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:4642)
28 android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:4769)
29 android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:4650)
30 android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:4826)
31 android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:4623)
32 android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:4676)
33 android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:4642)
34 android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:4650)
35 android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:4623)
36 android.view.ViewRootImpl.deliverInputEvent(ViewRootImpl.java:7222)
37 android.view.ViewRootImpl.doProcessInputEvents(ViewRootImpl.java:7196)
38 android.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.java:7157)
39 android.view.ViewRootImpl$WindowInputEventReceiver.onInputEvent(ViewRootImpl.java:7379)
40 android.view.InputEventReceiver.dispatchInputEvent(InputEventReceiver.java:193)
41 android.os.MessageQueue.nativePollOnce(Native Method)
42 android.os.MessageQueue.next(MessageQueue.java:379)
43 android.os.Looper.loop(Looper.java:144)
44 android.app.ActivityThread.main(ActivityThread.java:7383)
45 java.lang.reflect.Method.invoke(Native Method)
46 com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:469)
47 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:963)
能设置手势解锁的震动强度吗?现在的震动太弱,感觉不是很明显
java.lang.NullPointerException: Attempt to invoke interface method 'java.util.Iterator java.util.List.iterator()' on a null object reference at com.github.ihsg.patternlocker.PatternLockerView.updateHitState(PatternLockerView.java:340) at com.github.ihsg.patternlocker.PatternLockerView.handleActionDown(PatternLockerView.java:296) at com.github.ihsg.patternlocker.PatternLockerView.onTouchEvent(PatternLockerView.java:212) at android.view.View.dispatchTouchEvent(View.java:11788) at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2974) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2604) at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2974) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2604) at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2974) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2604) at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2974) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2604) at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2974) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2604) at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2974) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2604) at com.android.internal.policy.DecorView.superDispatchTouchEvent(DecorView.java:549) at com.android.internal.policy.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1953) at android.app.Activity.dispatchTouchEvent(Activity.java:3548) at android.support.v7.view.WindowCallbackWrapper.dispatchTouchEvent(WindowCallbackWrapper.java:68) at com.android.internal.policy.DecorView.dispatchTouchEvent(DecorView.java:502) at android.view.View.dispatchPointerEvent(View.java:12027) at android.view.ViewRootImpl$ViewPostImeInputStage.processPointerEvent(ViewRootImpl.java:5278) at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:5067) at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:4581) at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:4634) at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:4600) at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:4727) at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:4608) at android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:4784) at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:4581) at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:4634) at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:4600) at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:4608) at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:4581) at android.view.ViewRootImpl.deliverInputEvent(ViewRootImpl.java:7169) at android.view.ViewRootImpl.doProcessInputEvents(ViewRootImpl.java:7143) at android.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.java:7104) at android.view.ViewRootImpl$WindowInputEventReceiver.onInputEvent(ViewRootImpl.java:7325) at android.view.InputEventReceiver.dispatchInputEvent(InputEventReceiver.java:192) at android.os.MessageQueue.nativePollOnce(Native Method) at android.os.MessageQueue.next(MessageQueue.java:379) at android.os.Looper.loop(Looper.java:144) at android.app.ActivityThread.main(ActivityThread.java:7425) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:245) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:921)
设备机型:BAC-AL00
系统版本:8.0.0
#5707 java.lang.IndexOutOfBoundsException
Invalid index 1117126656, size is 9
com.github.ihsg.patternlocker.h.a(DefaultLockerLinkedLineView.java:70)
连接设备测试没问题,但生成APK时抛异常:
com.android.build.api.transform.TransformException: java.util.zip.ZipException: duplicate entry: com/github/ihsg/patternlocker/Config.class
compile 'com.github.ihsg:PatternLock:2.0.0'失败
应该是compile 'com.github.ihsg:PatternLocker:2.0.0'
I want to turn on the hidden gesture function, just like many mobile phones do. How to realize it, thank you, IHSG!
之前的版本是可以的,最新的不起作用。这个不算bug吧,用updateState(Collections.emptyList(), false)倒是可以的
1、在项目的build.gradle目录下添加kotlin版本
ext {
kotlinVersion = '1.3.11'
}
按要求添加
maven { url "https://jitpack.io" }
2、在app的build.gradle目录下添加
dependencies {
...
implementation 'com.github.ihsg:PatternLocker:2.4.5' //使用开源密码锁
runtimeOnly "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlinVersion"
...
}
3、在app的build.gradle目录下添加
configurations {
cleanedAnnotations
compile.exclude group: 'org.jetbrains' , module:'annotations'
}
这里是我碰见的错误
Error while merging dex archives
Error: Program type already present: org.intellij.lang.annotations.JdkConstants$PatternFlags
利用网上资料,在最下面添加configurations就好了。
如果有遇见相同问题的朋友,可以试试,特此记录一下。
在用java代码中引用 implementation 'com.github.ihsg:PatternLocker:2.4.0'遇到2个问题
注:我是java使用者,对kotlin中的问题不太熟悉。
现在默认的密码是0-8,没找到办法修改为其它密码范围,比如说我想定义范围为1-9,或者其他的范围
根据运行项目进行测试发现,如果你从第一个点滑动的移动的时候不经过第二点范围,滑动到第三点后,中间点没有自动添加连接上,这个功能和自带的滑动手势有区别,请问怎么样能添加或者提供实现的原理吗?
支持图案绘制完成后延迟1秒(默认值)自动清除 能不能补一下api文档呀?
@ihsg
设置自定义控件对于一般程序员都比较复杂,能不能抽空整一个接口文档呢?
延时1秒能够自己设置就好了
当用户第一次绘制密码的时候,需要重置功能,这个能否直接集成到框架中呢?
//1. draw first time
if (TextUtils.isEmpty(this.tmpPwd)) {
this.tmpPwd = convert2String(hitList);
this.message = getReDrawMsg();
this.isOk = true;
if (null != listener) listener.onFirstSet();
return;
}
是这样的,我们有这样的需求,就是用户一进来就要显示用户之前的图案密码,然后用户可以修改这个密码。 因此进入到页面就需要先用指示器显示出来。。。
Originally posted by @devilived in #21 (comment)
不能定制圆的大小和圆直接的距离么
使用下面的代码试了好像不行呀 哈哈,求指点
private void _initPLV(boolean isShowTailsFlag) {
if (isShowTailsFlag) {
patternLockerView.setLinkedLineView(new DefaultLockerLinkedLineView());
mGestureTrailSwitch.setOpened(true);
} else {
// 隐藏手势轨迹
patternLockerView.setLinkedLineView(null);
mGestureTrailSwitch.setOpened(false);
}
patternLockerView.build();
}
PatternIndicatorView的颜色无论是java调用 mPtnIndicator.setNormalColor()还是xml配置 app:piv_color="@color/fontView"或者 app:plv_color="@color/fontView",都不能生效,始终是蓝色的
测试了一下,发现数字1可以直接划到数字7而不经过数字4,可以修复吗?
kotlin.UninitializedPropertyAccessException: lateinit property cellBeanList has not been initialized at com.github.ihsg.patternlocker.PatternLockerView.updateHitState(PatternLockerView.kt:270) at com.github.ihsg.patternlocker.PatternLockerView.handleActionDown(PatternLockerView.kt:225) at com.github.ihsg.patternlocker.PatternLockerView.onTouchEvent(PatternLockerView.kt:145)
只设置了布局,进页面直接闪退,日志不报啥错
#5204 kotlin.UninitializedPropertyAccessException
lateinit property cellBeanList has not been initialized
com.github.ihsg.patternlocker.PatternLockerView.updateHitState(PatternLockerView.kt:272)
机型信息:
OPPO PBAM00 33.33%,
三星 SM G9550 33.33%,
OPPO PBBT00 33.33%,
系统版本 9占66.67% ,系统版本 8.1.0 占33.33%
在Activitiy的oncreate中立即调用PatternIndicatorView.updateState初始化数据,会导致该组件空白。如果等待几秒,等他先画出来再调用就没事,应该是时序的问题。
ViewPager+TabLayout, 在ViewPager中使用该手势密码控件的的时候, 会导致左右滑动冲突, 请将PatternLockerView此类置为open以方便使用者处理滑动冲突, 急!
非常感谢.
在三星s4的手机上面会报错,系统5.0.1
Invalid index 1122041856, size is 9
com.github.ihsg.patternlocker.h.a(DefaultLockerLinkedLineView.java:70)
`
2 java.util.ArrayList.get(ArrayList.java:308)
3 com.github.ihsg.patternlocker.h.a(DefaultLockerLinkedLineView.java:70)
4 com.github.ihsg.patternlocker.PatternLockerView.a(PatternLockerView.java:261)
5 com.github.ihsg.patternlocker.PatternLockerView.onDraw(PatternLockerView.java:199)
6 android.view.View.draw(View.java:16219)
7 android.view.View.updateDisplayListIfDirty(View.java:15139)
8 android.view.View.getDisplayList(View.java:15162)
9 android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:3687)
10 android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:3666)
11 android.view.View.updateDisplayListIfDirty(View.java:15099)
12 android.view.View.getDisplayList(View.java:15162)
13 android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:3687)
14 android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:3666)
15 android.view.View.updateDisplayListIfDirty(View.java:15099)
16 android.view.View.getDisplayList(View.java:15162)
17 android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:3687)
18 android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:3666)
19 android.view.View.updateDisplayListIfDirty(View.java:15099)
20 android.view.View.getDisplayList(View.java:15162)
21 android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:3687)
22 android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:3666)
23 android.view.View.updateDisplayListIfDirty(View.java:15099)
24 android.view.View.getDisplayList(View.java:15162)
25 android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:3687)
26 android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:3666)
27 android.view.View.updateDisplayListIfDirty(View.java:15099)
28 android.view.View.getDisplayList(View.java:15162)
29 android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:3687)
30 android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:3666)
31 android.view.View.updateDisplayListIfDirty(View.java:15099)
32 android.view.View.getDisplayList(View.java:15162)
33 android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:3687)
34 android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:3666)
35 android.view.View.updateDisplayListIfDirty(View.java:15099)
36 android.view.View.getDisplayList(View.java:15162)
37 android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:3687)
38 android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:3666)
39 android.view.View.updateDisplayListIfDirty(View.java:15099)
40 android.view.View.getDisplayList(View.java:15162)
41 android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:3687)
42 android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:3666)
43 android.view.View.updateDisplayListIfDirty(View.java:15099)
44 android.view.View.getDisplayList(View.java:15162)
45 android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:3687)
46 android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:3666)
47 android.view.View.updateDisplayListIfDirty(View.java:15099)
48 android.view.View.getDisplayList(View.java:15162)
49 android.view.ThreadedRenderer.updateViewTreeDisplayList(ThreadedRenderer.java:275)
50 android.view.ThreadedRenderer.updateRootDisplayList(ThreadedRenderer.java:281)
51 android.view.ThreadedRenderer.draw(ThreadedRenderer.java:320)
52 android.view.ViewRootImpl.draw(ViewRootImpl.java:2751)
53 android.view.ViewRootImpl.performDraw(ViewRootImpl.java:2584)
54 android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2176)
55 android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1191)
56 android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:6642)
57 android.view.Choreographer$CallbackRecord.run(Choreographer.java:777)
58 android.view.Choreographer.doCallbacks(Choreographer.java:590)
59 android.view.Choreographer.doFrame(Choreographer.java:560)
60 android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:763)
61 android.os.Handler.handleCallback(Handler.java:739)
62 android.os.Handler.dispatchMessage(Handler.java:95)
63 android.os.Looper.loop(Looper.java:145)
64 android.app.ActivityThread.main(ActivityThread.java:5951)
65 java.lang.reflect.Method.invoke(Native Method)
66 java.lang.reflect.Method.invoke(Method.java:372)
67 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1400)
68 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1195)
`
我绘制完手势后,大概2-3秒后,绘制的手势会自动消失。请问我加一个确定按钮后,点击确定按钮前,要求手势不消失;点击按钮后,才让绘制手势消失,请问该怎么做?或者调用手势消失的方法时哪一个?同时不让他自动消失的方法时哪一个?谢谢
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.