视图已移动但仍位于左上角

时间:2011-09-05 14:46:33

标签: android view android-layout

我正在向父布局添加自定义视图,巫婆是一个RelativeLayout。

我还需要在屏幕上移动此视图,以便我这样做:

myView.layout(xx, yy, width, height);

这很有效。每次调用此视图时都会移动视图。

问题在于移动此视图时,
它的副本一直挂在布局的左上角,
像这样:

enter image description here

为什么会发生这种情况?如何防止这种情况发生?

谢谢


- 编辑 -

以下一些代码。

在我的自定义视图的构造函数中:

LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
inflater.inflate(R.layout.ipmaps_lib_balloon_overlay, this);

然后我将此视图添加到其父级:

final RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
parentLayout.addView(myView, params);  

当我需要移动视图时,我就这样做:

myView.layout(startX, startY, width, height);
myView.invalidate  

5 个答案:

答案 0 :(得分:2)

根据documentationlayout方法应在视图组中视图展示位置的onLayout阶段使用。如果您想暂时将视图移至其他位置,请使用offsetLeftAndRight(int offset)offsetTopAndBottom(int offset).

如果这没有帮助,您将需要setLayoutParams来查看视图。

RelativeLayout.LayoutParams params = view.getLayoutParams();
params.setMargins(int left, int top, int right, int bottom);
view.setLayoutParams(params);

答案 1 :(得分:2)

我找到了这种奇怪行为的原因 这都怪我。

每当我改变这个消息气球的位置时,
我也打电话给view.draw(canvas)
因此,该视图被绘制了两次。

非常感谢你。

答案 2 :(得分:1)

我想你忘了要求提交通行证。在myView上调用invalidate()。

答案 3 :(得分:1)

您可以使用TranslateAnimation移动视图。如果你有setFillAfterEnabled(true);那么一旦它到达那里它就会留在你翻译的地方。

答案 4 :(得分:1)

使用RelativeLayout的确切位置看起来像是一个肮脏的黑客。我认为你应该使用AbsoluteLayout代替。它已被弃用,但它已在某些Android应用中使用(例如Browser),因此我认为它不会被删除。但是,如果您不想使用已弃用的类,则可以将其源代码复制到项目中。