German Transparenter Hintergrung xuiview Signature

Wolli013

Well-Known Member
Licensed User
Longtime User
Hallo, weiß jemand was man einstellen muss, um einen Transparenten Hintergrund bei der Unterschrift Erstellung (xuiview ) bekommt.
Bei der Eingabe soll er allerdings Weiß bleiben, so das mann es besser sehen kann.
Komplett Transparent habe ich hinbekommen, nur dann sieht man es bei der Eingabe sehr schlecht was man schreibt.
Jemand eine Idee?
 

Wolli013

Well-Known Member
Licensed User
Longtime User
Geht nicht oder ich mache es falsch.
Hier der Code.


B4X:
Sub Class_Globals
    Private xui As XUI
    Public mBase As B4XView
    Private cvs As B4XCanvas
    Private LastX, LastY As Float
    Public StrokeWidth As Float = 3dip
    Public StrokeColor As Int = xui.Color_Blue
    Public TextColor As Int = 0xFFFF8800
    Public BackgroundColor As Int = xui.Color_white
    'Public BackgroundColor As Int = xui.Color_transparent
    Public AddDateAndTime As Boolean = True
    Public TextFont As B4XFont
    Public NumberOfPoints As Int
End Sub

Public Sub Initialize
    mBase = xui.CreatePanel("mBase")
    mBase.Color = xui.Color_transparent   
    mBase.SetLayoutAnimated(0, 0, 0, 100%x-20dip, 180dip)
    cvs.Initialize(mBase)
    TextFont = xui.CreateDefaultFont(14)
End Sub

Public Sub Resize(Width As Int, Height As Int)
    mBase.SetLayoutAnimated(0, 0, 0, Width, Height)
    cvs.Resize(Width, Height)
End Sub


Public Sub GetPanel (Dialog As B4XDialog) As B4XView
    Return mBase
End Sub

Private Sub Show (Dialog As B4XDialog) 'ignore
    cvs.DrawRect(cvs.TargetRect, BackgroundColor, True, 0)
    cvs.Invalidate
    NumberOfPoints = 0
End Sub

Private Sub mBase_Touch (Action As Int, X As Float, Y As Float)
    Select Action
        Case mBase.TOUCH_ACTION_DOWN
            LastX = X
            LastY = Y
        Case mBase.TOUCH_ACTION_MOVE
            cvs.DrawLine(LastX, LastY, X, Y, StrokeColor, StrokeWidth)
            LastX = X
            LastY = Y
            cvs.Invalidate
            NumberOfPoints = NumberOfPoints + 1
    End Select
End Sub

Public Sub getBitmap As B4XBitmap
    Return cvs.CreateBitmap
End Sub

Private Sub DialogClosed (Result As Int)
    If Result = xui.DialogResponse_Positive And AddDateAndTime Then
        Dim r As B4XRect = cvs.MeasureText("M", TextFont)
        Dim Baseline As Int = cvs.TargetRect.Bottom - r.Height - r.Top - 2dip
        cvs.DrawText("Unterschrift erstellt am: "&$"$DateTime{DateTime.Now}"$, 40dip, Baseline, TextFont, TextColor, "LEFT")
    End If
End Sub
 

Alexander Stolte

Expert
Licensed User
Longtime User
Geht nicht oder ich mache es falsch.
Hier der Code.
Nicht direkt in der klasse ändern, deshalb ist ja mBase auch auf Public. Oder willst du bei jedem Update der XUIViews diese änderungen vornehmen.

Besser:
B4X:
Dim signatur As B4XSignatureTemplate
signatur.mBase.Color = xui.Color_Transparent
signatur.BackgroundColor = xui.Color_Transparent
Ich hab noch nie mit der Signatur gearbeitet. Wenn das nicht funktionieren sollte, dann solltest du im Englischen Forum mal Fragen, damit zur Not Erel das sieht und das view darauf erweitert das man auch einen transparenten Hintergrund setzen kann.
 

Alexander Stolte

Expert
Licensed User
Longtime User
Private Sub Show (Dialog As B4XDialog) 'ignore cvs.DrawRect(cvs.TargetRect, BackgroundColor, True, 0) cvs.Invalidate NumberOfPoints = 0 End Sub
das ist auch ein wichtiger part, der füllt das view mit der "BackgroundColor" farbe. Also mit der:
signatur.BackgroundColor = xui.Color_Transparent
 

Wolli013

Well-Known Member
Licensed User
Longtime User
Geht leider nicht, nur das es sonst bei der Eingabe auch Transparent ist und das will ich ja verhindern.
Also bei der Eingabe weiß und beim speichern Transparent.
 

Wolli013

Well-Known Member
Licensed User
Longtime User
So rufe ich die Klasse auf.

B4X:
Sub btnSignature_Click

'  Dim p As Phone
'  p.SetScreenOrientation(0)'Nur Querdarstellung
    
    Base = Activity
    Dialog.Initialize (Base)
    Dialog.TitleBarTextColor = xui.Color_White
    Dialog.TitleBarColor = 0xFF1A548A
    Dialog.TitleBarHeight = 60dip
    Dialog.Title = "Unterschrift"
    SignatureTemplate.Initialize
    
'Dim lbl As Label
'lbl.Initialize("")
'SignatureTemplate.mBase.AddView(lbl, 0, 0, 200dip, 50dip)
'lbl.Text = "Signature here:"
    
    
    Dialog.ButtonsFont = xui.CreateFontAwesome(20)
    Dim rs As ResumableSub = Dialog.ShowTemplate(SignatureTemplate, Chr(0xF00C), "", Chr(0xF00D))
    Dialog.GetButton(xui.DialogResponse_Positive).TextColor = xui.Color_Green
    Dialog.GetButton(xui.DialogResponse_Cancel).TextColor = xui.Color_Red
    Dialog.ButtonsFont = xui.CreateDefaultBoldFont(15) 'return it to the default font. It will no longer affect the current dialog
    Wait For (rs) Complete (Result As Int)
    If Result = xui.DialogResponse_Positive Then
        ImageViewUnterschrift.SetBitmap(SignatureTemplate.Bitmap.Resize(ImageViewUnterschrift.Width, ImageViewUnterschrift.Height, True))
        Dim out As OutputStream = File.OpenOutput(File.DirInternal, "signature.png", False)
        SignatureTemplate.Bitmap.WriteToStream(out, 100, "PNG")
        out.Close
    End If
    
End Sub
 

Alexander Stolte

Expert
Licensed User
Longtime User
erweiter mal das B4XSignatureTemplate um diese sub:
B4X:
Public Sub ChangeBackgroundColor(clr As Int)
    BackgroundColor = clr
    cvs.ClearRect(cvs.TargetRect)
    cvs.DrawRect(cvs.TargetRect, BackgroundColor, True, 0)
    cvs.Invalidate
End Sub
rufe diese vorm speichern auf und setze diese auf transparent.
Ich habs nicht vorher getestet.
 

Alexander Stolte

Expert
Licensed User
Longtime User
ok, dann machen wir das anders.
ersetze den show sub mit dem:
B4X:
Private Sub Show (Dialog As B4XDialog) 'ignore
    cvs.DrawRect(cvs.TargetRect, xui.Color_Transparent, True, 0)
    cvs.Invalidate
End Sub

Und du regelst die Hintergrundfarbe durch das mBase view, dann ist das voneinander getrennt.
Du müsstest dann noch nicht einmal die farbe ändern vorm speichern, da er die canvas farbe nimmt, beim "getBitmap" und diese haben wir ja auf transparent gesetzt beim "show"
 

Wolli013

Well-Known Member
Licensed User
Longtime User
Ja dann auch.

B4X:
Public Sub Initialize
    mBase = xui.CreatePanel("mBase")   
    mBase.SetLayoutAnimated(0, 0, 0, 100%x-20dip, 180dip)
    mBase.Color = xui.Color_white
    cvs.Initialize(mBase)
    TextFont = xui.CreateDefaultFont(14)
End Sub

Public Sub Resize(Width As Int, Height As Int)
    mBase.SetLayoutAnimated(0, 0, 0, Width, Height)
    cvs.Resize(Width, Height)
End Sub

Public Sub GetPanel (Dialog As B4XDialog) As B4XView
    Return mBase
End Sub

'Private Sub Show (Dialog As B4XDialog) 'ignore
'    cvs.DrawRect(cvs.TargetRect, BackgroundColor, True, 0)
'    cvs.Invalidate
'    NumberOfPoints = 0
'End Sub

Private Sub Show (Dialog As B4XDialog) 'ignore
    cvs.DrawRect(cvs.TargetRect, xui.Color_Transparent, True, 0)
    cvs.Invalidate
End Sub
 

Alexander Stolte

Expert
Licensed User
Longtime User
Ich habe dir mal die klasse modifiziert. Die B4XCanvas wird jetzt auf ein anderes Panel geschrieben, somit kannst du den Hintergrund von der Signatur transparent machen und mBase weiß und auf dem resultierenden Bild ist die Signatur dann mit transparenten Hintergrund.

Probiere es bitte mal aus. :)
 

Attachments

  • B4XSignatureTemplate2.bas
    2.2 KB · Views: 126

Wolli013

Well-Known Member
Licensed User
Longtime User
Geht das denn bei dir?
Ich habe zwar einen weißen Hintergrund, sehe dann aber nicht was ich schreibe.
 
Top