B4A Class [B4X] [XUI] AS BottomMenu

Discussion in 'Additional libraries, classes and official updates' started by Alexander Stolte, Aug 16, 2018.

  1. Alexander Stolte

    Alexander Stolte Well-Known Member Licensed 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.
     
    jimmyF likes this.
  2. Brandsum

    Brandsum Member Licensed User

    Thanks for the appreciation. @Alexander Stolte Yes a checkbox will be a better option. ;)
     
    Last edited: Nov 25, 2018
  3. ciprian

    ciprian Active Member Licensed User

    Hello @Alexander Stolte , any news about a 2.0 version of this class, with the integration of @Brandsum code modification?
    This is looking briliant.
    Can't wait.
     
  4. Alexander Stolte

    Alexander Stolte Well-Known Member Licensed User

    Unfortunately I don't have time for the menu at the moment. :rolleyes:
     
  5. ciprian

    ciprian Active Member Licensed User

    Thank you for your fast reply. I understand. ;)
    Maybe @Brandsum can share with us his modified example project. :cool:
     
  6. Brandsum

    Brandsum 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.
     
  7. ciprian

    ciprian Active Member Licensed User

    This is what i've allready tried, but i don't find the ChangeMiddleButtonSize sub.
    I will retry this morning.
    Thank you.
     
  8. Alexander Stolte

    Alexander Stolte Well-Known Member Licensed User

    under "Quick Search" type "ChangeMiddleButtonSize"
     
  9. ciprian

    ciprian Active Member Licensed 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.
     

    Attached Files:

  10. Brandsum

    Brandsum 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.

    Code:
    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(
    00032dip32dip)
        
    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
    Code:
    '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: Jan 11, 2019
    DonManfred likes this.
  11. ciprian

    ciprian Active Member Licensed User

    Thank you, it done now. But an error persists into ASBottomMenu module,
    Code:
    CurveTo(BezierPath, 60, sHeight-190, ((sHeight/3)*2)-5)
        CurveTo(BezierPath, 
    1300, sWidth/21)
        CurveTo(BezierPath, sWidth-
    1300, 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.
     
  12. Brandsum

    Brandsum Member Licensed User

    Did you added CurveTo function above ChangeMiddleButtonSize?
     
  13. ciprian

    ciprian Active Member Licensed User

    I've added you code into ASBottomMenu module as like this:
    Code:
    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-190, ((sHeight/3)*2)-5)
        CurveTo(BezierPath, 
    1300, sWidth/21)
        CurveTo(BezierPath, sWidth-
    1300, 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
     
  14. Brandsum

    Brandsum Member Licensed User

  15. ciprian

    ciprian Active Member Licensed User

    Sorry, i see it now.
    I get an error in compilation:
    Code:
    *** 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 
    parsenull 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: Jan 11, 2019
  16. ciprian

    ciprian Active Member Licensed User

    Example project
     

    Attached Files:

  17. Brandsum

    Brandsum Member Licensed User

    This project worked fine!! Dont know why you are getting this error.

    Try to check EnableMiddleButtonAsPage from designer and build project then again uncheck and build your project.
     
  18. RWK

    RWK Member Licensed User

    Code:
    Dim shapePanel,shapeBackPanel As Panel
    This is not B4X aware. Maybe you could change it to work in B4J also?
     
  19. ciprian

    ciprian Active Member Licensed User

    @Brandsum - It works. i had to open, save and close designer.
    Thank you for your help, and thank @Alexander Stolte for this class.
     
    Brandsum likes this.
  20. wizard699

    wizard699 Active Member Licensed User

    It's possible to change the default (white) color of Icons?
     
Loading...
  1. This site uses cookies to help personalise content, tailor your experience and to keep you logged in if you register.
    By continuing to use this site, you are consenting to our use of cookies.
    Dismiss Notice