Android RelativeLayout无法处理重叠权限

时间:2014-05-09 15:31:59

标签: android android-animation relativelayout android-framelayout

我使用的布局与此类似:

<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并将所有观看次数翻译回左侧
  3. 这是我用于动画的代码:

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

    当动画结束&#34;动画改变&#34;通过调用view.clearAnimations()并设置正确的layoutParams来使其永久化。

    动画1完美无缺,但2不是。除了relativeLayoutActive的淡入外,一切都像它应该的那样。直到动画结束为止relativeLayoutActive变得可见,即relativeLayoutActive在动画期间是不可见的。

    我认为发生这种情况是因为RelativeLayout无法处理重叠,因为relativeLayoutActive在2开始时被覆盖的视图覆盖,直到动画结束才会显示

    我该如何解决这个问题?

    问候

1 个答案:

答案 0 :(得分:0)

您的问题似乎源于视图/视图组的z排序。

  

我认为这是因为RelativeLayout无法处理重叠   并且由于relativeLayoutActive在开始时被over视图覆盖   2.直到动画结束才会看到它

我不确定overlapping你的意思。但你可以打电话:

relativeLayoutActive.bringToFront();

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

rootView.addView(relativeLayoutActive);

以下是View#bringToFront()的作用:

  

public void bringToFront()

     

更改树中视图的z顺序,使其位于其他兄弟的顶部   观点。如果父容器,此排序更改可能会影响布局   使用依赖于顺序的布局方案(例如,LinearLayout)。之前   KITKAT这个方法之后应该调用requestLayout()和   在视图的父级上使用invalidate()来强制父级重绘   新的孩子订购。

此外,如果您正在使用API​​ 11及更高版本,我建议使用Android的新动画框架。它经过高度优化,可提供更好的用户体验。 Link