12

我想为视图填充的变化设置动画。翻译动画的放置位置和我要应用的 padding 一样。

TranslateAnimation moveleft = new TranslateAnimation(Animation.ABSOLUTE, 0.0f,
                    Animation.ABSOLUTE, PADDING, Animation.ABSOLUTE,
                    0.0f, Animation.ABSOLUTE, 0.0f);

moveLeft.setDuration(500);
moveLeft.setFillAfter(true);

这将启动视图的动画,然后设置填充。这并不完全有效,因为它会导致图形故障。

v.startAnimation(moveleft);   
v.setPadding(PADDING, 0, 0,0);
4

3 回答 3

55

Use ValueAnimator, its really simple and unclutter

say, we have to change right padding to _20dp where as left, top and bottom padding are _6dp, _6dp and 0 respectively.

ofInt() is varagrs type. the value we have to animate is pass in it as KeyValue pair (arg1 = current value, arg2 = target value,............)

Here we go,

ValueAnimator animator = ValueAnimator.ofInt(view.getPaddingRight(), _20dp);
animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
    @Override
    public void onAnimationUpdate(ValueAnimator valueAnimator){
        view.setPadding(_6dp, _6dp, (Integer) valueAnimator.getAnimatedValue(), 0);
    }
});
animator.setDuration(200);
animator.start();
于 2014-09-28T19:30:21.150 回答
3

与其立即设置填充,不如尝试动画侦听器在动画完成后设置填充?

v.setAnimationListener(new Animation.AnimationListener() {
    ...
    @Override
    public void onAnimationEnd(){
        v.setPadding(PADDING, 0, 0,0);
    }
    ...
});
v.startAnimation(moveleft);
于 2013-08-22T03:49:23.680 回答
0

以下是如何setPadding在 Kotlin 中制作动画:

private fun setPaddingWithAnimation() {

    val paddingDp: Int = 20

    val density: Float = requireActivity().getResources().getDisplayMetrics().density

    val paddingPixel: Int = (paddingDp * density).toInt()

    val animator = ValueAnimator.ofInt(recyclerItems.paddingRight, paddingPixel)

    animator.addUpdateListener { valueAnimator -> binding.recyclerHealthTips.recyclerHealthTips.setPadding(
                paddingPixel, 0, valueAnimator.animatedValue as Int, 0) }
        
    animator.duration = 500
    animator.start()
}
于 2021-05-31T13:08:43.830 回答