当前位置: 首页 > 知识库问答 >
问题:

Android RealtiveLayout不能处理重叠的权利

濮阳靖
2023-03-14

我使用的布局与此类似:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="wrap_content" 
    android:paddingLeft="5dp"
    android:paddingTop="5dp"
    android:paddingRight="5dp"
    android:paddingBottom="5dp"
    android:background="@drawable/list_item_background"
    android:descendantFocusability="blocksDescendants"
    >

    <TextView
        android:id="@+id/textView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentRight="true"
        android:layout_alignParentTop="true"
        android:textColor="#000000"
        android:textSize="35sp"
        android:text="18:15" />

   <!-- some more views on the right side-->

    <RelativeLayout
        android:id="@+id/relativeLayoutActive"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_centerVertical="true"
        android:layout_toLeftOf="@id/textView1">

       <!-- contains several other views, a RelativeLayout and a FrameLayout-->
    </RelativeLayout>

</RelativeLayout>

现在我想在布局上执行两个动画:

  1. 淡出relativeLayoutActive(AlphaAnimation)并将右侧的所有视图翻译为左侧
  2. 淡入relativeLayoutActive并将所有视图翻译回左侧

以下是我用于动画的代码:

public void activate(boolean isActive){
    if(!this.active && isActive && checkIfActivatable()){   // start animation 2
        if(animating)
            return;
        animating = true;
        animatingActive = isActive;
        rootView.addView(relativeLayoutActive);
        translate(rootView, clock, true);
        fade(relativeLayoutActive, true, 1, 0, null, this, false);
                    //...
    }else if(this.active && !isActive){  // start Animation 1
        if(animating)
            return;
        animating  = true;
        animatingActive = isActive;
        translate(rootView, clock, false);
        fade(relativeLayoutActive, false, 1, 0, null, this, false); 
                    //...
        view.removeView(relativeLayoutActive);
    }
}

private void translate(View targetParent, View target, boolean right){
        Animation a = new TranslateAnimation(0.0f,
                (right?1:-1)*(targetParent.getWidth() - target.getWidth() - view.getPaddingLeft() -
                view.getPaddingRight()), 0.0f, 0.0f);
        a.setDuration(500);
        a.setInterpolator(AnimationUtils.loadInterpolator(getContext(),
                        android.R.anim.decelerate_interpolator));
        a.setFillAfter(true);
            target.startAnimation(a);
    }

    private void fade(View target, boolean in, float inValue, float outValue, AnimationSet as, AnimationListener listener, boolean useAs){
        Animation a = new AlphaAnimation(in?outValue:inValue, in?inValue:outValue);
        a.setDuration(500);
        a.setFillAfter(true);
        if(listener!=null){
            a.setAnimationListener(listener);
        }
        if(!useAs)
            target.startAnimation(a);
        else{
            as.addAnimation(a);
            target.startAnimation(as);
        }
    }

当动画结束时,通过调用view.clearAnimations()并设置正确的layoutParams,动画更改成为永久性的。

动画1可以完美地工作,但动画2不能。除了relativeLayoutActive的淡入,其他一切都正常工作。直到动画结束,relativeLayoutActive才可见,即在动画期间,relativeLayoutActive不可见。

我认为这是因为RelativeLayout不能处理重叠,并且因为relativeLayoutActive在2.的开头被覆盖在视图中,直到动画结束才可见

我该怎么解决这个问题?

当做

共有1个答案

韩经武
2023-03-14

看来你的问题源于视图/视图组的z排序。

我认为这是因为RelativeLayout不能处理重叠,并且因为relativeLayoutActive在2.0开始时被覆盖在视图中,直到动画结束才可见

我不确定你说的重叠是什么意思。但是你可以调用:

relativeLayoutActive.bringToFront();

要更改/修复z排序。您需要在以下位置调用:

rootView.addView(relativeLayoutActive);

下面是View#bringToFrond()所做的:

公共空隙

更改视图在树中的z顺序,使其位于其他同级视图的顶部。如果父容器使用依赖于顺序的布局方案(例如,LinearLayout),则此顺序更改可能会影响布局。在KITKAT之前,此方法应在视图的父级上调用请求布局()和无效(),以强制父级用新的子级顺序重新绘制。

此外,如果您使用的是API 11及以上版本,我建议您使用android较新的动画框架。它经过高度优化,提供了更好的用户体验。链接

 类似资料:
  • 问题内容: 我有一个表,该表具有指向两个不同表的两个外键,两个外键 共享一个列 : 如您所见,有两个FK共享country_code(恰好在引用路径的末尾引用同一列)。实体类看起来像(JPA 1.0 @IdClass): 如您所见,我将countryCode属性和城市的country_code @JoinColumn标记为只读(insertable = false,可更新= false)。Hibe

  • 我有一个简单的平原(正方形),上面有灯光和材料,我想在上面放一个地球纹理。但是什么都没有出现。我检查过,认为它正确加载了RGB数据,所以我的猜测是这一行有问题(数据是*char,图像是BMP24) 这是一个例子。bmp加载功能: 以下是主要和显示功能: 我玩过代码,有时(当我使用int而不是char*时)我会得到一个红色的材料覆盖所有内容,但不知道到底是什么导致了它 更新:必须更改几行才能正常工作

  • 我想在我的玩家剑上创建一个碰撞体,如果他攻击,他会检测到,并通过动画事件关闭/打开一个名为(伤害点)的游戏对象,这是一个附加的脚本,可以减去敌人的生命值。但是在某个地方它不能正确检测到。我试图添加OnDrawGizmos函数来查看我的球体对撞机,但即使将其变大,它也无法检测到。 我的问题最奇怪的是,我对我的怪物箱子和我的幻想玩家使用相同的代码,但对箱子有效,但对玩家无效。 我创建了一个名为 Pla

  • 我正在构建一个Java应用程序。这个应用程序是一个典型的“油漆”应用程序,你可以选择一种颜色,并在画布上绘制。除了...我将有一个圆圈数组分布在画布的顶部。我希望这些圆立即改变颜色,如果,当用户正在绘制和鼠标得到圆的X(10)个像素(其中X是绘制的线的宽度除以2)。 这是我的密码。我有一张画布是一组的一部分。我还创建了一个圆圈节点,并将其作为组的一部分。我想我需要以某种方式创建一个鼠标事件,当用户

  • 河楼 我试图配置Hibernate本地开发与HSQL数据库,但我被困在Spring不处理事务。 配置数据源,会话工厂等... 本地环境具有hibernate配置的属性文件 引发异常的代码的调用点 调用人员Dao.saveOrUpdate()后打印的堆栈跟踪 我已经尝试过的 在HibernateTransactionManager/DatasourceTransactionManager之间切换 属

  • 我知道Bellman-Ford算法可以很好地处理负权重图,但我开发了一个Dijkstra算法代码,它工作得非常好。但当我插入负加权边时,它失败了。有解决办法吗?