warting / android-signaturepad Goto Github PK
View Code? Open in Web Editor NEWAndroid Signature Pad is an Android library for drawing smooth signatures
License: MIT License
Android Signature Pad is an Android library for drawing smooth signatures
License: MIT License
Describe the bug
Thanks for this library! Using getTransparentSignatureBitmap(trimBlankSpace = true)
then bitmap.compress()
saves image as a black rectangle.
To Reproduce
getTransparentSignatureBitmap(trimBlankSpace = true)
output.outputStream().use { outputStream ->
bitmap.compress(Bitmap.CompressFormat.PNG, 80, outputStream)
bitmap.recycle()
}
Expected behavior
Show an image of a white background with a signature
Screenshots
Smartphone (please complete the following information):
Additional context
As a workaround, I did this.
val newBitmap = Bitmap.createBitmap(bitmap.width, bitmap.height, bitmap.config)
val canvas = Canvas(newBitmap)
canvas.drawColor(Color.WHITE)
canvas.drawBitmap(bitmap, 0f, 0f, null)
return newBitmap
I think the fix is when creating the Bitmap
is to specify setHasAlpha(true)
. Applying setHasAlpha()
after the bitmap is drawn has no effect.
Describe the bug
Using onSigned callback to override some data object by .copy() I enountered, that an old version of onSigned callback is triggered and therefore overriding other values set in that data object.
To Reproduce
Steps to reproduce the behavior:
Expected behavior
New instance of data object is used in callbacks
Additional context
Code, that triggers the bug
data class DataContainer(val signed: Boolean = false, val buttonCounter: Int = 0)
@Preview
@Composable
fun BugPreview() {
val (dataState, setDataState) = remember { mutableStateOf(DataContainer()) }
Column {
Text(text = "Counter: ${dataState.buttonCounter}")
Text(text = "Signed: ${dataState.signed}")
Button(onClick = {
setDataState(dataState.copy(buttonCounter = dataState.buttonCounter + 1))
}) { Text(text = "+1") }
Box(
modifier = Modifier.border(BorderStroke(width = Dimens.gs2, color = Color.Black))
) {
SignaturePadView(
onSigned = { setDataState(dataState.copy(signed = true)) },
onClear = { setDataState(dataState.copy(signed = false)) },
clearOnDoubleClick = true
)
}
}
}
Describe the bug
We are getting crashes on some devices when using SignaturePadView
in Compose. There seems to be some Bitmap initialization that is sometimes happening while the view is not yet measured which leads to this crash:
Fatal Exception: java.lang.IllegalArgumentException: width and height must be > 0
at android.graphics.Bitmap.createBitmap(Bitmap.java:1118)
at android.graphics.Bitmap.createBitmap(Bitmap.java:1085)
at android.graphics.Bitmap.createBitmap(Bitmap.java:1035)
at android.graphics.Bitmap.createBitmap(Bitmap.java:996)
at se.warting.signatureview.views.SignaturePad.ensureSignatureBitmapInOnDraw(SignaturePad.kt:527)
at se.warting.signatureview.views.SignaturePad.onDraw(SignaturePad.kt:267)
at android.view.View.draw(View.java:24395)
at android.view.View.updateDisplayListIfDirty(View.java:23256)
at android.view.View.draw(View.java:24125)
at android.view.ViewGroup.drawChild(ViewGroup.java:4748)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:4505)
at android.view.View.draw(View.java:24398)
at androidx.compose.ui.platform.AndroidViewsHandler.drawView(AndroidViewsHandler.android.kt:72)
at androidx.compose.ui.platform.AndroidComposeView.drawAndroidView(AndroidComposeView.android.kt:743)
at androidx.compose.ui.viewinterop.AndroidViewHolder$layoutNode$1$coreModifier$1.invoke(AndroidViewHolder.android.kt:281)
at androidx.compose.ui.viewinterop.AndroidViewHolder$layoutNode$1$coreModifier$1.invoke(AndroidViewHolder.android.kt:278)
at androidx.compose.ui.draw.DrawBackgroundModifier.draw(DrawModifier.kt:104)
at androidx.compose.ui.node.BackwardsCompatNode.draw(BackwardsCompatNode.kt:381)
at androidx.compose.ui.node.LayoutNodeDrawScope.draw-x_KDEd0$ui_release(LayoutNodeDrawScope.kt:92)
at androidx.compose.ui.node.NodeCoordinator.drawContainedDrawModifiers(NodeCoordinator.kt:371)
at androidx.compose.ui.node.NodeCoordinator.draw(NodeCoordinator.kt:360)
at androidx.compose.ui.node.LayoutModifierNodeCoordinator.performDraw(LayoutModifierNodeCoordinator.kt:236)
at androidx.compose.ui.node.NodeCoordinator.drawContainedDrawModifiers(NodeCoordinator.kt:368)
at androidx.compose.ui.node.NodeCoordinator.draw(NodeCoordinator.kt:360)
at androidx.compose.ui.node.LayoutNode.draw$ui_release(LayoutNode.kt:840)
at androidx.compose.ui.node.InnerNodeCoordinator.performDraw(InnerNodeCoordinator.kt:151)
at androidx.compose.ui.node.NodeCoordinator.drawContainedDrawModifiers(NodeCoordinator.kt:368)
at androidx.compose.ui.node.NodeCoordinator.draw(NodeCoordinator.kt:360)
at androidx.compose.ui.node.LayoutModifierNodeCoordinator.performDraw(LayoutModifierNodeCoordinator.kt:236)
at androidx.compose.ui.node.NodeCoordinator.drawContainedDrawModifiers(NodeCoordinator.kt:368)
at androidx.compose.ui.node.NodeCoordinator.draw(NodeCoordinator.kt:360)
at androidx.compose.ui.node.LayoutNode.draw$ui_release(LayoutNode.kt:840)
at androidx.compose.ui.node.InnerNodeCoordinator.performDraw(InnerNodeCoordinator.kt:151)
at androidx.compose.ui.node.NodeCoordinator.drawContainedDrawModifiers(NodeCoordinator.kt:368)
at androidx.compose.ui.node.NodeCoordinator.access$drawContainedDrawModifiers(NodeCoordinator.kt:58)
at androidx.compose.ui.node.NodeCoordinator$invoke$1.invoke(NodeCoordinator.kt:397)
at androidx.compose.ui.node.NodeCoordinator$invoke$1.invoke(NodeCoordinator.kt:396)
at androidx.compose.runtime.snapshots.Snapshot$Companion.observe(Snapshot.kt:2139)
at androidx.compose.runtime.snapshots.SnapshotStateObserver$observeReads$1$1.invoke(SnapshotStateObserver.kt:130)
at androidx.compose.runtime.snapshots.SnapshotStateObserver$observeReads$1$1.invoke(SnapshotStateObserver.kt:126)
at androidx.compose.runtime.SnapshotStateKt__DerivedStateKt.observeDerivedStateRecalculations(DerivedState.kt:341)
at androidx.compose.runtime.SnapshotStateKt.observeDerivedStateRecalculations(SnapshotStateKt.java:1)
at androidx.compose.runtime.snapshots.SnapshotStateObserver.observeReads(SnapshotStateObserver.kt:126)
at androidx.compose.ui.node.OwnerSnapshotObserver.observeReads$ui_release(OwnerSnapshotObserver.kt:120)
at androidx.compose.ui.node.NodeCoordinator.invoke(NodeCoordinator.kt:396)
at androidx.compose.ui.node.NodeCoordinator.invoke(NodeCoordinator.kt:58)
at androidx.compose.ui.platform.RenderNodeApi29.record(RenderNodeApi29.android.kt:180)
at androidx.compose.ui.platform.RenderNodeLayer.updateDisplayList(RenderNodeLayer.android.kt:298)
at androidx.compose.ui.platform.RenderNodeLayer.drawLayer(RenderNodeLayer.android.kt:239)
at androidx.compose.ui.node.NodeCoordinator.draw(NodeCoordinator.kt:355)
at androidx.compose.ui.node.LayoutModifierNodeCoordinator.performDraw(LayoutModifierNodeCoordinator.kt:236)
at androidx.compose.ui.node.LayoutNodeDrawScope.drawContent(LayoutNodeDrawScope.kt:64)
at androidx.compose.foundation.DrawOverscrollModifier.draw(AndroidOverscroll.kt:81)
at androidx.compose.ui.node.BackwardsCompatNode.draw(BackwardsCompatNode.kt:381)
at androidx.compose.ui.node.LayoutNodeDrawScope.draw-x_KDEd0$ui_release(LayoutNodeDrawScope.kt:92)
at androidx.compose.ui.node.NodeCoordinator.drawContainedDrawModifiers(NodeCoordinator.kt:371)
at androidx.compose.ui.node.NodeCoordinator.draw(NodeCoordinator.kt:360)
at androidx.compose.ui.node.LayoutModifierNodeCoordinator.performDraw(LayoutModifierNodeCoordinator.kt:236)
at androidx.compose.ui.node.NodeCoordinator.drawContainedDrawModifiers(NodeCoordinator.kt:368)
at androidx.compose.ui.node.NodeCoordinator.access$drawContainedDrawModifiers(NodeCoordinator.kt:58)
at androidx.compose.ui.node.NodeCoordinator$invoke$1.invoke(NodeCoordinator.kt:397)
at androidx.compose.ui.node.NodeCoordinator$invoke$1.invoke(NodeCoordinator.kt:396)
at androidx.compose.runtime.snapshots.Snapshot$Companion.observe(Snapshot.kt:2139)
at androidx.compose.runtime.snapshots.SnapshotStateObserver$observeReads$1$1.invoke(SnapshotStateObserver.kt:130)
at androidx.compose.runtime.snapshots.SnapshotStateObserver$observeReads$1$1.invoke(SnapshotStateObserver.kt:126)
at androidx.compose.runtime.SnapshotStateKt__DerivedStateKt.observeDerivedStateRecalculations(DerivedState.kt:341)
at androidx.compose.runtime.SnapshotStateKt.observeDerivedStateRecalculations(SnapshotStateKt.java:1)
at androidx.compose.runtime.snapshots.SnapshotStateObserver.observeReads(SnapshotStateObserver.kt:126)
at androidx.compose.ui.node.OwnerSnapshotObserver.observeReads$ui_release(OwnerSnapshotObserver.kt:120)
at androidx.compose.ui.node.NodeCoordinator.invoke(NodeCoordinator.kt:396)
at androidx.compose.ui.node.NodeCoordinator.invoke(NodeCoordinator.kt:58)
at androidx.compose.ui.platform.RenderNodeApi29.record(RenderNodeApi29.android.kt:180)
at androidx.compose.ui.platform.RenderNodeLayer.updateDisplayList(RenderNodeLayer.android.kt:298)
at androidx.compose.ui.platform.RenderNodeLayer.drawLayer(RenderNodeLayer.android.kt:239)
at androidx.compose.ui.node.NodeCoordinator.draw(NodeCoordinator.kt:355)
at androidx.compose.ui.node.LayoutModifierNodeCoordinator.performDraw(LayoutModifierNodeCoordinator.kt:236)
at androidx.compose.ui.node.NodeCoordinator.drawContainedDrawModifiers(NodeCoordinator.kt:368)
at androidx.compose.ui.node.NodeCoordinator.access$drawContainedDrawModifiers(NodeCoordinator.kt:58)
at androidx.compose.ui.node.NodeCoordinator$invoke$1.invoke(NodeCoordinator.kt:397)
at androidx.compose.ui.node.NodeCoordinator$invoke$1.invoke(NodeCoordinator.kt:396)
at androidx.compose.runtime.snapshots.Snapshot$Companion.observe(Snapshot.kt:2139)
at androidx.compose.runtime.snapshots.SnapshotStateObserver$observeReads$1$1.invoke(SnapshotStateObserver.kt:130)
at androidx.compose.runtime.snapshots.SnapshotStateObserver$observeReads$1$1.invoke(SnapshotStateObserver.kt:126)
at androidx.compose.runtime.SnapshotStateKt__DerivedStateKt.observeDerivedStateRecalculations(DerivedState.kt:341)
at androidx.compose.runtime.SnapshotStateKt.observeDerivedStateRecalculations(SnapshotStateKt.java:1)
at androidx.compose.runtime.snapshots.SnapshotStateObserver.observeReads(SnapshotStateObserver.kt:126)
at androidx.compose.ui.node.OwnerSnapshotObserver.observeReads$ui_release(OwnerSnapshotObserver.kt:120)
at androidx.compose.ui.node.NodeCoordinator.invoke(NodeCoordinator.kt:396)
at androidx.compose.ui.node.NodeCoordinator.invoke(NodeCoordinator.kt:58)
at androidx.compose.ui.platform.RenderNodeApi29.record(RenderNodeApi29.android.kt:180)
at androidx.compose.ui.platform.RenderNodeLayer.updateDisplayList(RenderNodeLayer.android.kt:298)
at androidx.compose.ui.platform.RenderNodeLayer.drawLayer(RenderNodeLayer.android.kt:239)
at androidx.compose.ui.node.NodeCoordinator.draw(NodeCoordinator.kt:355)
at androidx.compose.ui.node.LayoutModifierNodeCoordinator.performDraw(LayoutModifierNodeCoordinator.kt:236)
at androidx.compose.ui.node.LayoutNodeDrawScope.drawContent(LayoutNodeDrawScope.kt:64)
at androidx.compose.foundation.Background.draw(Background.kt:107)
at androidx.compose.ui.node.BackwardsCompatNode.draw(BackwardsCompatNode.kt:381)
at androidx.compose.ui.node.LayoutNodeDrawScope.draw-x_KDEd0$ui_release(LayoutNodeDrawScope.kt:92)
at androidx.compose.ui.node.NodeCoordinator.drawContainedDrawModifiers(NodeCoordinator.kt:371)
at androidx.compose.ui.node.NodeCoordinator.draw(NodeCoordinator.kt:360)
at androidx.compose.ui.node.LayoutModifierNodeCoordinator.performDraw(LayoutModifierNodeCoordinator.kt:236)
at androidx.compose.ui.node.NodeCoordinator.drawContainedDrawModifiers(NodeCoordinator.kt:368)
at androidx.compose.ui.node.NodeCoordinator.draw(NodeCoordinator.kt:360)
at androidx.compose.ui.node.LayoutModifierNodeCoordinator.performDraw(LayoutModifierNodeCoordinator.kt:236)
at androidx.compose.ui.node.NodeCoordinator.drawContainedDrawModifiers(NodeCoordinator.kt:368)
at androidx.compose.ui.node.NodeCoordinator.draw(NodeCoordinator.kt:360)
at androidx.compose.ui.node.LayoutNode.draw$ui_release(LayoutNode.kt:840)
at androidx.compose.ui.node.InnerNodeCoordinator.performDraw(InnerNodeCoordinator.kt:151)
at androidx.compose.ui.node.NodeCoordinator.drawContainedDrawModifiers(NodeCoordinator.kt:368)
at androidx.compose.ui.node.NodeCoordinator.draw(NodeCoordinator.kt:360)
at androidx.compose.ui.node.LayoutModifierNodeCoordinator.performDraw(LayoutModifierNodeCoordinator.kt:236)
at androidx.compose.ui.node.NodeCoordinator.drawContainedDrawModifiers(NodeCoordinator.kt:368)
at androidx.compose.ui.node.NodeCoordinator.draw(NodeCoordinator.kt:360)
at androidx.compose.ui.node.LayoutNode.draw$ui_release(LayoutNode.kt:840)
at androidx.compose.ui.node.InnerNodeCoordinator.performDraw(InnerNodeCoordinator.kt:151)
at androidx.compose.ui.node.NodeCoordinator.drawContainedDrawModifiers(NodeCoordinator.kt:368)
at androidx.compose.ui.node.NodeCoordinator.draw(NodeCoordinator.kt:360)
at androidx.compose.ui.node.LayoutModifierNodeCoordinator.performDraw(LayoutModifierNodeCoordinator.kt:236)
at androidx.compose.ui.node.NodeCoordinator.drawContainedDrawModifiers(NodeCoordinator.kt:368)
at androidx.compose.ui.node.NodeCoordinator.draw(NodeCoordinator.kt:360)
at androidx.compose.ui.node.LayoutNode.draw$ui_release(LayoutNode.kt:840)
at androidx.compose.ui.node.InnerNodeCoordinator.performDraw(InnerNodeCoordinator.kt:151)
at androidx.compose.ui.node.NodeCoordinator.drawContainedDrawModifiers(NodeCoordinator.kt:368)
at androidx.compose.ui.node.NodeCoordinator.draw(NodeCoordinator.kt:360)
at androidx.compose.ui.node.LayoutNode.draw$ui_release(LayoutNode.kt:840)
at androidx.compose.ui.node.InnerNodeCoordinator.performDraw(InnerNodeCoordinator.kt:151)
at androidx.compose.ui.node.NodeCoordinator.drawContainedDrawModifiers(NodeCoordinator.kt:368)
at androidx.compose.ui.node.NodeCoordinator.access$drawContainedDrawModifiers(NodeCoordinator.kt:58)
at androidx.compose.ui.node.NodeCoordinator$invoke$1.invoke(NodeCoordinator.kt:397)
at androidx.compose.ui.node.NodeCoordinator$invoke$1.invoke(NodeCoordinator.kt:396)
at androidx.compose.runtime.snapshots.Snapshot$Companion.observe(Snapshot.kt:2139)
at androidx.compose.runtime.snapshots.SnapshotStateObserver$observeReads$1$1.invoke(SnapshotStateObserver.kt:130)
at androidx.compose.runtime.snapshots.SnapshotStateObserver$observeReads$1$1.invoke(SnapshotStateObserver.kt:126)
at androidx.compose.runtime.SnapshotStateKt__DerivedStateKt.observeDerivedStateRecalculations(DerivedState.kt:341)
at androidx.compose.runtime.SnapshotStateKt.observeDerivedStateRecalculations(SnapshotStateKt.java:1)
at androidx.compose.runtime.snapshots.SnapshotStateObserver.observeReads(SnapshotStateObserver.kt:126)
at androidx.compose.ui.node.OwnerSnapshotObserver.observeReads$ui_release(OwnerSnapshotObserver.kt:120)
at androidx.compose.ui.node.NodeCoordinator.invoke(NodeCoordinator.kt:396)
at androidx.compose.ui.node.NodeCoordinator.invoke(NodeCoordinator.kt:58)
at androidx.compose.ui.platform.RenderNodeApi29.record(RenderNodeApi29.android.kt:180)
at androidx.compose.ui.platform.RenderNodeLayer.updateDisplayList(RenderNodeLayer.android.kt:298)
at androidx.compose.ui.platform.AndroidComposeView.dispatchDraw(AndroidComposeView.android.kt:1010)
at android.view.View.draw(View.java:24398)
at android.view.View.updateDisplayListIfDirty(View.java:23256)
at android.view.View.draw(View.java:24125)
at android.view.ViewGroup.drawChild(ViewGroup.java:4748)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:4505)
at android.view.View.updateDisplayListIfDirty(View.java:23242)
at android.view.View.draw(View.java:24125)
at android.view.ViewGroup.drawChild(ViewGroup.java:4748)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:4505)
at android.view.View.updateDisplayListIfDirty(View.java:23242)
at android.view.View.draw(View.java:24125)
at android.view.ViewGroup.drawChild(ViewGroup.java:4748)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:4505)
at android.view.View.updateDisplayListIfDirty(View.java:23242)
at android.view.View.draw(View.java:24125)
at android.view.ViewGroup.drawChild(ViewGroup.java:4748)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:4505)
at android.view.View.updateDisplayListIfDirty(View.java:23242)
at android.view.View.draw(View.java:24125)
at android.view.ViewGroup.drawChild(ViewGroup.java:4748)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:4505)
at android.view.View.updateDisplayListIfDirty(View.java:23242)
at android.view.View.draw(View.java:24125)
at android.view.ViewGroup.drawChild(ViewGroup.java:4748)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:4505)
at com.android.internal.policy.DecorView.dispatchDraw(DecorView.java:1531)
at android.view.View.draw(View.java:24398)
at com.android.internal.policy.DecorView.draw(DecorView.java:1504)
at android.view.View.updateDisplayListIfDirty(View.java:23256)
at android.view.ThreadedRenderer.updateViewTreeDisplayList(ThreadedRenderer.java:753)
at android.view.ThreadedRenderer.updateRootDisplayList(ThreadedRenderer.java:759)
at android.view.ThreadedRenderer.draw(ThreadedRenderer.java:857)
at android.view.ViewRootImpl.draw(ViewRootImpl.java:5501)
at android.view.ViewRootImpl.performDraw(ViewRootImpl.java:5194)
at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:4356)
at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:2991)
at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:10665)
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:1301)
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:1309)
at android.view.Choreographer.doCallbacks(Choreographer.java:923)
at android.view.Choreographer.doFrame(Choreographer.java:852)
at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:1283)
at android.os.Handler.handleCallback(Handler.java:942)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loopOnce(Looper.java:226)
at android.os.Looper.loop(Looper.java:313)
at android.app.ActivityThread.main(ActivityThread.java:8741)
at java.lang.reflect.Method.invoke(Method.java)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:571)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1067)
To Reproduce
It is unclear how / when on which devices this happens but it seems to be caused by some recompositions running when the internal signature pad view does not have a size and there is no check to avoid the bitmap creation code in those cases which crashes on creation of bitmaps with no size.
Expected behavior
A clear and concise description of what you expected to happen.
The view should not attempt to create 0 size bitmaps. Could it be possible to safeguard such code so it is not run if the width and height are not greater than 0? When that's the case it will probably be superseded by a later onDraw() pass once the view is properly measured / sized / resized.
I was reading your README.md and you state:
clearOnDoubleClick - Double click to clear pad (default: false)
caution because in your wrapper it's true
by default:
Although it's true for the View
:
Anyway, thanks for this lib it's is very handy and the best I used so far ๐
Describe the bug
When retrieving the signature from the signaturePadAdapter, I get a result from the bitmap function getTransparentSignatureBitmap, but not from getSignatureSvg.
The only result I get is: <?xml version="1.0" encoding="UTF-8" standalone="no"?>
To Reproduce
Steps to reproduce the behavior:
Expected behavior
I would expect that the svg string would contain the signature path data.
Smartphone (please complete the following information):
I need example for implementation java ?
Describe the bug
When retrieving the signature from the signaturePadAdapter, I get a result from the bitmap function getTransparentSignatureBitmap, but not from getSignatureSvg.
The only result I get is: <?xml version="1.0" encoding="UTF-8" standalone="no"?>
To Reproduce
Steps to reproduce the behavior:
Expected behavior
I would expect that the svg string would contain the signature path data.
Smartphone (please complete the following information):
Describe the bug
Since upgrading from 0.0.21 to 0.1.0 when checking for if the signature is empty it is always returning true, even if the signature as been signed.
The code that always returns true:
if (viewModel.signaturePadAdapter?.isEmpty == true) {
Smartphone (please complete the following information):
The app is getting crashes on v0.0.21
Fatal Exception: java.lang.NullPointerException:
at se.warting.signatureview.views.SignaturePad.addBezier(SignaturePad.kt:485)
at se.warting.signatureview.views.SignaturePad.addTimedPoint(SignaturePad.kt:441)
at se.warting.signatureview.views.SignaturePad.current(SignaturePad.kt:217)
at se.warting.signatureview.views.SignaturePad.addEvent(SignaturePad.kt:185)
at se.warting.signatureview.views.SignaturePad.onTouchEvent(SignaturePad.kt:250)
at android.view.View.dispatchTouchEvent(View.java:12716)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3108)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2759)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3108)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2759)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3108)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2759)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3108)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2759)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3108)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2759)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3108)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2759)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3108)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2759)
at com.android.internal.policy.DecorView.superDispatchTouchEvent(DecorView.java:543)
at com.android.internal.policy.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1894)
at android.app.Dialog.dispatchTouchEvent(Dialog.java:913)
at androidx.appcompat.view.WindowCallbackWrapper.dispatchTouchEvent(WindowCallbackWrapper.java:70)
at com.android.internal.policy.DecorView.dispatchTouchEvent(DecorView.java:489)
at android.view.View.dispatchPointerEvent(View.java:12960)
at android.view.ViewRootImpl$ViewPostImeInputStage.processPointerEvent(ViewRootImpl.java:6155)
at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:5881)
at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:5339)
at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:5399)
at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:5358)
at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:5525)
at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:5366)
at android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:5582)
at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:5339)
at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:5399)
at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:5358)
at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:5366)
at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:5339)
at android.view.ViewRootImpl.deliverInputEvent(ViewRootImpl.java:8273)
at android.view.ViewRootImpl.doProcessInputEvents(ViewRootImpl.java:8242)
at android.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.java:8199)
at android.view.ViewRootImpl$WindowInputEventReceiver.onInputEvent(ViewRootImpl.java:8390)
at android.view.InputEventReceiver.dispatchInputEvent(InputEventReceiver.java:186)
at android.view.InputEventReceiver.nativeConsumeBatchedInputEvents(InputEventReceiver.java)
at android.view.InputEventReceiver.consumeBatchedInputEvents(InputEventReceiver.java:177)
at android.view.ViewRootImpl.doConsumeBatchedInput(ViewRootImpl.java:8357)
at android.view.ViewRootImpl$ConsumeBatchedInputRunnable.run(ViewRootImpl.java:8413)
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:1077)
at android.view.Choreographer.doCallbacks(Choreographer.java:889)
at android.view.Choreographer.doFrame(Choreographer.java:815)
at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:1063)
at android.os.Handler.handleCallback(Handler.java:873)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:233)
at android.app.ActivityThread.main(ActivityThread.java:7225)
at java.lang.reflect.Method.invoke(Method.java)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:499)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:962)
Is your feature request related to a problem? Please describe.
After the view has been created I can't change the following properties:
this.setMinWidth(penMinWidth.value)
this.setMaxWidth(penMaxWidth.value)
this.setPenColor(penColor.toArgb())
this.setVelocityFilterWeight(velocityFilterWeight)
this.setClearOnDoubleClick(clearOnDoubleClick)
Describe the solution you'd like
The
update
block can be run multiple times (on the UI thread as well) due to recomposition, and it is the right place to setView
properties depending on state. When state changes, the block will be re-executed to set the new properties. Note the block will also be ran once right after thefactory
block completes
So instead of the porperties being changed inside factory
, I believe they should be changed inside update
Describe alternatives you've considered
I believe there's none.
Feature setBitmapAsSignature() request
Hey guy's you are doing an great job. I'm using this library and came to an point where I'm getting base64 from server as you know we can convert base64 to bitmap but there is no option to set that bitmap inside signature pad
getSignatureSvg() only provides the signature in black and white format; we can't get it in color. @warting
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.