旋转后,框架中的动画不会重新启动
-
25-10-2019 - |
题
我有一个动画,该动画在第一次显示片段时正确启动。但是,在更改方向后,它不会重新启动。动画是一个动画列表资源集作为ImageView的背景。
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
final View root = inflater.inflate(R.layout.fragment_lead_manual,
container, false);
final ImageView badgeEntryView = (ImageView) root
.findViewById(R.id.manual_image);
mAnimation = (AnimationDrawable) badgeEntryView.getBackground();
return root;
}
@Override
public void onResume() {
super.onResume();
mAnimation.start();
}
@Override
public void onPause() {
super.onPause();
mAnimation.stop();
}
编辑: 我忘了补充说动画位于选项卡中,这使事情变得更加困难。但是,我已经弄清楚了这个问题,并将在下面添加答案。
解决方案
基于创建选项卡的何时需要解决两种情况:
- 首先创建选项卡,其次,其活动附加到窗口
- 首先,活动附加到窗口,其次创建了选项卡
如果标签是第一个显示或旋转期间的标签,则会发生案例。当用户切换到该选项卡时,情况下会发生两个情况,因为它不是第一个。让我们分别处理每种情况:
情况1:a)创建选项卡b)附加到窗口
在将AnimationDrawable.start()连接到窗口之前(即increate()或onResume())打破动画之前。如 Android文档 :
重要的是要注意,在您的活动的ongreate()方法中,无法调用启动()方法,因为动画绘制可绘制可绘制的方法尚未完全连接到窗口上。如果您想立即播放动画,而无需交互,那么您可能需要从活动中的OnWindowFocusChanged()方法中调用它,当Android将窗口带入焦点时,该方法将被调用。
片段更加困难,但基本相同。我们覆盖活动中的方法,然后呼唤片段:
@Override
public void onWindowFocusChanged(boolean hasFocus) {
super.onWindowFocusChanged(hasFocus);
if (hasFocus) {
final FragmentManager fm = getFragmentManager();
ManualLeadFragment manualFragment = (ManualLeadFragment) fm
.findFragmentByTag(TAG_MANUAL);
if (manualFragment != null) {
manualFragment.startAnimation();
}
}
}
然后在片段中实现startAnimation():
void startAnimation() {
mAnimation.start();
}
情况2:a)附加到窗口b)创建选项卡
在这种情况下,已经发生了对OnWindowFocuschanged()的呼叫,因此动画无法启动。因此,我们仍然需要在onResume()期间启动它,但略有不同:
@Override
public void onResume() {
super.onResume();
if (isVisible()) {
startAnimation();
}
}
这将调用与情况1相同的startAnimation()方法,但是由于片段已经连接到窗口上,因此可以在onresume()期间调用。
概括
AnimationDrawable.start()仅在可见片段时才能调用。有时在onResume()中可以看到它,并且可以在此时开始动画。其他时候,当时它尚不可见,然后在可见时被覆盖的onwindowfocuschanged()方法被调用,然后开始动画。