Android的 - 变化留有余量使用动画(Android - Change left margin

2019-07-05 07:37发布

我改变以下列方式的形象图的左边距:

ViewGroup.MarginLayoutParams layoutParams = (MarginLayoutParams) image.getLayoutParams ();
layoutParams.leftMargin = VALUE;
image.setLayoutParams ( layoutParams );

我想在保证金的变化与动画的应用。 任何线索?

我的尝试:

ObjectAnimator objectAnimator = ObjectAnimator.ofFloat ( image , "x" , VALUE);
objectAnimator.start();

这完美的作品,作为图像移动到动画指定的X值不过 layoutParams.leftMargin的值保持不变! 所以我不能使用此方法,因为如果我尝试使用objectAnimator与价值100后layoutParams.leftMargin的值更改为100,应用的价值是不正确的(200应用,而不是100,效果如果objectAnimator遗体eventhough我设置左边界以下列方式:

layoutParams.leftMargin = 100;

Answer 1:

使用动画类,而不是ObjectAnimator。

final int newLeftMargin = <some value>;
Animation a = new Animation() {

    @Override
    protected void applyTransformation(float interpolatedTime, Transformation t) {
        LayoutParams params = yourView.getLayoutParams();
        params.leftMargin = (int)(newLeftMargin * interpolatedTime);
        yourView.setLayoutParams(params);
    }
};
a.setDuration(500); // in ms
yourView.startAnimation(a);

请注意,您应该使用正确的LayoutParams类也就是说,如果你的观点是LinearLayout中的孩子那么PARAMS应该LinearLayout.LayoutParams



Answer 2:

我来过这个问题,但因为我想从负值到0动画保证金,我可以不使用它,所以我用valueAnimater基础上user1991679答案:

final View animatedView = view.findViewById(R.id.animatedView);
final LinearLayout.LayoutParams params = (LinearLayout.LayoutParams) animatedView.getLayoutParams();
ValueAnimator animator = ValueAnimator.ofInt(params.bottomMargin, 0);
animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
    @Override
    public void onAnimationUpdate(ValueAnimator valueAnimator)
    {
        params.bottomMargin = (Integer) valueAnimator.getAnimatedValue();
        animatedView.requestLayout();
    }
});
animator.setDuration(300);
animator.start();

你必须根据animatedView容器改变LinearLayout.LayoutParams。 您还可以使用旧版本nineoldandroids没有ValueAnimator。



Answer 3:

从user1991679答案是伟大的,但如果你需要从其他任何值,但0插值保证金,你需要在计算中使用它:

ViewGroup.MarginLayoutParams params = (MarginLayoutParams) mBottomLayout.getLayoutParams();
final int bottomMarginStart = params.bottomMargin; // your start value
final int bottomMarginEnd = <your value>; // where to animate to
Animation a = new Animation() {
    @Override
    protected void applyTransformation(float interpolatedTime, Transformation t) {
        ViewGroup.MarginLayoutParams params = (MarginLayoutParams) mBottomLayout.getLayoutParams();
        // interpolate the proper value
        params.bottomMargin = bottomMarginStart + (int) ((bottomMarginEnd - bottomMarginStart) * interpolatedTime);
        mBottomLayout.setLayoutParams(params);
    }
};
a.setDuration(300);
mBottomLayout.startAnimation(a);

在我来说,我需要一个动画“进入屏幕”动画,从“-48dp”即将为0如果没有初始值,动画总是0,因此跳,没有动画视图。 解决的办法是插值补偿,并将其添加到原来的值。



Answer 4:

您可以使用以下

image.animate().setDuration(durationIn).translationXBy(offsetFloat).start();

您还可以添加.setInterpolator(new BounceInterpolator())来更改动画的外观。



文章来源: Android - Change left margin using animation