我使用的布局与此类似:
<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>
我现在想在布局上执行两个动画:
relativeLayoutActive
(AlphaAnimation)并将右侧的所有视图翻译到左侧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);
}
}
当动画结束&#34;动画改变&#34;通过调用view.clearAnimations()并设置正确的layoutParams来使其永久化。
动画1完美无缺,但2不是。除了relativeLayoutActive
的淡入外,一切都像它应该的那样。直到动画结束为止relativeLayoutActive
变得可见,即relativeLayoutActive
在动画期间是不可见的。
我认为发生这种情况是因为RelativeLayout
无法处理重叠,因为relativeLayoutActive
在2开始时被覆盖的视图覆盖,直到动画结束才会显示
我该如何解决这个问题?
问候
答案 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