当我将可见性分别设置为 VISIBLE 和 GONE 时,我正在使用 LayoutTransition 淡入和淡出具有半透明背景的视图。标准的东西。我在该过渡视图之上(之后,在 XML 中)有一个具有纯色背景的视图。我希望用户会在整个过渡过程中看到纯色背景不变的顶视图,这与覆盖视图出现时运行的动画完全相反。
动画师按预期工作:用户可以在整个APPEARING
动画中看到顶视图。DISAPPEARING
动画师没有按预期工作:覆盖视图最终绘制在所有其他视图之上。
值得注意的是,即使您没有设置自己的设置LayoutTransition
而是依赖于android:animateLayoutChanges="true"
XML,也会发生这种情况;我添加了自己的以增加持续时间,从而更容易看到过渡。
关于如何解决此问题的任何想法?我猜这很常见,而且我必须遗漏一些明显的东西,因为这是默认行为。我尝试了一些方法,例如附加一个以使每帧的顶视图无效,使用更新侦听AnimatorUpdateListener
器设置我自己的,使每帧的顶视图无效,并用 a和其他视图类型替换覆盖视图以防万一在某些情况下表现特殊的方式。DISAPPEARING
ObjectAnimator
TextView
FrameLayout
如果我用常规替换过渡动画师,ObjectAnimator
我会得到预期的行为,除了视图不是GONE
,因此接受触摸事件和所有垃圾(这使得“解决方案”站不住脚)。因此,我不认为问题仅仅是过渡视图具有关联的动画师。似乎这特别是LayoutTransition
代码或调用所说的东西的问题。
主要活动:
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final View overlay = findViewById(R.id.overlay);
final LayoutTransition lt = new LayoutTransition();
lt.setDuration(LayoutTransition.APPEARING, 300);
lt.setStartDelay(LayoutTransition.APPEARING, 0);
lt.setDuration(LayoutTransition.DISAPPEARING, 1000);
lt.setStartDelay(LayoutTransition.DISAPPEARING, 0);
((ViewGroup) overlay.getParent()).setLayoutTransition(lt);
final Runnable runnable = new Runnable() {
@Override
public void run() {
if (overlay.getVisibility() == View.VISIBLE) {
overlay.setVisibility(View.GONE);
} else {
overlay.setVisibility(View.VISIBLE);
}
overlay.postDelayed(this, 1500);
}
};
overlay.post(runnable);
}
}
活动主.xml:
<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="match_parent"
android:background="#ffffff"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".MainActivity"
>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="#ff0000"
android:text="THIS IS BEHIND THE OVERLAY AND THUS SHOULD TINT"
android:textColor="#ffffff"
/>
<FrameLayout
android:id="@+id/overlay"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#7f00ff00"
/>
<TextView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_centerInParent="true"
android:layout_margin="64dp"
android:background="#ffffff"
android:gravity="center"
android:text="THIS VIEW IS IN FRONT OF THE OVERLAY AND THUS SHOULD NOT SUFFER TINTING"
android:textColor="#000000"
android:textSize="32sp"
/>
</RelativeLayout>
我的设备运行 API 22,我也设置targetSdkVersion
为 22。基本上我创建了一个全新的项目并修改了生成的MainActivity
并activity_main.xml
几乎完全匹配这些粘贴的文件(为简洁起见,我只排除了import
andpackage
行)。