我正在向父布局添加自定义视图,巫婆是一个RelativeLayout。
我还需要在屏幕上移动此视图,以便我这样做:
myView.layout(xx, yy, width, height);
这很有效。每次调用此视图时都会移动视图。
问题在于移动此视图时,
它的副本一直挂在布局的左上角,
像这样:
为什么会发生这种情况?如何防止这种情况发生?
谢谢
- 编辑 -
以下一些代码。
在我的自定义视图的构造函数中:
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
答案 0 :(得分:2)
根据documentation,layout
方法应在视图组中视图展示位置的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
),因此我认为它不会被删除。但是,如果您不想使用已弃用的类,则可以将其源代码复制到项目中。