【问题标题】:Android : Start a transition after another one endsAndroid:在另一个结束后开始一个过渡
【发布时间】:2020-07-27 04:13:59
【问题描述】:

我对几个按钮应用了过渡,我尝试将它们的宽度从 0dp 更改为 MATCH_PARENT

final ChangeBounds transition = new ChangeBounds();
startFloat.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {

        for(i=0;i<allCards.size();i++) {
            if(i%2 == 0) {
                transition.setDuration(4000L);
                TransitionManager.beginDelayedTransition(allCards.get(i), transition);
                allButton.get(i).setLayoutParams(new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, dp10));
            }
            else{
                transition.setDuration(400L);
                TransitionManager.beginDelayedTransition(allCards.get(i), transition);
                allButton.get(i).setLayoutParams(new MaterialCardView.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, dp10));
            }
        }
    }
});

注意:dp10 是一个整数变量(没问题)。

这似乎工作正常,但是,当我单击startFloat 按钮时,所有转换同时发生。 我希望他们在前一个结束后开始

你知道如何达到同样的效果吗?

【问题讨论】:

    标签: java android android-studio animation transition


    【解决方案1】:

    我能够通过使用transition.setStartDelay(delay) 解决我的问题。

    这是我的代码:

    final ChangeBounds transition = new ChangeBounds();
    startFloat.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
    
            for(int i=0;i<allCards.size();i++) {
                if(i%2 == 0) {
                    transition.setDuration(4000L);
                    transition.setStartDelay(delay);
                    TransitionManager.beginDelayedTransition(allCards.get(i), transition);
                    allButton.get(i).setLayoutParams(new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, dp10));
                    delay+=4000;
                }
                else{
                    transition.setDuration(400L);
                    transition.setStartDelay(delay);
                    TransitionManager.beginDelayedTransition(allCards.get(i), transition);
                    allButton.get(i).setLayoutParams(new MaterialCardView.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, dp10));
                    delay+=400;
                }
            }
        }
    });
    

    【讨论】:

      【解决方案2】:

      几天前我也遇到了同样的问题。解决方案是,您需要为不同的视图使用不同的转换。您需要在此处创建两个转换,并且每个转换只使用一次。试试这个

      final ChangeBounds firestTransition = new ChangeBounds();
      final ChangeBounds secondTransition= new ChangeBounds();
      
      startFloat.setOnClickListener(new View.OnClickListener() {
          @Override
          public void onClick(View view) {
      
              for(i=0;i<allCards.size();i++) {
                  if(i%2 == 0) {
                      firestTransition.setDuration(4000L);
                      TransitionManager.beginDelayedTransition(allCards.get(i), transition);
                      allButton.get(i).setLayoutParams(new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, dp10));
                  }
                  else{
                      secondTransition.setDuration(400L);
                      TransitionManager.beginDelayedTransition(allCards.get(i), transition);
                      allButton.get(i).setLayoutParams(new MaterialCardView.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, dp10));
                  }
              }
          }
      });
      

      【讨论】:

      • 这仅创建了两个过渡,但它们同时开始。我希望第二个只有在第一次转换完成后才开始
      【解决方案3】:

      您应该改用TransitionSet,这样您就可以将该顺序配置为顺序。更多详情 herehere 在官方 Android 文档中

      【讨论】:

        猜你喜欢
        • 2020-08-26
        • 2019-01-10
        • 1970-01-01
        • 2018-02-07
        • 1970-01-01
        • 2011-05-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多