我有一个动画,该动画在第一次显示片段时正确启动。但是,在更改方向后,它不会重新启动。动画是一个动画列表资源集作为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. 首先创建选项卡,其次,其活动附加到窗口
  2. 首先,活动附加到窗口,其次创建了选项卡

如果标签是第一个显示或旋转期间的标签,则会发生案例。当用户切换到该选项卡时,情况下会发生两个情况,因为它不是第一个。让我们分别处理每种情况:

情况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()方法被调用,然后开始动画。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top