在Android中,我可以获取视图相对于Activity根布局的x和y位置吗?
我认为最好的方法是定义您想要检查的父级,如果您想要根,则选择它。
为此,我编写了一个简单通用的函数:
fun getPositionRelativeToParent(view: View, parentToReach: View): Point {
var currentView: View? = view.parent as View?
val result = Point(view.left, view.top)
while (true) {
if (currentView == null || currentView == parentToReach)
break
result.set(result.x + currentView.left, result.y + currentView.top)
currentView = currentView.parent as View?
}
return result
}
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val mainContainer = findViewById<View>(R.id.mainContainer)
val viewToInspect = findViewById<View>(R.id.viewToInspect)
val viewToMove = findViewById<View>(R.id.viewToMove)
findViewById<View>(android.R.id.content).doOnPreDraw {
val pos = getPositionRelativeToParent(viewToInspect, mainContainer)
Log.d("AppLog", "getPositionRelativeToParent:$pos")
viewToMove.updateLayoutParams<MarginLayoutParams> {
leftMargin=pos.x
topMargin=pos.y
}
}
}
}
XML:
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/mainContainer" android:layout_width="match_parent"
android:layout_height="match_parent" tools:context=".MainActivity">
<LinearLayout
android:layout_width="match_parent" android:layout_height="wrap_content"
android:layout_margin="10dp" android:gravity="center_horizontal"
android:orientation="vertical">
<TextView
android:layout_width="100dp" android:layout_height="100dp" android:gravity="center"
android:text="1" />
<TextView
android:id="@+id/viewToInspect" android:layout_width="100dp" android:layout_height="100dp"
android:background="#ff00ff00" android:gravity="center_horizontal" android:text="2"
android:textColor="#00f" />
</LinearLayout>
<TextView
android:id="@+id/viewToMove" android:layout_width="100dp" android:layout_height="100dp"
android:background="#66ff0000" android:gravity="center" android:text="3"
android:textColor="#0ff" />
</FrameLayout>