Full screen avatar circle to square shape transition.

This commit is contained in:
Alan Evans
2020-06-24 17:18:02 -03:00
committed by Greyson Parrelli
parent 66f2668326
commit 52747782a7
7 changed files with 191 additions and 20 deletions

View File

@@ -0,0 +1,83 @@
package org.thoughtcrime.securesms.animation.transitions;
import android.animation.Animator;
import android.animation.ObjectAnimator;
import android.annotation.TargetApi;
import android.graphics.drawable.Drawable;
import android.transition.Transition;
import android.transition.TransitionValues;
import android.util.Property;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import androidx.core.graphics.drawable.RoundedBitmapDrawable;
@TargetApi(21)
abstract class CircleSquareImageViewTransition extends Transition {
private static final String CIRCLE_RATIO = "CIRCLE_RATIO";
private final boolean toCircle;
CircleSquareImageViewTransition(boolean toCircle) {
this.toCircle = toCircle;
}
@Override
public void captureStartValues(TransitionValues transitionValues) {
View view = transitionValues.view;
if (view instanceof ImageView) {
transitionValues.values.put(CIRCLE_RATIO, toCircle ? 0f : 1f);
}
}
@Override
public void captureEndValues(TransitionValues transitionValues) {
View view = transitionValues.view;
if (view instanceof ImageView) {
transitionValues.values.put(CIRCLE_RATIO, toCircle ? 1f : 0f);
}
}
@Override
public Animator createAnimator(ViewGroup sceneRoot, TransitionValues startValues, TransitionValues endValues) {
if (startValues == null || endValues == null) {
return null;
}
ImageView endImageView = (ImageView) endValues.view;
float start = (float) startValues.values.get(CIRCLE_RATIO);
float end = (float) endValues.values.get(CIRCLE_RATIO);
return ObjectAnimator.ofFloat(endImageView, new RadiusRatioProperty(), start, end);
}
static final class RadiusRatioProperty extends Property<ImageView, Float> {
private float ratio;
RadiusRatioProperty() {
super(Float.class, "circle_ratio");
}
@Override
final public void set(ImageView imageView, Float ratio) {
this.ratio = ratio;
Drawable imageViewDrawable = imageView.getDrawable();
if (imageViewDrawable instanceof RoundedBitmapDrawable) {
RoundedBitmapDrawable drawable = (RoundedBitmapDrawable) imageViewDrawable;
if (ratio > 0.95) {
drawable.setCircular(true);
} else {
drawable.setCornerRadius(Math.min(drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight()) * ratio * 0.5f);
}
}
}
@Override
public Float get(ImageView object) {
return ratio;
}
}
}

View File

@@ -0,0 +1,15 @@
package org.thoughtcrime.securesms.animation.transitions;
import android.annotation.TargetApi;
import android.content.Context;
import android.util.AttributeSet;
/**
* Will only transition {@link android.widget.ImageView}s that contain a {@link androidx.core.graphics.drawable.RoundedBitmapDrawable}.
*/
@TargetApi(21)
public final class CircleToSquareImageViewTransition extends CircleSquareImageViewTransition {
public CircleToSquareImageViewTransition(Context context, AttributeSet attrs) {
super(false);
}
}

View File

@@ -0,0 +1,15 @@
package org.thoughtcrime.securesms.animation.transitions;
import android.annotation.TargetApi;
import android.content.Context;
import android.util.AttributeSet;
/**
* Will only transition {@link android.widget.ImageView}s that contain a {@link androidx.core.graphics.drawable.RoundedBitmapDrawable}.
*/
@TargetApi(21)
public final class SquareToCircleImageViewTransition extends CircleSquareImageViewTransition {
public SquareToCircleImageViewTransition(Context context, AttributeSet attrs) {
super(true);
}
}