Android setX()和setY()表现得很奇怪

时间:2013-05-28 01:49:10

标签: android imageview setx

我正在尝试动态创建然后在Android活动中移动图片。但是,setX()和setY()方法似乎无法正常工作。它在首次创建和放置图像时正确设置图像的位置,但任何更新图像的尝试都会导致图像放置在错误的位置。例如,图像移动到以下代码:

ImageView image;
RelativeLayout layout = (RelativeLayout)findViewById(R.id.activity_this);

if(action == MotionEvent.ACTION_DOWN){

    image = new ImageView(MyClass.this);                            
    layout.addView(image, width, height);   
    image.setX(206);
    image.setY(206);
}
else if(action == MotionEvent.ACTION_MOVE){

    if(image != null){
        image.setX(206);
        image.setY(206);
    }
}

在ACTION_MOVE上,即使x和y位置值保持不变,也会移动图像。图像的父级保持不变。大小保持不变。如果我得到x和y值,它仍然会说206,但它不再放在(206,206)活动上。我很遗憾为什么会这样。除了物理上改变位置外,我找不到任何迹象表明图像已被改变。

6 个答案:

答案 0 :(得分:14)

真的,这不应该发生。或者,尝试设置另一个变量并将x和y设置为它,或者获取x并获得y并为每个变量添加0以获得相同的位置。

正如Android - Use of view.setX() and setY in api 8中所述,如果你已经搜索过,那么另一种解决方案甚至可以在api 8之前运行。 LayoutParams就像这样 -

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

那里有更多信息。我希望这有帮助

答案 1 :(得分:3)

遇到同样的问题。 View.setLeft(int)/View.setTop(int)为我工作。

请注意,由于这个答案的原始帖子发生了变化,并且在更新的Android版本上,它可能会产生意想不到的结果,而它在旧版本上为我做了诀窍。因此,如果您的目标是旧设备(Android 3.0及更低版本),这可能有所帮助,但对于更通用的解决方案,请在此处考虑其他答案。

答案 2 :(得分:1)

在文档中,setTranslationX是:

设置此视图相对于其左侧位置的水平位置。除了将对象的布局放置在任何位置之外,这还可以有效地放置对象的后布局。

setX是:

设置此视图的可视x位置(以像素为单位)。这等效于将translationX属性设置为传入的x值与当前left属性之间的差。

因此,您可以将setTranlsationX视为相对偏移:将像素向左平移3个像素。 setX是固定位置:移动所有必需的位置,以便最终在坐标X处进行绘制。

答案 3 :(得分:0)

您的活动是否处于全屏模式?如果没有尝试使其全屏,它应该解决您的问题。

答案 4 :(得分:0)

回答很晚,但如果其他人面临同样的问题。这为我修复了布局文件中的填充:

android:paddingBottom="16dp"
android:paddingLeft="16dp"
android:paddingRight="16dp"
android:paddingTop="16dp"

答案 5 :(得分:0)

作为实际遇到此问题的人,我通过删除parentView中的任何填充来解决此问题。填充似乎导致布局大小的改变