使用setOnTouchListener获取触摸坐标

时间:2011-08-15 20:34:02

标签: java android view

我正在编写我的第一个Android应用程序(我不是java的新手)。继承我的问题: 我使用ImageView来显示图形。我想写一个方法,当触摸ImageView时调用thas并将触摸坐标作为参数。

这是我目前的解决方案:

img.setOnTouchListener(new View.OnTouchListener() {
        public boolean onTouch(View v, MotionEvent e) {
            clickfield((int) e.getX(), (int) e.getY());
            toast.setText((int) e.getX() + ", " + (int) e.getY());
            toast.show();
            return true;
        }
    });  

...

public void clickfield(int x, int y) {
   ...
}

我有两个问题: 首先,它返回的坐标不是手机上的真实坐标。我的vm分辨率为480 x 800像素。由于ImageView的大小为480 * 480像素,因此y值应介于0和480之间。此值可以在0到320之间。这可以通过将其乘以1.5来解决,但这对我来说没有意义。

第二个问题是作为ImageView内容的480 * 480位图出现在屏幕中间。我更喜欢在顶部显示它,特别是因为上面的代码检测到类似0,72的东西,如果我触摸图像的左上角而不是0,0。 我必须更改图像视图的哪个属性?

如果有任何参考/教程可以回答我的问题,那么只要发布链接就足够了。

我的xml布局:

<?xml version="1.0" encoding="utf-8"?> 
  <LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical"
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent"> 
    <ImageView 
      android:src="@drawable/icon" 
      android:id="@+id/ImgTest" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:clickable="true" 
      android:layout_gravity="top">
    </ImageView> 
</LinearLayout>

1 个答案:

答案 0 :(得分:1)

您获得的坐标与侦听器所连接的(图像)视图相关。 您的图像会缩放以适合该视图。所以你的观点是320px宽或高。 如果要获取实际的像素坐标,则必须从视图宽度/高度和图像坐标计算出来。几乎和你一样,但有一个动态因素,因为你会得到不同的屏幕尺寸。

实际图像的定位也与此有关。如果图像大于或小于您的视图,则会在保持其宽高比的同时调整大小。如果这与您的屏幕宽高比不匹配,您将获得一些边框。要将图像放置在布局的顶部,您应该让ImageView自动将其高度调整为所需的图像大小。您可以通过在布局文件中设置android:layout_heightwrap_contentImageView标记内)来实现。如果它仍然位于中间,您可能还需要调整外部布局重力。请参阅android:gravity(此处您想要的是top)。