ထာ့ထာ့ေစာလျငး Basic4android ်ဖငးံ Android Application ေရ့နညး့ (ဿ)
Appendix
Source Code for
ClsSlidingSidebar Class Module
Sub Class_Globals
Private pnlContent As Panel
Private pnlSidebar As Panel
Private pnlGesture As Panel
Private sbParent As Panel
Private sbPosition As Byte
Private sbAnimType As Byte
Private sbInterpolator As Float
Private sbAnimInProgress As Byte
Private sbStopAnim As Boolean
Private sbOpenDuration As Int
Private sbCloseDuration As Int
Private sbIsVisible As Boolean
Private sbIsOpening As Boolean
Private sbStartX, sbStartY As Int
Private pnlSidebarStartX, pnlSidebarStartY As Int
Private pnlContentStartX, pnlContentStartY As Int
Private sbHandle As View
Private sbFinalMovement As Byte
Private sbSubFullyOpen As String
Private sbSubFullyClosed As String
Private sbSubMove As String
Private sbModule As Object
Private FROM_OPEN As Boolean: FROM_OPEN = True
Private FROM_CLOSE As Boolean: FROM_CLOSE = False
Private OPEN_ANIM As Boolean: OPEN_ANIM = False
Private CLOSE_ANIM As Boolean: CLOSE_ANIM = True
Private OPENING As Byte: OPENING = 1
Private CLOSING As Byte: CLOSING = 2
End Sub
730
ထာ့ထာ့ေစာလျငး Basic4android ်ဖငးံ Android Application ေရ့နညး့ (ဿ)
Public Sub Initialize(Parent As Panel, SidebarSize As Int, SidebarPosition As Byte, AnimType As Byte,
OpenDuration As Int, CloseDuration As Int)
sbParent = Parent
[Link]("Block")
[Link](pnlContent, 0, 0, getParentWidth, getParentHeight)
[Link]("Block")
Select SidebarPosition
Case 0 'LEFT
If AnimType = 0 Then
[Link](pnlSidebar, 0, 0, SidebarSize, getParentHeight)
Else
[Link](pnlSidebar, -SidebarSize, 0, SidebarSize,
getParentHeight)
End If
Case 1 'RIGHT
If AnimType = 0 Then
[Link](pnlSidebar, getParentWidth - SidebarSize, 0,
SidebarSize, getParentHeight)
Else
[Link](pnlSidebar, getParentWidth, 0, SidebarSize,
getParentHeight)
End If
Case 2 'TOP
If AnimType = 0 Then
[Link](pnlSidebar, 0, 0, getParentWidth, SidebarSize)
Else
[Link](pnlSidebar, 0, -SidebarSize, getParentWidth,
SidebarSize)
End If
Case 3 'BOTTOM
If AnimType = 0 Then
[Link](pnlSidebar, 0, getParentHeight - SidebarSize,
getParentWidth, SidebarSize)
Else
[Link](pnlSidebar, 0, getParentHeight, getParentWidth,
SidebarSize)
End If
End Select
731
ထာ့ထာ့ေစာလျငး Basic4android ်ဖငးံ Android Application ေရ့နညး့ (ဿ)
If AnimType = 0 Then [Link]
sbPosition = SidebarPosition
sbAnimType = AnimType
sbInterpolator = 0.7
sbOpenDuration = OpenDuration
sbCloseDuration = CloseDuration
sbIsVisible = False
End Sub
Private Sub Block_Touch(Action As Int, X As Float, Y As Float)
End Sub
Public Sub LoadDrawable(Name As String) As Object
Dim r As Reflector
[Link] = [Link]
[Link] = [Link]("getResources")
[Link] = [Link]("getSystem")
Dim ID_Drawable As Int
ID_Drawable = r.RunMethod4("getIdentifier", Array As Object(Name, "drawable", "android"), _
Array As String("[Link]", "[Link]",
"[Link]"))
[Link] = [Link]
[Link] = [Link]("getResources")
Return r.RunMethod2("getDrawable", ID_Drawable, "[Link]")
End Sub
Public Sub SetOnChangeListeners(Module As Object, SubOnFullyOpen As String, SubOnFullyClosed As
String, SubOnMove As String)
sbModule = Module
sbSubFullyOpen = SubOnFullyOpen
sbSubFullyClosed = SubOnFullyClosed
sbSubMove = SubOnMove
End Sub
Public Sub Sidebar As Panel
Return pnlSidebar
End Sub
732
ထာ့ထာ့ေစာလျငး Basic4android ်ဖငးံ Android Application ေရ့နညး့ (ဿ)
Public Sub ContentPanel As Panel
Return pnlContent
End Sub
#Region Parent Width/Height
Private Sub getParentWidth As Int
If [Link] < 0 Then
Dim r As Reflector, RealWidth As Int
[Link] = sbParent
RealWidth = [Link]("getWidth")
If RealWidth = 0 Then
DoEvents
RealWidth = [Link]("getWidth")
End If
Return RealWidth
Else
Return [Link]
End If
End Sub
Private Sub getParentHeight As Int
If [Link] < 0 Then
Dim r As Reflector, RealHeight As Int
[Link] = sbParent
RealHeight = [Link]("getHeight")
If RealHeight = 0 Then
DoEvents
RealHeight = [Link]("getHeight")
End If
Return RealHeight
Else
Return [Link]
End If
End Sub
#End Region
#Region Animation
Public Sub SetInterpolator(Value As Float)
sbInterpolator = Value
733
ထာ့ထာ့ေစာလျငး Basic4android ်ဖငးံ Android Application ေရ့နညး့ (ဿ)
End Sub
Private Sub Animate(Progression As Int)
Select sbPosition
Case 0 'LEFT
If sbAnimType > 0 Then [Link] = pnlSidebarStartX + Progression
If sbAnimType < 2 Then [Link] = pnlContentStartX + Progression
If sbAnimType = 2 Then
If [Link] Then [Link] = [Link] +
[Link]
If [Link] Then [Link] = [Link] +
[Link] - ([Link] / 2)
Else
If [Link] Then [Link] = [Link]
If [Link] Then [Link] = [Link] -
([Link] / 2)
End If
Case 1 'RIGHT
If sbAnimType > 0 Then [Link] = pnlSidebarStartX + Progression
If sbAnimType < 2 Then [Link] = pnlContentStartX + Progression
If sbAnimType = 2 Then
If [Link] Then [Link] = [Link] -
[Link]
If [Link] Then [Link] = [Link] -
([Link] / 2)
Else
If [Link] Then [Link] = [Link] +
[Link] - [Link]
If [Link] Then [Link] = [Link] +
[Link] - ([Link] / 2)
End If
Case 2 'TOP
If sbAnimType > 0 Then [Link] = pnlSidebarStartY + Progression
If sbAnimType < 2 Then [Link] = pnlContentStartY + Progression
If sbAnimType = 2 Then
If [Link] Then [Link] = [Link] +
[Link]
If [Link] Then [Link] = [Link] +
[Link] - ([Link] / 2)
734
ထာ့ထာ့ေစာလျငး Basic4android ်ဖငးံ Android Application ေရ့နညး့ (ဿ)
Else
If [Link] Then [Link] = [Link]
If [Link] Then [Link] = [Link] -
([Link] / 2)
End If
Case 3 'BOTTOM
If sbAnimType > 0 Then [Link] = pnlSidebarStartY + Progression
If sbAnimType < 2 Then [Link] = pnlContentStartY + Progression
If sbAnimType = 2 Then
If [Link] Then [Link] = [Link] -
[Link]
If [Link] Then [Link] = [Link] -
([Link] / 2)
Else
If [Link] Then [Link] = [Link] +
[Link] - [Link]
If [Link] Then [Link] = [Link] +
[Link] - ([Link] / 2)
End If
End Select
sbIsVisible = (CalcDistance(FROM_CLOSE) <> 0)
End Sub
Private Sub AnimateSidebar(Close As Boolean)
Dim AnimDistance, AnimDuration As Int
Dim PctStillToMove As Float
If Close Then
AnimDistance = CalcDistance(FROM_CLOSE)
PctStillToMove = Abs(AnimDistance) / [Link]
AnimDuration = sbCloseDuration * PctStillToMove
sbAnimInProgress = CLOSING
Else
AnimDistance = CalcDistance(FROM_OPEN)
PctStillToMove = Abs(AnimDistance) / [Link]
AnimDuration = sbOpenDuration * PctStillToMove
sbAnimInProgress = OPENING
End If
If AnimDistance = 0 Then
sbAnimInProgress = 0
735
ထာ့ထာ့ေစာလျငး Basic4android ်ဖငးံ Android Application ေရ့နညး့ (ဿ)
TriggerFinalEvent
Return
End If
pnlSidebarStartX = [Link]
pnlSidebarStartY = [Link]
pnlContentStartX = [Link]
pnlContentStartY = [Link]
sbStopAnim = False
Dim Progression As Float
Dim EndTime, DeltaTime As Long
EndTime = [Link] + AnimDuration
Do While [Link] < EndTime
DeltaTime = EndTime - [Link]
Animate(Power(1 - (DeltaTime / AnimDuration), sbInterpolator) * AnimDistance)
If SubExists(sbModule, sbSubMove) Then
CallSub2(sbModule, sbSubMove, Not(Close))
End If
DoEvents 'Processes the draw messages and keeps the UI responsive
If sbStopAnim Then
DeltaTime = 0
Exit
End If
Loop
If DeltaTime <> 0 Then Animate(AnimDistance)
sbAnimInProgress = 0
TriggerFinalEvent
End Sub
#End Region
Public Sub OpenSidebar
If sbAnimInProgress = CLOSING Then
sbStopAnim = True
CallSubDelayed2(Me, "AnimateSidebar", OPEN_ANIM)
Else If sbAnimInProgress = 0 Then
AnimateSidebar(OPEN_ANIM)
End If
End Sub
736
ထာ့ထာ့ေစာလျငး Basic4android ်ဖငးံ Android Application ေရ့နညး့ (ဿ)
Public Sub CloseSidebar
If sbAnimInProgress = OPENING Then
sbStopAnim = True
CallSubDelayed2(Me, "AnimateSidebar", CLOSE_ANIM)
Else If sbAnimInProgress = 0 Then
AnimateSidebar(CLOSE_ANIM)
End If
End Sub
Public Sub IsSidebarVisible As Boolean
Return sbIsVisible
End Sub
#Region Button, handle & swipe gesture
Public Sub SetOpenCloseButton(Btn As View)
If Btn = Null Then Return
Dim r As Reflector
[Link] = Btn
[Link]("Btn_Click")
End Sub
Private Sub Btn_Click(ViewTag As Object)
If IsSidebarVisible Then
If sbAnimInProgress = CLOSING Then
OpenSidebar
Else
CloseSidebar
End If
Else
OpenSidebar
End If
End Sub
Public Sub AddOpenCloseHandle(Hdl As View, Position As Int, Width As Int, Height As Int, FinalMovement
As Byte)
If Hdl = Null Then Return
sbHandle = Hdl
Select sbPosition
737
ထာ့ထာ့ေစာလျငး Basic4android ်ဖငးံ Android Application ေရ့နညး့ (ဿ)
Case 0 'LEFT
[Link](Hdl, [Link], Position, Width, Height)
Case 1 'RIGHT
[Link](Hdl, [Link] + [Link] - Width, Position,
Width, Height)
Case 2 'TOP
[Link](Hdl, Position, [Link], Width, Height)
Case 3 'BOTTOM
[Link](Hdl, Position, [Link] + [Link] - Height,
Width, Height)
End Select
sbFinalMovement = FinalMovement
Dim r As Reflector
[Link] = Hdl
[Link]("Gesture_onTouch")
End Sub
Public Sub EnableSwipeGesture(Enabled As Boolean, GestureAreaSize As Int, FinalMovement As Byte)
If Not(Enabled) Then
If [Link] Then [Link]
pnlGesture = Null
Return
End If
If [Link] Then
Select sbPosition
Case 0 'LEFT
[Link]([Link] - (GestureAreaSize / 2), 0,
GestureAreaSize, getParentHeight)
Case 1 'RIGHT
[Link]([Link] + [Link] -
(GestureAreaSize / 2), 0, GestureAreaSize, getParentHeight)
Case 2 'TOP
[Link](0, [Link] - (GestureAreaSize / 2),
getParentWidth, GestureAreaSize)
Case 3 'BOTTOM
[Link](0, [Link] + [Link] -
(GestureAreaSize / 2), getParentWidth, GestureAreaSize)
738
ထာ့ထာ့ေစာလျငး Basic4android ်ဖငးံ Android Application ေရ့နညး့ (ဿ)
End Select
Else
[Link]("")
Select sbPosition
Case 0 'LEFT
[Link](pnlGesture, [Link] - (GestureAreaSize / 2),
0, GestureAreaSize, getParentHeight)
Case 1 'RIGHT
[Link](pnlGesture, [Link] + [Link] -
(GestureAreaSize / 2), 0, GestureAreaSize, getParentHeight)
Case 2 'TOP
[Link](pnlGesture, 0, [Link] - (GestureAreaSize /
2), getParentWidth, GestureAreaSize)
Case 3 'BOTTOM
[Link](pnlGesture, 0, [Link] + [Link] -
(GestureAreaSize / 2), getParentWidth, GestureAreaSize)
End Select
Dim r As Reflector
[Link] = pnlGesture
[Link]("Gesture_onTouch")
End If
sbFinalMovement = FinalMovement
End Sub
#End Region
Private Sub CalcDistance(FromOpen As Boolean) As Int
Select sbPosition
Case 0 'LEFT
If sbAnimType = 2 Then
If FromOpen Then
Return - [Link]
Else
Return - [Link] - [Link]
End If
Else
If FromOpen Then
Return [Link] - [Link]
Else
739
ထာ့ထာ့ေစာလျငး Basic4android ်ဖငးံ Android Application ေရ့နညး့ (ဿ)
Return - [Link]
End If
End If
Case 1 'RIGHT
If sbAnimType = 2 Then
If FromOpen Then
Return - [Link] + [Link] -
[Link]
Else
Return - [Link] + [Link]
End If
Else
If FromOpen Then
Return - [Link] - [Link]
Else
Return - [Link]
End If
End If
Case 2 'TOP
If sbAnimType = 2 Then
If FromOpen Then
Return - [Link]
Else
Return - [Link] - [Link]
End If
Else
If FromOpen Then
Return [Link] - [Link]
Else
Return - [Link]
End If
End If
Case 3 'BOTTOM
If sbAnimType = 2 Then
If FromOpen Then
Return - [Link] + [Link] -
[Link]
Else
Return - [Link] + [Link]
740
ထာ့ထာ့ေစာလျငး Basic4android ်ဖငးံ Android Application ေရ့နညး့ (ဿ)
End If
Else
If FromOpen Then
Return - [Link] - [Link]
Else
Return - [Link]
End If
End If
End Select
End Sub
Private Sub Gesture_onTouch(ViewTag As Object, Action As Int, X As Float, Y As Float, MotionEvent As
Object) As Boolean
If Action = 0 Then
sbStopAnim = True
sbStartX = X
sbStartY = Y
Else If Action = 2 Then
Dim OldPos As Int
Select sbPosition
Case 0 'LEFT
If sbAnimType = 2 Then
OldPos = [Link]
[Link] = Max(-[Link], Min([Link]
+ X - sbStartX, 0))
If [Link] Then [Link] = [Link] -
OldPos + [Link]
If [Link] Then [Link] =
[Link] - OldPos + [Link]
Else
OldPos = [Link]
[Link] = Max(0, Min([Link] + X - sbStartX,
[Link]))
If sbAnimType = 1 Then [Link] = [Link] -
[Link]
If [Link] Then [Link] = [Link] -
OldPos + [Link]
741
ထာ့ထာ့ေစာလျငး Basic4android ်ဖငးံ Android Application ေရ့နညး့ (ဿ)
If [Link] Then [Link] =
[Link] - OldPos + [Link]
End If
sbIsOpening = X > sbStartX
Case 1 'RIGHT
If sbAnimType = 2 Then
OldPos = [Link]
[Link] = Max([Link] - [Link],
Min([Link] + X - sbStartX, [Link]))
If [Link] Then [Link] = [Link] -
OldPos + [Link]
If [Link] Then [Link] =
[Link] - OldPos + [Link]
Else
OldPos = [Link]
[Link] = Max(-[Link], Min([Link]
+ X - sbStartX, 0))
If sbAnimType = 1 Then [Link] = [Link] +
[Link]
If [Link] Then [Link] = [Link] -
OldPos + [Link]
If [Link] Then [Link] =
[Link] - OldPos + [Link]
End If
sbIsOpening = X < sbStartX
Case 2 'TOP
If sbAnimType = 2 Then
OldPos = [Link]
[Link] = Max(-[Link], Min([Link]
+ Y - sbStartY, 0))
If [Link] Then [Link] = [Link] -
OldPos + [Link]
If [Link] Then [Link] =
[Link] - OldPos + [Link]
Else
OldPos = [Link]
[Link] = Max(0, Min([Link] + Y - sbStartY,
[Link]))
742
ထာ့ထာ့ေစာလျငး Basic4android ်ဖငးံ Android Application ေရ့နညး့ (ဿ)
If sbAnimType = 1 Then [Link] = [Link] -
[Link]
If [Link] Then [Link] = [Link] -
OldPos + [Link]
If [Link] Then [Link] =
[Link] - OldPos + [Link]
End If
sbIsOpening = Y > sbStartY
Case 3 'BOTTOM
If sbAnimType = 2 Then
OldPos = [Link]
[Link] = Max([Link] - [Link],
Min([Link] + Y - sbStartY, [Link]))
If [Link] Then [Link] = [Link] -
OldPos + [Link]
If [Link] Then [Link] =
[Link] - OldPos + [Link]
Else
OldPos = [Link]
[Link] = Max(-[Link], Min([Link]
+ Y - sbStartY, 0))
If sbAnimType = 1 Then [Link] = [Link] +
[Link]
If [Link] Then [Link] = [Link] -
OldPos + [Link]
If [Link] Then [Link] =
[Link] - OldPos + [Link]
End If
sbIsOpening = Y < sbStartY
End Select
sbIsVisible = (CalcDistance(FROM_CLOSE) <> 0)
If SubExists(sbModule, sbSubMove) Then
If sbIsOpening Then
CallSub2(sbModule, sbSubMove, True)
Else
CallSub2(sbModule, sbSubMove, False)
End If
End If
743
ထာ့ထာ့ေစာလျငး Basic4android ်ဖငးံ Android Application ေရ့နညး့ (ဿ)
Else If Action = 1 Then
If sbFinalMovement > 0 AND sbIsVisible Then
If sbFinalMovement = 2 Then sbIsOpening = Abs(CalcDistance(FROM_CLOSE))
>= Abs(CalcDistance(FROM_OPEN))
If sbIsOpening Then
CallSubDelayed2(Me, "AnimateSidebar", OPEN_ANIM)
Else
CallSubDelayed2(Me, "AnimateSidebar", CLOSE_ANIM)
End If
Else
TriggerFinalEvent
End If
End If
Return True
End Sub
Sub TriggerFinalEvent
If CalcDistance(FROM_OPEN) = 0 AND SubExists(sbModule, sbSubFullyOpen) Then
CallSub(sbModule, sbSubFullyOpen)
Else If CalcDistance(FROM_CLOSE) = 0 AND SubExists(sbModule, sbSubFullyClosed) Then
CallSub(sbModule, sbSubFullyClosed)
End If
End Sub
Reference: [Link]
744