summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authornicolasroard <nicolasroard@google.com>2013-08-28 17:21:52 -0700
committernicolasroard <nicolasroard@google.com>2013-08-28 17:21:52 -0700
commit3c0befde1461bd5dad6794bc889a24f3a3ebf475 (patch)
tree08c89ea5e95c91f2df5d51ecb36e88acfc18435c /src
parent80b216d5c8e17e0358cf1508a1e177ccada8383f (diff)
downloadandroid_packages_apps_Gallery2-3c0befde1461bd5dad6794bc889a24f3a3ebf475.tar.gz
android_packages_apps_Gallery2-3c0befde1461bd5dad6794bc889a24f3a3ebf475.tar.bz2
android_packages_apps_Gallery2-3c0befde1461bd5dad6794bc889a24f3a3ebf475.zip
Fix rotation anims on slow device (svelte)
Change-Id: If9050f7a17d9e3964d6bf35d649567c222f7fefe
Diffstat (limited to 'src')
-rw-r--r--src/com/android/gallery3d/filtershow/imageshow/ImageShow.java33
-rw-r--r--src/com/android/gallery3d/filtershow/imageshow/MasterImage.java55
2 files changed, 60 insertions, 28 deletions
diff --git a/src/com/android/gallery3d/filtershow/imageshow/ImageShow.java b/src/com/android/gallery3d/filtershow/imageshow/ImageShow.java
index ad4568723..77eaf4dc7 100644
--- a/src/com/android/gallery3d/filtershow/imageshow/ImageShow.java
+++ b/src/com/android/gallery3d/filtershow/imageshow/ImageShow.java
@@ -101,6 +101,7 @@ public class ImageShow extends View implements OnGestureListener,
private static Bitmap sMask;
private Paint mMaskPaint = new Paint();
private Matrix mShaderMatrix = new Matrix();
+ private boolean mDidStartAnimation = false;
private static Bitmap convertToAlphaMask(Bitmap b) {
Bitmap a = Bitmap.createBitmap(b.getWidth(), b.getHeight(), Bitmap.Config.ALPHA_8);
@@ -302,7 +303,7 @@ public class ImageShow extends View implements OnGestureListener,
return;
}
- Rect d = computeImageBounds(image);
+ Rect d = computeImageBounds(image.getWidth(), image.getHeight());
if (updateBounds) {
mImageBounds = d;
@@ -313,12 +314,14 @@ public class ImageShow extends View implements OnGestureListener,
MasterImage master = MasterImage.getImage();
canvas.save();
- if (master.onGoingNewLookAnimation()) {
+ if (master.onGoingNewLookAnimation()
+ || mDidStartAnimation) {
+ mDidStartAnimation = true;
if (master.getCurrentLookAnimation()
== MasterImage.CIRCLE_ANIMATION
&& MasterImage.getImage().getPreviousImage() != null) {
float maskScale = MasterImage.getImage().getMaskScale();
- if (maskScale > 1.0f) {
+ if (maskScale > 0.0f) {
float maskW = sMask.getWidth() / 2.0f;
float maskH = sMask.getHeight() / 2.0f;
float x = centerX - maskW * maskScale;
@@ -344,8 +347,11 @@ public class ImageShow extends View implements OnGestureListener,
}
} else if (master.getCurrentLookAnimation()
== MasterImage.ROTATE_ANIMATION) {
- Rect d2 = computeImageBounds(master.getPreviousImage());
- float finalScale = d.width() / (float) d2.height();
+ Rect d1 = computeImageBounds(master.getPreviousImage().getHeight(),
+ master.getPreviousImage().getWidth());
+ Rect d2 = computeImageBounds(master.getPreviousImage().getWidth(),
+ master.getPreviousImage().getHeight());
+ float finalScale = d1.width() / (float) d2.height();
finalScale = (1.0f * (1.0f - master.getAnimFraction()))
+ (finalScale * master.getAnimFraction());
canvas.rotate(master.getAnimRotationValue(), centerX, centerY);
@@ -391,11 +397,18 @@ public class ImageShow extends View implements OnGestureListener,
} else {
drawImage(canvas, image);
}
+
+ if (!master.onGoingNewLookAnimation()
+ && mDidStartAnimation
+ && !master.getPreviousPreset().equals(master.getCurrentPreset())) {
+ mDidStartAnimation = false;
+ MasterImage.getImage().resetAnimBitmap();
+ }
canvas.restore();
}
private void drawImage(Canvas canvas, Bitmap image) {
- Rect d = computeImageBounds(image);
+ Rect d = computeImageBounds(image.getWidth(), image.getHeight());
float scaleImageX = d.width() / (float) image.getWidth();
float scaleImageY = d.height() / (float) image.getHeight();
Matrix imageMatrix = new Matrix();
@@ -406,12 +419,12 @@ public class ImageShow extends View implements OnGestureListener,
canvas.drawBitmap(image, imageMatrix, mPaint);
}
- private Rect computeImageBounds(Bitmap image) {
- float scale = GeometryMathUtils.scale(image.getWidth(), image.getHeight(),
+ private Rect computeImageBounds(int imageWidth, int imageHeight) {
+ float scale = GeometryMathUtils.scale(imageWidth, imageHeight,
getWidth(), getHeight());
- float w = image.getWidth() * scale;
- float h = image.getHeight() * scale;
+ float w = imageWidth * scale;
+ float h = imageHeight * scale;
float ty = (getHeight() - h) / 2.0f;
float tx = (getWidth() - w) / 2.0f;
return new Rect((int) tx + mShadowMargin,
diff --git a/src/com/android/gallery3d/filtershow/imageshow/MasterImage.java b/src/com/android/gallery3d/filtershow/imageshow/MasterImage.java
index 53ed0378e..c562e4a88 100644
--- a/src/com/android/gallery3d/filtershow/imageshow/MasterImage.java
+++ b/src/com/android/gallery3d/filtershow/imageshow/MasterImage.java
@@ -24,9 +24,6 @@ import android.graphics.Point;
import android.graphics.Rect;
import android.graphics.RectF;
import android.net.Uri;
-import android.os.Handler;
-import android.os.Message;
-import android.util.Log;
import com.android.gallery3d.exif.ExifTag;
import com.android.gallery3d.filtershow.FilterShowActivity;
@@ -84,10 +81,13 @@ public class MasterImage implements RenderingRequestCaller {
private Bitmap mPartialBitmap = null;
private Bitmap mHighresBitmap = null;
private Bitmap mPreviousImage = null;
+ private ImagePreset mPreviousPreset = null;
+ private ValueAnimator mAnimator = null;
private float mMaskScale = 1;
private boolean mOnGoingNewLookAnimation = false;
private float mAnimRotationValue = 0;
+ private float mCurrentAnimRotationStartValue = 0;
private float mAnimFraction = 0;
private int mCurrentLookAnimation = 0;
public static final int CIRCLE_ANIMATION = 1;
@@ -358,6 +358,14 @@ public class MasterImage implements RenderingRequestCaller {
return mPreviousImage;
}
+ public ImagePreset getPreviousPreset() {
+ return mPreviousPreset;
+ }
+
+ public ImagePreset getCurrentPreset() {
+ return getPreviewBuffer().getConsumer().getPreset();
+ }
+
public float getMaskScale() {
return mMaskScale;
}
@@ -372,7 +380,7 @@ public class MasterImage implements RenderingRequestCaller {
}
public void setAnimRotation(float rotation) {
- mAnimRotationValue = rotation;
+ mAnimRotationValue = mCurrentAnimRotationStartValue + rotation;
notifyObservers();
}
@@ -392,31 +400,44 @@ public class MasterImage implements RenderingRequestCaller {
return mCurrentLookAnimation;
}
+ public void resetAnimBitmap() {
+ mBitmapCache.cache(mPreviousImage);
+ mPreviousImage = null;
+ }
+
public void onNewLook(FilterRepresentation newRepresentation) {
getBitmapCache().cache(mPreviousImage);
if (getFilteredImage() == null) {
return;
}
- mPreviousImage = getBitmapCache().getBitmapCopy(getFilteredImage());
- ValueAnimator animator = null;
+ if (mAnimator != null) {
+ mAnimator.cancel();
+ if (mCurrentLookAnimation == ROTATE_ANIMATION) {
+ mCurrentAnimRotationStartValue += 90;
+ }
+ } else {
+ mPreviousImage = getBitmapCache().getBitmapCopy(getFilteredImage());
+ }
+ mPreviousPreset = getPreviewBuffer().getConsumer().getPreset();
if (newRepresentation instanceof FilterUserPresetRepresentation) {
mCurrentLookAnimation = CIRCLE_ANIMATION;
- animator = ValueAnimator.ofFloat(1, 20);
+ mAnimator = ValueAnimator.ofFloat(0, 20);
+ mAnimator.setDuration(500);
}
if (newRepresentation instanceof FilterRotateRepresentation) {
mCurrentLookAnimation = ROTATE_ANIMATION;
- animator = ValueAnimator.ofFloat(0, 90);
+ mAnimator = ValueAnimator.ofFloat(0, 90);
+ mAnimator.setDuration(500);
}
if (newRepresentation instanceof FilterMirrorRepresentation) {
mCurrentLookAnimation = MIRROR_ANIMATION;
- animator = ValueAnimator.ofFloat(1, 0, -1);
+ mAnimator = ValueAnimator.ofFloat(1, 0, -1);
+ mAnimator.setDuration(500);
}
- animator.setDuration(400);
- animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
+ mAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
if (mCurrentLookAnimation == CIRCLE_ANIMATION) {
- Log.v(LOGTAG, "circle animation " + animation.getAnimatedValue());
setMaskScale((Float) animation.getAnimatedValue());
} else if (mCurrentLookAnimation == ROTATE_ANIMATION
|| mCurrentLookAnimation == MIRROR_ANIMATION) {
@@ -425,7 +446,7 @@ public class MasterImage implements RenderingRequestCaller {
}
}
});
- animator.addListener(new Animator.AnimatorListener() {
+ mAnimator.addListener(new Animator.AnimatorListener() {
@Override
public void onAnimationStart(Animator animation) {
mOnGoingNewLookAnimation = true;
@@ -433,11 +454,9 @@ public class MasterImage implements RenderingRequestCaller {
@Override
public void onAnimationEnd(Animator animation) {
- mBitmapCache.cache(mPreviousImage);
- mPreviousImage = null;
mOnGoingNewLookAnimation = false;
- setMaskScale(1);
- setAnimRotation(0);
+ mCurrentAnimRotationStartValue = 0;
+ mAnimator = null;
}
@Override
@@ -450,7 +469,7 @@ public class MasterImage implements RenderingRequestCaller {
}
});
- animator.start();
+ mAnimator.start();
notifyObservers();
}