Ran tests (#179)
diff --git a/LottieSample/screenshots/LottieLogo1.png b/LottieSample/screenshots/LottieLogo1.png index a402f3b..54744cb 100644 --- a/LottieSample/screenshots/LottieLogo1.png +++ b/LottieSample/screenshots/LottieLogo1.png Binary files differ
diff --git a/LottieSample/screenshots/LottieLogo2.png b/LottieSample/screenshots/LottieLogo2.png index f9355c8..3871e29 100644 --- a/LottieSample/screenshots/LottieLogo2.png +++ b/LottieSample/screenshots/LottieLogo2.png Binary files differ
diff --git a/LottieSample/screenshots/MotionCorpse-Jrcanest.png b/LottieSample/screenshots/MotionCorpse-Jrcanest.png index c7eea27..713a34a 100644 --- a/LottieSample/screenshots/MotionCorpse-Jrcanest.png +++ b/LottieSample/screenshots/MotionCorpse-Jrcanest.png Binary files differ
diff --git a/lottie/src/main/java/com/airbnb/lottie/LottieAnimationView.java b/lottie/src/main/java/com/airbnb/lottie/LottieAnimationView.java index 3e0369d..7f0fd5f 100644 --- a/lottie/src/main/java/com/airbnb/lottie/LottieAnimationView.java +++ b/lottie/src/main/java/com/airbnb/lottie/LottieAnimationView.java
@@ -6,14 +6,12 @@ import android.content.res.TypedArray; import android.graphics.drawable.Drawable; import android.os.Build; -import android.os.Looper; import android.os.Parcel; import android.os.Parcelable; import android.provider.Settings; import android.support.annotation.FloatRange; import android.support.annotation.NonNull; import android.support.annotation.Nullable; -import android.support.annotation.UiThread; import android.support.annotation.VisibleForTesting; import android.support.v7.widget.AppCompatImageView; import android.text.TextUtils; @@ -174,10 +172,7 @@ super.onDetachedFromWindow(); } - @UiThread @VisibleForTesting void recycleBitmaps() { - if (Looper.myLooper() != Looper.getMainLooper()) { - throw new IllegalStateException("This must be called from the main thread."); - } + @VisibleForTesting void recycleBitmaps() { lottieDrawable.recycleBitmaps(); } @@ -268,6 +263,21 @@ return; } + int screenWidth = Utils.getScreenWidth(getContext()); + int screenHeight = Utils.getScreenHeight(getContext()); + int compWidth = composition.getBounds().width(); + int compHeight = composition.getBounds().height(); + if (compWidth > screenWidth || + compHeight > screenHeight) { + float xScale = screenWidth / (float) compWidth; + float yScale = screenHeight / (float) compHeight; + setScale(Math.min(xScale, yScale)); + Log.w(L.TAG, String.format( + "Composition larger than the screen %dx%d vs %dx%d. Scaling down.", + compWidth, compHeight, screenWidth, screenHeight)); + } + + // If you set a different composition on the view, the bounds will not update unless // the drawable is different than the original. setImageDrawable(null);
diff --git a/lottie/src/main/java/com/airbnb/lottie/LottieDrawable.java b/lottie/src/main/java/com/airbnb/lottie/LottieDrawable.java index b6b7132..03dbf82 100644 --- a/lottie/src/main/java/com/airbnb/lottie/LottieDrawable.java +++ b/lottie/src/main/java/com/airbnb/lottie/LottieDrawable.java
@@ -132,6 +132,7 @@ clearComposition(); this.composition = composition; setSpeed(speed); + setScale(1f); updateBounds(); buildLayersForComposition(composition); @@ -196,9 +197,6 @@ if (composition == null) { return; } - float xScale = canvas.getWidth() / (float) composition.getBounds().width(); - float yScale = canvas.getHeight() / (float) composition.getBounds().height(); - setScale(Math.min(xScale, yScale)); int saveCount = canvas.save(); canvas.clipRect(0, 0, getIntrinsicWidth(), getIntrinsicHeight());
diff --git a/lottie/src/main/java/com/airbnb/lottie/Utils.java b/lottie/src/main/java/com/airbnb/lottie/Utils.java index 789d410..69824df 100644 --- a/lottie/src/main/java/com/airbnb/lottie/Utils.java +++ b/lottie/src/main/java/com/airbnb/lottie/Utils.java
@@ -1,12 +1,16 @@ package com.airbnb.lottie; +import android.content.Context; import android.graphics.Path; import android.graphics.PointF; +import android.util.DisplayMetrics; +import android.view.WindowManager; import java.io.Closeable; final class Utils { private static PointF emptyPoint; + private static DisplayMetrics displayMetrics; static PointF emptyPoint() { if (emptyPoint == null) { @@ -40,4 +44,22 @@ } } } + + static int getScreenWidth(Context context) { + if (displayMetrics == null) { + displayMetrics = new DisplayMetrics(); + } + WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE); + wm.getDefaultDisplay().getMetrics(displayMetrics); + return displayMetrics.widthPixels; + } + + static int getScreenHeight(Context context) { + if (displayMetrics == null) { + displayMetrics = new DisplayMetrics(); + } + WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE); + wm.getDefaultDisplay().getMetrics(displayMetrics); + return displayMetrics.heightPixels; + } }