package com.github.florent37.expectanim.core.scale; import android.animation.Animator; import android.animation.ObjectAnimator; import android.view.Gravity; import android.view.View; import com.github.florent37.expectanim.ViewCalculator; import com.github.florent37.expectanim.core.AnimExpectation; import java.util.ArrayList; import java.util.List; /** * Created by florentchampigny on 17/02/2017. */ public class ExpectAnimScaleManager { private final List<AnimExpectation> animExpectations; private final View viewToMove; private final ViewCalculator viewCalculator; private Float scaleX = null; private Float scaleY = null; private Float pivotX = null; private Float pivotY = null; public ExpectAnimScaleManager(List<AnimExpectation> animExpectations, View viewToMove, ViewCalculator viewCalculator) { this.animExpectations = animExpectations; this.viewToMove = viewToMove; this.viewCalculator = viewCalculator; } public void calculate() { for (AnimExpectation animExpectation : animExpectations) { if (animExpectation instanceof ScaleAnimExpectation) { final ScaleAnimExpectation expectation = (ScaleAnimExpectation) animExpectation; expectation.setViewCalculator(viewCalculator); final Float scaleX = expectation.getCalculatedValueScaleX(viewToMove); if (scaleX != null) { this.scaleX = scaleX; } final Float scaleY = expectation.getCalculatedValueScaleY(viewToMove); if (scaleY != null) { this.scaleY = scaleY; } final Integer gravityHorizontal = expectation.getGravityHorizontal(); if (gravityHorizontal != null) { switch (gravityHorizontal){ case Gravity.LEFT: case Gravity.START: pivotX = (float)viewToMove.getLeft(); break; case Gravity.RIGHT: case Gravity.END: pivotX = (float)viewToMove.getRight(); break; case Gravity.CENTER_HORIZONTAL: case Gravity.CENTER : pivotX = viewToMove.getLeft() + viewToMove.getWidth()/2f; break; } } final Integer gravityVertical = expectation.getGravityVertical(); if (gravityVertical != null) { switch (gravityVertical){ case Gravity.TOP : pivotY = (float)viewToMove.getTop(); break; case Gravity.BOTTOM : pivotY = (float)viewToMove.getBottom(); break; case Gravity.CENTER_VERTICAL: case Gravity.CENTER : pivotY = viewToMove.getTop() + viewToMove.getHeight()/2f; break; } } } } } public Float getScaleX() { return scaleX; } public Float getScaleY() { return scaleY; } public List<Animator> getAnimators() { final List<Animator> animations = new ArrayList<>(); if(viewToMove != null){ if (pivotX != null) { viewToMove.setPivotX(pivotX); } if (pivotY != null) { viewToMove.setPivotY(pivotY); } } if (scaleX != null) { animations.add(ObjectAnimator.ofFloat(viewToMove, View.SCALE_X, scaleX)); } if (scaleY != null) { animations.add(ObjectAnimator.ofFloat(viewToMove, View.SCALE_Y, scaleY)); } return animations; } }