1

我的 MotionEvent 和我的布局似乎给出了不同的位置值,我不知道为什么。我定义一个图像如下:

<ImageView
    android:id="@+id/pic"
    android:layout_width="17dp"
    android:layout_height="17dp"
    android:layout_marginLeft="72dp"
    android:layout_marginTop="72dp"
    android:src="@drawable/pic" />

这会将图像放置在我正在测试的模拟器上以像素为单位的 (144, 144) 处,因为它的密度为 2.0。像素位置由 log.v 确认,图像的父级只是布局。

我有一个 onTouchListener 并在 MotionEvent 中检查触摸的位置:

Log.v("pixelsX", String.valueOf(event.getX()));
Log.v("pixelsY", String.valueOf(event.getY()));

当我单击我在 XML 中设置的图像的上方和左侧时,我得到的值是 160 及以上,这显然是错误的。这将对应于 80+ 的 DP 位置,即使点击远在图像之前。

如果我尝试在单击位置 image.setX(event.getX()) (尝试使用 setX/setY 和参数)添加图像,则图像将放置在单击的下方和右侧约 40 像素。图像没有额外的填充或任何东西,我尝试使用不同的图像并且它们之间是一致的。图像的父级始终是布局,并且布局连接到 ontouchlistener:

RelativeLayout layout = (RelativeLayout)findViewById(R.id.activity_mine);
layout.setOnTouchListener(touch);

所以我无法弄清楚为什么会有这种位置差异。

4

2 回答 2

1

我解决了这个问题; 当我创建活动填充时,将其放入 RelativeLayout 的 xml 中,导致图像的位置被填充关闭。

于 2013-05-29T14:34:24.360 回答
0

在这里查看这张图表我从这个网站上得到的,每个屏幕尺寸的设备可能不同,检查你的数字与这张图表相比

xlarge screens are at least 960dp x 720dp
large screens are at least 640dp x 480dp
normal screens are at least 470dp x 320dp
small screens are at least 426dp x 320dp
Generalised Dpi values for screens:

ldpi Resources for low-density (ldpi) screens (~120dpi)
mdpi Resources for medium-density (mdpi) screens (~160dpi). (This is     the baseline     density.)
hdpi Resources for high-density (hdpi) screens (~240dpi).
xhdpi Resources for extra high-density (xhdpi) screens (~320dpi).
Therefore generalised size of your resources (assuming they are full    screen):

ldpi
Vertical = 426 * 120 / 160 = 319.5px
Horizontal = 320 * 120 / 160 = 240px
mdpi
Vertical = 470 * 160 / 160 = 470px
Horizontal = 320 * 160 / 160 = 320px
hdpi
Vertical = 640 * 240 / 160 = 960px
Horizontal = 480 * 240 / 160 = 720px
xhdpi
Vertical = 960 * 320 / 160 = 1920px
Horizontal = 720 * 320 / 160 = 1440px

px = dp*dpi/160

这是一种将 dp 转换为像素的方法,如果它派上用场的话

public static int dpToPixels(Context context, float dp) {
final float scale = context.getResources().getDisplayMetrics().density;
return (int) (dp * scale + 0.5f);
}
于 2013-05-29T04:25:32.563 回答