【问题标题】:Android difference in pixel positionAndroid像素位置差异
【发布时间】:2013-05-29 01:58:02
【问题描述】:

我的 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);

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

【问题讨论】:

  • 我不熟悉MotionEvent,但看起来getX()/getY()返回相对于整个屏幕的X/Y位置?
  • 布局将是整个屏幕,不是吗?虽然我相信 getRawX() 是相对于整个屏幕的绝对位置,但无论哪种方式 getRawX() 和 getX() 返回相同的值。布局是整个屏幕,不是吗?我相信 getX() 返回与 getRawX() 相同的结果会证实这一点,因为 onTouchListener 已设置为布局。

标签: android touch-event ontouchlistener


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    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);
    }
    

    【讨论】:

    • Tx 我已经有了。与 dp 和 px 之间的转换不是问题;无论事件在屏幕上的哪个位置,它都会以固定的量关闭。如果我单击 130,130,图像将放置在 160,160 左右,如果我单击 0,0,图像将放置在 30,30 左右。触摸事件在屏幕上的显示位置以及为事件提供的坐标始终处于关闭状态。
    • 或者更好的是,尝试使用不同的屏幕尺寸模拟器,然后使用该信息来缩小问题的范围
    • 感谢您的帮助!这就是为什么我应该放置整个 XML 代码的原因!
    • 没问题,很高兴你知道了
    猜你喜欢
    • 2012-02-28
    • 1970-01-01
    • 2013-07-16
    • 2012-08-02
    • 1970-01-01
    • 1970-01-01
    • 2017-08-02
    • 2016-06-06
    • 2018-05-02
    相关资源
    最近更新 更多