为什么要使用setX和setY?

时间:2018-08-03 21:03:38

标签: android pixel resolution dpi setx

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

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应该更容易...对吗?如果我只是说不通,请帮我解决这个问题,我会非常感激,后来我尝试了一切!

2 个答案:

答案 0 :(得分:2)

This explains how to convert dp to px programmatically

长话短说:在View对象上设置的每个可以在xml中表示为dp值的数值,都可以通过编程方式设置为原始像素。以下代码段告诉您如何从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...

希望有帮助!

答案 1 :(得分:0)

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