在渲染之前触发ViewPager片段内嵌套片段的动画

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在渲染之前触发ViewPager片段内嵌套片段的动画相关的知识,希望对你有一定的参考价值。

我有一个ViewPager片段

class PagerFragment() : Fragment() {
  override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
      super.onViewCreated(view, savedInstanceState)

      val pagerView = view as ViewPager
      val adapter = PagerAdapter(childFragmentManager, items)
      pagerView.adapter = adapter
  }
}

使用以下适配器

class PagerAdapter(val fm: FragmentManager, val items: ArrayList<Item>)
    : FragmentStatePagerAdapter(fm) {

    override fun getItem(position: Int): Fragment {
        val item = items[position]
        return NestedFragment.newInstance(item)
    }

    override fun getCount(): Int {
        return  items.size
    }
}

用几个动画嵌套片段以下列方式触发onViewCreated

class NestedFragment() : Fragment() {
  override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
      super.onViewCreated(view, savedInstanceState)

      val one = AnimationUtils.loadAnimation(context, R.anim.one)
      val two = AnimationUtils.loadAnimation(context, R.anim.two)
      val three = AnimationUtils.loadAnimation(context, R.anim.three)

      view.findViewById<ImageView>(R.id.pic).startAnimation(one)
      view.findViewById<ConstraintLayout>(R.id.content).startAnimation(two)
      view.findViewById<ImageView>(R.id.img).startAnimation(three)
  }
}

然而,通常在屏幕上显示嵌套片段时动画已经开始甚至结束:(

有没有办法确定片段何时确实在设备的屏幕上呈现?当然,欢迎任何其他有用的建议来克服这个问题。

答案

这对我有用。

class NestedFragment() : Fragment() {
  override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
      super.onViewCreated(view, savedInstanceState)

      val one = AnimationUtils.loadAnimation(context, R.anim.one)
      val two = AnimationUtils.loadAnimation(context, R.anim.two)
      val three = AnimationUtils.loadAnimation(context, R.anim.three)
      view.post(Runnable {
        /* 
          If the animation doesn't trigger you may try to hide 
          elements visibility and reveal them before animation starts
        */
        view.findViewById<ImageView>(R.id.pic).startAnimation(one)
        view.findViewById<ConstraintLayout>(R.id.content).startAnimation(two)
        view.findViewById<ImageView>(R.id.img).startAnimation(three)
      })
  }
}

如果动画仍未触发,您可能会尝试隐藏视图可见性并在动画之前显示它们。

以上是关于在渲染之前触发ViewPager片段内嵌套片段的动画的主要内容,如果未能解决你的问题,请参考以下文章

如何在ViewPager中渲染单个片段?

带有嵌套片段的导航抽屉 (ViewPager)

ViewPager 中嵌套片段的 OptionsMenu

FragmentStatePagerAdapter 内存泄漏(带有 viewpager 的嵌套片段)

ActionBarSherlock、ViewPager、TabsAdapter 嵌套选项卡片段

如何确定 Fragment 何时在 ViewPager 中可见