使MyView可见会导致RelativeLayout向下移动

时间:2014-07-31 13:27:07

标签: android android-layout android-view

我有一个较小的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>

然后将合并视图放在父RelativeLayout中,该父类用Java在这些参数中定义。

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

2 个答案:

答案 0 :(得分:1)

将可见性更改为invisible而不是“已消失。”

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

gone释放了那个空间。所以,当你再次看到它时,一切都会发生变化。

From the docs

  

常量值描述

     

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

     

不可见1不显示,但在布局期间考虑(留空空间)。

     

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

答案 1 :(得分:0)

我通过将MyView拉出合并视图解决了这个问题。我刚刚创建它,以便MyView跟随合并视图的移动。所以现在MyView和merge视图是屏幕管理器的子节点,而MyView不是合并视图的子节点。