3

我有一个带有嵌套视图 V 的自定义布局,如下所示:LinearLayout L1 ---> LinearLayout L2 ---> View V。

我为 V 注册了一个 OnTouchListener。在触摸事件中,我需要获取触摸事件相对于视图 V 边缘的坐标。

event.getX() 和 event.getY() 返回的值相对于什么?我用谷歌搜索并看到相互矛盾的陈述,有人说这些值已经与视图 V 的边缘相关,但其他人说我需要从 event.getX() 和 event.getY() 中减去视图 V 的边缘坐标以获得相对坐标。

谢谢你的帮助。

4

1 回答 1

5

来自谷歌的文档

getX()方法:

此视图的视觉 x 位置,以像素为单位。这相当于translationX 属性加上当前的left 属性。

setTranslationX()方法:

设置此视图相对于其左侧位置的水平位置。除了对象的布局放置它的任何位置之外,这有效地定位了布局后的对象。

getLeft()方法:

此视图相对于其父视图的左侧位置。

因此,getX() 返回视图相对于其父视图的水平位置。

更新:

因为event.getX()你得到的结果也是相对于父母的。您可以通过在水平居中的 RelativeLayout 中放置一个按钮来进行简单的测试,并在单击按钮时检查值

在您的布局 xml 中:

<RelativeLayout
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" android:layout_centerHorizontal="true">

    <Button
        android:id="@+id/button1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Button" />

</RelativeLayout>

在您的活动中:

    mBtn = ((Button) findViewById( R.id.button1 ));
    mBtn.setOnTouchListener( new OnTouchListener() {

        @Override
        public boolean onTouch(View v, MotionEvent event) {
            Log.d("", "getX = " + event.getX());
            return false;
        }
    });

如果单击其左边距的按钮,您将获得接近 0.0 的值。

于 2012-06-01T18:15:34.770 回答