【问题标题】:Making MyView visible causes the RelativeLayout to shift downwards使 MyView 可见会导致 RelativeLayout 向下移动
【发布时间】:2014-08-11 23:27:21
【问题描述】:

我有一个较小的 RelativeLayout 和一个自定义布局 MyView,它们都包含在父级 RelativeLayout 中。 MyView 的大小比子 RelativeLayout 大,但仅在特定事件期间出现。我不希望它占用此事件之外的布局空间。但是,当我将它设置为 View.VISIBLE 时,它会导致子 RelativeLayout 向下跳。

包含这些视图的父 RelativeLayout 将在屏幕上移动。当用户触摸屏幕并触发 MotionEvent.MOVE 时,父视图会移动。当你将父视图移动到屏幕边缘,而MyView是View.INVISIBLE时,问题是MyView仍然会占用空间并与屏幕边框发生碰撞,看起来就像在child RelativeLayout 和屏幕的边缘。我希望整个父 RelativeLayout 视图的有效大小与子 RelativeLayout 相同,除非 MyView 可见。

这是帮助说明我的问题的图像。

http://imgur.com/zjU1mbP

<merge xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:custom="http://schemas.android.com/apk/res/com.example.myapp">

<com.example.MyView
    android:id="@+id/my_view"
    android:layout_width="175dp"
    android:layout_height="175dp"
    android:visibility="gone"
    android:layout_centerInParent="true"
    android:background="@color/red"/>

<RelativeLayout
    android:id="@+id/rl"
    android:layout_width="wrap_content" //Less than 175dp
    android:layout_height="wrap_content" //Less than 175dp
    android:orientation="vertical"
    android:layout_centerInParent="true" >

</RelativeLayout>
</merge>

然后将合并视图放置在使用这些参数在 Java 中定义的父 RelativeLayout 中。

    params = new WindowManager.LayoutParams(
            WindowManager.LayoutParams.WRAP_CONTENT,
            WindowManager.LayoutParams.WRAP_CONTENT,
            WindowManager.LayoutParams.TYPE_PHONE,
            WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE,
            PixelFormat.TRANSLUCENT);
    params.gravity = Gravity.TOP | Gravity.LEFT;
    params.x = 0;
    params.y = (int) (deviceRes.y * 0.1);

【问题讨论】:

  • 不太明白这个问题。那么在让 MyView 可见之后,子 RelativeLayout 和这个 MyView 布局会向下跳吗?还是只有孩子RelativeLayout? “整个视图的有效大小”是什么意思?
  • "所以在使 MyView 可见后,子 RelativeLayout 和这个 MyView 布局向下跳转?" : 是的,“整个视图的有效大小”? :当 MyView 不可见/消失时,拥有所有这些子视图的父视图应该与子 RelativeLayout 的大小相同,但是当 MyView 为 View.INVISIBLE 时,它仍然会与屏幕发生碰撞。编辑了原文以帮助解释它。
  • 请解释碰撞/碰撞。您是否在监控 MyView 的某些部分何时离开屏幕?
  • 编辑解释碰撞。 MyView(部分)离开屏幕时,我没有监控。事实上,当我移动父视图时,它似乎根本无法离开屏幕。

标签: android android-layout android-view


【解决方案1】:

将可见性更改为 invisible 而不是 `gone。

Invisible 仍会占用空间,因此您的布局不会移动。

gone 释放该空间。所以,当你让它再次可见时,当然一切都会改变。

From the docs

常量值描述

visible 0 在屏幕上可见;默认值。

invisible 1 不显示,但在布局时考虑(留有空间)。

gone 2 完全隐藏,就像没有添加视图一样。

【讨论】:

  • 问题是 MyView 仍然会与屏幕边框发生冲突。我希望整个视图的有效大小与子 RelativeLayout 相同,除非 MyView 可见。我已经编辑了原始问题陈述以反映这一点。
  • 您在两者中都有android:layout_centerInParent="true",所以是的,它将把它放在同一个位置。你想把这个View放在屏幕顶部哪里?
  • 在图片中,我基本上希望子 RelativeLayout 保留与 MyView 设置为 View.GONE 时相同的 (x,y) 坐标。
  • 对,但是你想要MyView 去哪里?高于那个孩子?现在你把它放在孩子所在的地方,所以它当然会移动它
  • 我希望 MyView 在可见时位于孩子后面的中心。
【解决方案2】:

我通过将 MyView 从合并视图中拉出解决了这个问题。我刚刚做到了,所以 MyView 跟随合并视图的移动。所以现在 MyView 和合并视图是屏幕管理器的子视图,而 MyView 不是合并视图的子视图。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-17
    • 1970-01-01
    • 1970-01-01
    • 2017-03-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多