Android :在另一个转换结束后开始转换

Android : Start a transition after another one ends

我对几个按钮应用了过渡,我尝试将它们的宽度从 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 按钮时,所有转换同时发生。 我希望他们在上一个结束后开始

知道如何实现同样的目标吗?

您应该改用 TransitionSet,这样您就可以将该顺序配置为顺序。官方 Android 文档

中有更多详细信息 here and here

几天前我遇到了同样的问题。解决办法是,你需要对不同的view使用不同的transitions。您需要在此处创建两个过渡,并且每个过渡只使用一次。试试这个

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));
            }
        }
    }
});

我使用 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;
            }
        }
    }
});