programing

Android-애니메이션을 사용하여 왼쪽 여백 변경

goodcopy 2021. 1. 16. 10:37
반응형

Android-애니메이션을 사용하여 왼쪽 여백 변경


다음과 같은 방식으로 이미지보기의 왼쪽 여백을 변경합니다.

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

마진 변경은 애니메이션으로 적용하고 싶습니다. 단서가 있습니까?

내가 시도한 것 :

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

애니메이션을 사용하여 이미지가 지정된 X 값으로 이동하므로 완벽하게 작동 하지만 layoutParams.leftMargin 의 값 은 변경되지 않습니다! 그래서이 메서드를 사용할 수 없습니다. 100으로 objectAnimator사용한 후 layoutParams.leftMargin 의 값 을 100 으로 변경하려고하면 적용된 값이 올바르지 않기 때문입니다 (100 대신 200이 적용되고 objectAnimator 가 남아 있으면 효과 다음과 같은 방식으로 왼쪽 여백을 설정하고 있지만

layoutParams.leftMargin = 100;

ObjectAnimator가 아닌 Animation 클래스를 사용하십시오.

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 여야합니다.


이 질문에 왔지만 여백을 음수 값에서 0으로 애니메이션하고 싶기 때문에 사용할 수 없었으므로 user1991679 답변에 valueAnimater 기반을 사용했습니다.

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를 변경해야합니다. 또한 ValueAnimator가없는 이전 버전에 대해 nineoldandroids를 사용할 수 있습니다.


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

In my case I needed to animate an "enter the screen" animation, coming from "-48dp" to 0. Without the start value, the animation is always 0, thus jumping, not animating the view. The solution was to interpolate the offset and add it to the original value.


You can use the following

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

You can also add .setInterpolator(new BounceInterpolator()) to change the look of the animation.

ReferenceURL : https://stackoverflow.com/questions/13881419/android-change-left-margin-using-animation

반응형