package com.marshalchen.common.uimodule.materialanimatedswitch.painter;
import android.animation.ValueAnimator;
import android.content.Context;
import android.graphics.Bitmap;
import com.marshalchen.common.uimodule.materialanimatedswitch.MaterialAnimatedSwitchState;
import com.marshalchen.common.uimodule.materialanimatedswitch.observer.BallFinishObservable;
import com.marshalchen.common.uimodule.materialanimatedswitch.observer.BallMoveObservable;
import com.marshalchen.ultimateandroiduilollipop.R;
import java.util.Observable;
import java.util.Observer;
/**
* @author Adrián García Lomas
*/
public class IconPressPainter extends IconPainter {
private ValueAnimator enterAnimator;
private ValueAnimator exitAnimator;
private BallFinishObservable ballFinishObservable;
private int enterAnimationStartValue;
private int exitAnimationExitValue;
private int middle;
private int iconMargin;
private int ballRadius;
private BallMoveObservable ballMoveObservable;
public IconPressPainter(Context context, Bitmap bitmap, BallFinishObservable ballFinishObservable,
BallMoveObservable ballMoveObservable, int margin) {
super(context, bitmap, margin);
initValueAnimator();
this.ballFinishObservable = ballFinishObservable;
this.ballMoveObservable = ballMoveObservable;
initObserver();
}
private void initValueAnimator() {
int movementAnimationDuration = context.getResources().getInteger(R.integer.mas_animation_duration);
int exitAnimationDuration = context.getResources().getInteger(R.integer.mas_exitAnimator);
enterAnimator = ValueAnimator.ofInt();
enterAnimator.setDuration(movementAnimationDuration);
enterAnimator.addUpdateListener(new EnterValueAnimatorListener());
exitAnimator = ValueAnimator.ofInt();
exitAnimator.setDuration(exitAnimationDuration);
exitAnimator.addUpdateListener(new ExitValueAnimatorListener());
}
@Override public void onSizeChanged(int height, int width) {
super.onSizeChanged(height, width);
initValues();
int iconCenterY = middle - (iconMargin);
initAnimationValues();
enterAnimator.setIntValues(enterAnimationStartValue, iconCenterY);
exitAnimator.setIntValues(iconCenterY, iconCenterY + exitAnimationExitValue);
}
private void initValues() {
middle = height / 2;
iconMargin = imageWidth / 2;
ballRadius = (int) context.getResources().getDimension(R.dimen.mas_ball_radius);
iconXPosition = (width - ballRadius) + iconMargin;
}
private void initAnimationValues() {
enterAnimationStartValue =
(int) context.getResources().getDimension(R.dimen.mas_enterAnimationStartValue);
exitAnimationExitValue =
(int) context.getResources().getDimension(R.dimen.mas_exitAnimationExitValue);
}
@Override public void setColor(int color) {
//Empty
}
@Override public int getColor() {
return 0;
}
private void initObserver() {
ballFinishObservable.addObserver(new BallFinishListener());
ballMoveObservable.addObserver(new BallMoveListener());
}
@Override public void setState(MaterialAnimatedSwitchState state) {
switch (state) {
case PRESS:
isVisible = true;
enterAnimator.start();
break;
case RELEASE:
exitAnimator.start();
}
}
private class BallFinishListener implements Observer {
@Override public void update(Observable observable, Object data) {
BallFinishObservable.BallState ballState = ((BallFinishObservable) observable).getState();
switch (ballState) {
case RELEASE:
isVisible = false;
break;
}
}
}
/**
* Listener for move the icon with the ball movement
*/
private class BallMoveListener implements Observer {
@Override public void update(Observable observable, Object data) {
BallMoveObservable ballMoveObservable = (BallMoveObservable) observable;
int ballPositionX = ballMoveObservable.getBallPosition();
iconXPosition = ballPositionX - iconMargin;
}
}
private class EnterValueAnimatorListener implements ValueAnimator.AnimatorUpdateListener {
@Override public void onAnimationUpdate(ValueAnimator animation) {
iconYPosition = (int) animation.getAnimatedValue();
}
}
private class ExitValueAnimatorListener implements ValueAnimator.AnimatorUpdateListener {
@Override public void onAnimationUpdate(ValueAnimator animation) {
iconYPosition = (int) animation.getAnimatedValue();
}
}
}