如何制作高度变化的动画

10

我在我的应用程序中有一个简单的卡片,当用户点击它时,我正在更改高度。我希望这种高度变化可以动画化,平滑地改变高度。

我在我的应用程序中有一个简单的卡片,当用户点击它时,我更改高度。我希望高度的变化能够平滑地过渡,以实现动画效果。

@OnClick({R.id.emptyDescription})
public void onClick(View view) {
    switch (view.getId()) {
        case R.id.emptyDescription:
            if(isCardCollapsed){

                emptyDescription.setMinimumHeight(400);

                cancelSaveLinear.setVisibility(View.VISIBLE);
                editDescription.setVisibility(View.GONE);

                isCardCollapsed = false;
            } else {
                emptyDescription.setMinimumHeight(100);

                cancelSaveLinear.setVisibility(View.GONE);
                editDescription.setVisibility(View.VISIBLE);

                isCardCollapsed = true;
            }

            break;
        case R.id.card_view:
            break;
    }
}

我该怎么做?


在应用新的尺寸时,您需要设置布局过渡。请查看此链接:https://developer.android.com/training/animation/layout.html - Elias Fazel
2个回答

15

使用以下方法解决:

public class MainActivity extends AppCompatActivity {

    private CardView cardView;
    private Boolean isCollapsed = true;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        cardView = (CardView) findViewById(R.id.card_view);

        final int originalDimension = Math.round(getResources().getDimension(R.dimen.original_card_view_height));
        final int newDimension = Math.round(getResources().getDimension(R.dimen.new_card_view_height));

        cardView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if(isCollapsed){
                    TransitionManager.beginDelayedTransition(cardView, new TransitionSet()
                            .addTransition(new ChangeBounds()));

                    ViewGroup.LayoutParams params = cardView.getLayoutParams();
                    params.height = newDimension;
                    cardView.setLayoutParams(params);

                    isCollapsed = false;
                } else {
                    TransitionManager.beginDelayedTransition(cardView, new TransitionSet()
                            .addTransition(new ChangeBounds()));

                    ViewGroup.LayoutParams params = cardView.getLayoutParams();
                    params.height = originalDimension;
                    cardView.setLayoutParams(params);

                    isCollapsed = true;
                }
            }
        });
    }
}

12

在应用新的尺寸时,您需要设置布局转换。请查看 developer.android.com/training/animation/layout.html。

TransitionManager.beginDelayedTransition(transitionsContainer, new TransitionSet()
    .addTransition(new ChangeBounds())
    .addTransition(new ChangeImageTransform()));

ViewGroup.LayoutParams params = imageView.getLayoutParams();
params.height = expanded ? ViewGroup.LayoutParams.MATCH_PARENT : 
    ViewGroup.LayoutParams.WRAP_CONTENT;
imageView.setLayoutParams(params);

imageView.setScaleType(expanded ? ImageView.ScaleType.CENTER_CROP : 
    ImageView.ScaleType.FIT_CENTER);

示例代码来源:https://medium.com/@andkulikov/animate-all-the-things-transitions-in-android-914af5477d50

输入图像描述


1
谢谢您的回答,但是这个例子是针对图像的...我需要一个卡片视图的例子。 - Guilherme Lima Pereira
这只是一个示例。您可以为所有视图和布局执行此操作。 - Elias Fazel
嘿,我又试了一遍,成功了!请修改您的答案,将此gist中的MainActivity.java进行修改,这样我就可以接受您的答案为正确答案:https://gist.github.com/guuilp/85dca2bca2a89d9432674fdb37a01ca9 - Guilherme Lima Pereira
对我不起作用: final RelativeLayout.LayoutParams rlp = (RelativeLayout.LayoutParams) animatingImageview.getLayoutParams(); rlp.leftMargin = newLeft; rlp.topMargin = newTop - space; rlp.width = newWidth; rlp.height = newHeight; animatingImageview.setLayoutParams(rlp); - NehaK

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接