获取视图相对于根布局的坐标

155

在Android中,我可以获取视图相对于Activity根布局的x和y位置吗?

11个回答

0

我认为最好的方法是定义您想要检查的父级,如果您想要根,则选择它。

为此,我编写了一个简单通用的函数:

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
}

请注意,您需要在Views找到要定位的位置之后使用它。
以下是一个例子。假设您有两个Views。一个深深地嵌套在内部,另一个是共同父级的子级。两者大小相同,需要定位,一个在另一个上面。
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>

你可以看到一个视图在另一个视图的上方。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接