'-----------------------------------------------------------------------------------------------------------------
' Get this Views relative position on the screen
'-----------------------------------------------------------------------------------------------------------------
Public Sub GetRelativeLT(V As JavaObject) As TRelativeLT
Dim RelativeLT As TRelativeLT
RelativeLT.Initialize
Return GetRelative_LT(RelativeLT, V)
End Sub
Private Sub GetRelative_LT(RelativeLT As TRelativeLT, V As JavaObject) As TRelativeLT
Try
'-----------------------------------------------------------------------------------------------------------------
' Just in case the Passed Structure has not been Initialized
'-----------------------------------------------------------------------------------------------------------------
If RelativeLT.IsInitialized = False Then
RelativeLT.Initialize
End If
'-----------------------------------------------------------------------------------------------------------------
' Get the Parent to this View
'-----------------------------------------------------------------------------------------------------------------
Dim parent As Object = V.RunMethod("getParent", Null)
'-----------------------------------------------------------------------------------------------------------------
' If Parent is Null then Done
'-----------------------------------------------------------------------------------------------------------------
If parent = Null Then
Return RelativeLT
End If
'-----------------------------------------------------------------------------------------------------------------
' If Parent Type is ANY of these we are Done
'-----------------------------------------------------------------------------------------------------------------
Dim parentType As String = GetType(parent)
'-----------------------------------------------------------------------------------------------------------------
' It turns out that if we get the Parent of the ScrollView we can work our way right down the children
'-----------------------------------------------------------------------------------------------------------------
If parentType = "anywheresoftware.b4a.objects.ScrollViewWrapper$MyScrollView" Then
V = parent
parent = V.RunMethod("getParent", Null)
If parent = Null Then
Return RelativeLT
End If
End If
'-----------------------------------------------------------------------------------------------------------------
' If it is a ViewPager - we just need to keep going - SEEMS to handle TabStrip
'-----------------------------------------------------------------------------------------------------------------
If parentType = "androidx.viewpager.widget.ViewPager" Then
Return GetRelative_LT(RelativeLT, parent)
End If
If parentType = "android.view.ViewRoot" Then Return RelativeLT
If parentType = "android.view.ViewRootImpl" Then Return RelativeLT
If parentType = "android.widget.FrameLayout" Then Return RelativeLT
If parentType = "android.widget.FrameLayout$LayoutParams" Then Return RelativeLT
If parentType = "anywheresoftware.b4a.BALayout$LayoutParams" Then Return RelativeLT
If parentType = "anywheresoftware.b4a.objects.HorizontalScrollViewWrapper$MyHScrollView" Then Return RelativeLT
If parentType = "anywheresoftware.b4a.objects.IME$ExtendedBALayout" Then Return RelativeLT
If parentType = "flm.b4a.scrollview2d.ScrollView2DWrapper$MyScrollView" Then Return RelativeLT
'-----------------------------------------------------------------------------------------------------------------
' OK - ADD on this Views Left and Top variables
'-----------------------------------------------------------------------------------------------------------------
Dim VW As View = V
RelativeLT.Left = RelativeLT.Left + VW.Left
RelativeLT.Top = RelativeLT.Top + VW.Top
#if debug
Log("RelativeLT (l/t):" &RelativeLT.Left &" / " &RelativeLT.Top &" View (l/t):" &VW.Left &" / " &VW.Top &" (w/h):" &VW.Width &" / " &VW.Height)
#end If
'-----------------------------------------------------------------------------------------------------------------
' Get the settings for our Parent
'-----------------------------------------------------------------------------------------------------------------
Return GetRelative_LT(RelativeLT, parent)
Catch
'-----------------------------------------------------------------------------------------------------------------
' I DO NOT like just catching errors
' But if we are here then I have missed some new type Log a then Exception msg
'-----------------------------------------------------------------------------------------------------------------
Log("GetRelative_LT - Error" &LastException.Message)
Return RelativeLT
End Try
End Sub