9

我正在尝试在 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) 处。我不知道为什么会这样。除了物理位置发生变化外,我找不到任何迹象表明图像已被更改。

4

6 回答 6

15

真的,这不应该发生。或者,尝试设置另一个变量并为其设置 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);

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

于 2013-05-28T02:07:04.940 回答
3

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

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

于 2013-12-10T10:37:18.760 回答
1

从文档中, setTranslationX 是:

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

而 setX 是:

设置此视图的视觉 x 位置,以像素为单位。这相当于将translationX 属性设置为传入的x 值与当前left 属性的差值。

因此,您可以将 setTranlsationX 视为一个相对偏移量:将您通常所在的位置向左移动 3 个像素。setX 是一个固定位置:移动任何你必须做的东西,这样你最终会在坐标 X 处绘制。

于 2019-10-03T06:18:21.400 回答
0

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

android:paddingBottom="16dp"
android:paddingLeft="16dp"
android:paddingRight="16dp"
android:paddingTop="16dp"
于 2017-04-13T07:05:11.357 回答
0

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

于 2016-06-04T09:27:48.373 回答
0

作为一个真正面临这个问题的人,我已经通过删除 parentView 中的任何填充来解决这个问题。填充似乎会导致布局大小发生变化

于 2017-08-22T04:23:02.023 回答