B4A Class [B4X] [XUI] AS BottomMenu

Alexander Stolte

Expert
Licensed User
Longtime User
OMG, you are great! That's what the class should look like, but i did not succeed.
Thanks, in the next version, i make a checkbox for it, user can choose it in the designer.
 

Brandsum

Well-Known Member
Licensed User
@ciprian Sorry I can't share that project in which I've used this custom view class. Though I've already posted the modified code. You can download the latest version of this custom view class and can add that modified code to achieve the curve above the middle button.
 

ciprian

Active Member
Licensed User
Longtime User
This is what i've allready tried, but i don't find the ChangeMiddleButtonSize sub.
I will retry this morning.
Thank you.
 

ciprian

Active Member
Licensed User
Longtime User
Done. But now i'm getting many errors, i'm surely missing something.
I attached my modified project, i'm using B4A V8.80, library used: bitmapcreator 4.50, core 8.80, JavaObject 2.05, XUI 1.90.
 

Attachments

  • AS_Bottom_Menu_test.zip
    42.7 KB · Views: 313

Brandsum

Well-Known Member
Licensed User
Seems that you have not followed what I posted.

FontToBitmap
is missing in your project. It's a function to create a bitmap from icon font.

B4X:
Public Sub FontToBitmap (text As String, IsMaterialIcons As Boolean, FontSize As Float, color As Int) As B4XBitmap
    Dim xui As XUI
    Dim p As B4XView = xui.CreatePanel("")
    p.SetLayoutAnimated(0, 0, 0, 32dip, 32dip)
    Dim cvs1 As B4XCanvas
    cvs1.Initialize(p)
    Dim t As Typeface
    If IsMaterialIcons Then t = Typeface.MATERIALICONS Else t = Typeface.FONTAWESOME
    Dim fnt As B4XFont = xui.CreateFont(t, FontSize)
    Dim r As B4XRect = cvs1.MeasureText(text, fnt)
    Dim BaseLine As Int = cvs1.TargetRect.CenterY - r.Height / 2 - r.Top
    cvs1.DrawText(text, cvs1.TargetRect.CenterX, BaseLine, fnt, color, "CENTER")
    Dim b As B4XBitmap = cvs1.CreateBitmap
    cvs1.Release
    Return b
End Sub
CurveTo function is missing too. Copy that above ChangeMiddleButtonSize
B4X:
'Curve function
Private Sub CurveTo (Path1 As BCPath, ControlPointX As Float, ControlPointY As Float, TargetX As Float, TargetY As Float)
    Dim LastPoint As InternalBCPathPointData = Path1.Points.Get(Path1.Points.Size - 1)
    Dim CurrentX As Float = LastPoint.X
    Dim Currenty As Float = LastPoint.Y
    Dim NumberOfSteps As Int = 8 '<--- change as needed
    Dim dt As Float = 1 / NumberOfSteps
    Dim t As Float = dt
    For i = 1 To NumberOfSteps
        Dim tt1 As Float =  (1 - t) * (1 - t)
        Dim tt2 As Float = 2 * (1 - t) * t
        Dim tt3 As Float = t * t
        Dim x As Float = tt1 * CurrentX + tt2 * ControlPointX + tt3 * TargetX
        Dim y As Float = tt1 * Currenty + tt2 * ControlPointY + tt3 * TargetY
        Path1.LineTo(x, y)
        t = t + dt
    Next
End Sub
And remove the Bitmapcreator.bas from your project.
 
Last edited:

ciprian

Active Member
Licensed User
Longtime User
Thank you, it done now. But an error persists into ASBottomMenu module,
B4X:
    CurveTo(BezierPath, 60, sHeight-1, 90, ((sHeight/3)*2)-5)
    CurveTo(BezierPath, 130, 0, sWidth/2, 1)
    CurveTo(BezierPath, sWidth-130, 0, sWidth-90, ((sHeight/3)*2)-5)
    CurveTo(BezierPath, sWidth-60, sHeight-1, sWidth, sHeight)
The "CurveTo" function : undeclared variable CurveTo is used before it was assigned any value.
 

Brandsum

Well-Known Member
Licensed User
Did you added CurveTo function above ChangeMiddleButtonSize?
 

ciprian

Active Member
Licensed User
Longtime User
I've added you code into ASBottomMenu module as like this:
B4X:
Public Sub ChangeMiddleButtonSize(size As Double, BorderWidth As Double)
    
    asbm_add_background.Height = size
    asbm_add_background.Width = size
    asbm_add_background.SetColorAndBorder(m_BackgroundColor,BorderWidth,xui.Color_White,asbm_add_background.Height/2)
    
    '''''
    'Code for the curve starts here
    '''''
    'shapes view init
    Dim shape,shapeBack As B4XView
    Dim shapePanel,shapeBackPanel As Panel
    shapePanel.Initialize("shape")
    shapeBackPanel.Initialize("shapeBack")
    
    Dim BezierView,BezierBackView As BitmapCreator
    Dim BezierPath As BCPath
    Dim sWidth As Double = size+200
    Dim sHeight As Double = (size/3) + 20
    
    'draw path
    BezierPath.Initialize(0, sHeight)
    CurveTo(BezierPath, 60, sHeight-1, 90, ((sHeight/3)*2)-5)
    CurveTo(BezierPath, 130, 0, sWidth/2, 1)
    CurveTo(BezierPath, sWidth-130, 0, sWidth-90, ((sHeight/3)*2)-5)
    CurveTo(BezierPath, sWidth-60, sHeight-1, sWidth, sHeight)
    BezierPath.LineTo(0,sHeight)
    
    
    'draw background
    BezierView.Initialize(sWidth,sHeight)
    BezierView.DrawPath(BezierPath,asbm_page_background.Color,True,0)
    shapePanel.SetBackgroundImage(BezierView.Bitmap).Gravity = Gravity.FILL
    
    'draw border
    BezierBackView.Initialize(sWidth,sHeight)
    BezierBackView.DrawPath(BezierPath,asbm_parting_line.Color,True,0)
    shapeBackPanel.SetBackgroundImage(BezierBackView.Bitmap).Gravity = Gravity.FILL
    
    'set curve view position and background
    shape = shapePanel
    mBase.AddView(shape,(mBase.Width / 2 - sWidth / 2),0, sWidth, sHeight)
    shape.Top = asbm_parting_line.Top - sHeight + 2dip
    shape.Left = asbm_page_background.Width / 2 - shape.Width /2
    shapeBack = shapeBackPanel
    mBase.AddView(shapeBack,(mBase.Width / 2 - sWidth / 2),0, sWidth, sHeight)
    shapeBack.Top = asbm_parting_line.Top - sHeight + 1dip
    shapeBack.Left = asbm_page_background.Width / 2 - shapeBack.Width /2
    shapeBack.SendToBack
    asbm_add_background.BringToFront
    
    '''''
    'Code for the curve ends here
    '''''
    
    'Top position has been modified for the curve view
    asbm_add_background.Top = asbm_parting_line.Top - asbm_add_background.Height/3
    
    asbm_add_background.Left = asbm_page_background.Width / 2 - asbm_add_background.Width /2

    pnl_asbm_add_icon.Width = asbm_add_background.Width /2.5
    pnl_asbm_add_icon.Height = asbm_add_background.Height /2.5
    
    pnl_asbm_add_icon.Left = asbm_add_background.Width / 2 - pnl_asbm_add_icon.Width /2
    pnl_asbm_add_icon.Top = asbm_add_background.Height / 2 - pnl_asbm_add_icon.Height / 2
End Sub
 

ciprian

Active Member
Licensed User
Longtime User
Sorry, i see it now.
I get an error in compilation:
B4X:
*** Service (starter) Create ***
** Service (starter) Start **
** Activity (main) Create, isFirst = true **
Class not found: b4a.example.asbottommenu, trying: as.bottom.menu.asbottommenu
Error occurred on line: 153 (ASBottomMenu)
java.lang.RuntimeException: Cannot parse: null as boolean
    at anywheresoftware.b4a.BA.parseBoolean(BA.java:612)
    at anywheresoftware.b4a.BA.ObjectToBoolean(BA.java:682)
    at as.bottom.menu.asbottommenu._icontabs4(asbottommenu.java:3235)
    at as.bottom.menu.asbottommenu._designercreateview(asbottommenu.java:2672)
    at java.lang.reflect.Method.invoke(Native Method)
    at anywheresoftware.b4a.shell.Shell.runMethod(Shell.java:732)
    at anywheresoftware.b4a.shell.Shell.raiseEventImpl(Shell.java:351)
    at anywheresoftware.b4a.shell.Shell.raiseEvent(Shell.java:255)
    at java.lang.reflect.Method.invoke(Native Method)
    at anywheresoftware.b4a.ShellBA.raiseEvent2(ShellBA.java:144)
    at anywheresoftware.b4a.BA.raiseEvent2(BA.java:180)
    at anywheresoftware.b4a.objects.CustomViewWrapper.AfterDesignerScript(CustomViewWrapper.java:61)
    at anywheresoftware.b4a.keywords.LayoutBuilder.loadLayout(LayoutBuilder.java:162)
    at anywheresoftware.b4a.objects.ActivityWrapper.LoadLayout(ActivityWrapper.java:209)
    at as.bottom.menu.main._activity_create(main.java:383)
    at java.lang.reflect.Method.invoke(Native Method)
    at anywheresoftware.b4a.shell.Shell.runMethod(Shell.java:732)
    at anywheresoftware.b4a.shell.Shell.raiseEventImpl(Shell.java:351)
    at anywheresoftware.b4a.shell.Shell.raiseEvent(Shell.java:255)
    at java.lang.reflect.Method.invoke(Native Method)
    at anywheresoftware.b4a.ShellBA.raiseEvent2(ShellBA.java:144)
    at as.bottom.menu.main.afterFirstLayout(main.java:104)
    at as.bottom.menu.main.access$000(main.java:17)
    at as.bottom.menu.main$WaitForLayout.run(main.java:82)
    at android.os.Handler.handleCallback(Handler.java:789)
    at android.os.Handler.dispatchMessage(Handler.java:98)
    at android.os.Looper.loop(Looper.java:164)
    at android.app.ActivityThread.main(ActivityThread.java:6541)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767)
** Activity (main) Resume **

Looks like the class is not found, but it's beeing there.
I've attached modiffied project.
 
Last edited:

RWK

Member
Licensed User
Longtime User
B4X:
    Dim shapePanel,shapeBackPanel As Panel

This is not B4X aware. Maybe you could change it to work in B4J also?
 
Cookies are required to use this site. You must accept them to continue using the site. Learn more…