1

好的,现在我知道这个问题似乎有一个明显的答案,但 setX 和 setY 函数确实有什么问题,为什么它们不能按预期工作。我正在尝试在应用程序运行到某些位置时动态移动视图。它们在我的带有 mdp 的测试设备上运行良好,但是当我使用具有不同密度值的设备时一切都会改变。Y 轴总是偏离一个恒定值,并且没有这不是填充或边距问题,我什至尝试将其除以context.getResources().getDisplayMetrics().density; 考虑密度差异,但它也不起作用。最后我在这篇文章中使用了答案并且它有效,但我仍然遇到其他密度设备的问题。这就是它的建议:

RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT);
//WRAP_CONTENT param can be FILL_PARENT
params.leftMargin = 206; //XCOORD
params.topMargin = 206; //YCOORD
childView.setLayoutParams(params);

那么有人可以告诉我为什么会这样吗?setX 和 setY 应该让它更容易......对吗?请如果我只是说没有意义,你可以为我解决这个问题,我会非常感激,我最近尝试了一切!

4

2 回答 2

3

这解释了如何以编程方式将 dp 转换为 px

长话短说:您在 xml 中可以表示为 dp 值的 View 对象上设置的每个数值,在您以编程方式设置它们时都表示为原始像素。以下代码片段告诉您如何将 dp 转换为原始像素:

// The gesture threshold expressed in dp
private static final float GESTURE_THRESHOLD_DP = 16.0f;

// Get the screen's density scale
final float scale = getResources().getDisplayMetrics().density;
// Convert the dps to pixels, based on density scale
mGestureThreshold = (int) (GESTURE_THRESHOLD_DP * scale + 0.5f);

// Use mGestureThreshold as a distance in pixels...

希望有帮助!

于 2018-08-03T21:19:10.187 回答
1

因此,经过大量研究,我终于解决了这个问题。我所拥有的是一个 GridView 和几个 LinearLayout 都包裹在一个 relativeLayout 中,我使用getLocationOnScreen()来获取 gridView 中一个单元格的坐标,这样我就可以对其进行查看,由于某种原因,总是存在一个固定的值差异在不同设备密度的 Y 轴上,最后我将 GridView 单独放在一个 relativeLayout 中,所以它是唯一的孩子并使用 getX() getY() 获取视图的直接父级内的坐标,结果就是这样我想要而且我什至不必计算不同密度的屏幕。希望这对可能遇到相同问题的人有所帮助。

于 2018-10-12T00:41:00.257 回答