【问题标题】:View moved but still on the top left corner视图已移动但仍在左上角
【发布时间】:2011-09-12 18:34:22
【问题描述】:

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

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

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  

【问题讨论】:

  • 首先!确保仍然存在的视图(应该移动的视图)仍然是可点击的!如果是请告诉我
  • 不,保留在角落的图像不可点击。坦克

标签: android view android-layout


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

    非常感谢大家。

    【讨论】:

      【解决方案3】:

      我想你忘记申请绘图通行证了。在您的 myView 上调用 invalidate()。

      【讨论】:

      • 我没有提到这一点,但我已经在“layout(...)”调用之后调用了“invalidate()”。谢谢
      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

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

        【讨论】:

          猜你喜欢
          • 2020-03-22
          • 2017-08-16
          • 2021-06-28
          • 2018-12-18
          • 2021-10-10
          • 1970-01-01
          • 1970-01-01
          • 2019-01-13
          • 1970-01-01
          相关资源
          最近更新 更多