Giter Club home page Giter Club logo

android-signaturepad's People

Contributors

dependabot[bot] avatar guilhe avatar jalalkun avatar jalaluddinmk avatar stoddayy avatar warting avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

android-signaturepad's Issues

Transparent bitmap creates black rectangle

Describe the bug
Thanks for this library! Using getTransparentSignatureBitmap(trimBlankSpace = true) then bitmap.compress() saves image as a black rectangle.

To Reproduce

  1. Draw signature
  2. Call getTransparentSignatureBitmap(trimBlankSpace = true)
output.outputStream().use { outputStream ->
    bitmap.compress(Bitmap.CompressFormat.PNG, 80, outputStream)
    bitmap.recycle()
}
  1. Open image created via photos or another app

Expected behavior
Show an image of a white background with a signature

Screenshots

Smartphone (please complete the following information):

  • Device: Fairphone 4 & Android 11 emulator
  • OS: Android 11
  • Library Version 0.0.20 (legacy view)

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.

See https://stackoverflow.com/a/43736504/818821

SignaturePadView Composable references old callbacks

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:

  1. Set some value as state
  2. Use SignaturePadView and set state of some data class object

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
            )
        }
    }
}

Crash at onDraw() when used with Compose

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.

[Warning] - Default value for clearOnDoubleClick

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 ๐Ÿ˜‰

getSignatureSvg() returns empty svg in Compose

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:

  1. In the onSigned callback do:
    signaturePadAdapter?.getSignatureSvg()
    and
    signaturePadAdapter?.getTransparentSignatureBitmap()
  2. Sign on the signaturePad
  3. See an actual bitmap, but an empty svg

Expected behavior
I would expect that the svg string would contain the signature path data.

Smartphone (please complete the following information):

  • Device: Panasonic scanner
  • OS: Android 9.0
  • Library Version 0.1.2

getSignatureSvg() returns empty svg in Compose

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:

  1. In the onSigned callback do:
    signaturePadAdapter?.getSignatureSvg()
    and
    signaturePadAdapter?.getTransparentSignatureBitmap()
  2. Sign on the signaturePad
  3. See an actual bitmap, but an empty svg

Expected behavior
I would expect that the svg string would contain the signature path data.

Smartphone (please complete the following information):

  • Device: Panasonic scanner
  • OS: Android 9.0
  • Library Version 0.1.2

Signature always returning empty true

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):

  • Device: Sony H8416
  • OS: Android 10
  • Library Version 0.1.0

se.warting.signatureview.views.SignaturePad.addBezier - NullPointerException

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)

Update properties after view has being created

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 set View 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 the factory 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 request

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()

getSignatureSvg() only provides the signature in black and white format; we can't get it in color. @warting

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.