summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMark Wei <markwei@google.com>2013-11-21 00:58:33 -0800
committerMark Wei <markwei@google.com>2014-01-22 21:30:34 -0800
commit89e59f00d67791754e44e65413baa95f94056df4 (patch)
tree25c052346e9f118ed410eeffa58db0f104bbaf3b /src
parent1ef4c6b7fdbc6e36c030e4a6fab3a8ccf8ba524b (diff)
downloadbitmap-89e59f00d67791754e44e65413baa95f94056df4.tar.gz
Decouple parallaxSpeedMultiplier from setDecodeDimensions().
Expose decode vertical center through ExtendedOptions. Genericize BitmapDrawableImageView#getTypedDrawable(). Bug: 11691744 Change-Id: I62e05ab2136cf031eaf1752dba728156c97c87a6
Diffstat (limited to 'src')
-rw-r--r--src/com/android/bitmap/drawable/BasicBitmapDrawable.java21
-rw-r--r--src/com/android/bitmap/drawable/ExtendedBitmapDrawable.java48
-rw-r--r--src/com/android/bitmap/view/BitmapDrawableImageView.java17
3 files changed, 65 insertions, 21 deletions
diff --git a/src/com/android/bitmap/drawable/BasicBitmapDrawable.java b/src/com/android/bitmap/drawable/BasicBitmapDrawable.java
index 684d322..a09daad 100644
--- a/src/com/android/bitmap/drawable/BasicBitmapDrawable.java
+++ b/src/com/android/bitmap/drawable/BasicBitmapDrawable.java
@@ -119,10 +119,12 @@ public class BasicBitmapDrawable extends Drawable implements DecodeCallback,
*
* All UI operations should be called from the UI thread.
*/
- public final void setDecodeDimensions(int w, int h) {
- mDecodeWidth = w;
- mDecodeHeight = h;
- bind(mCurrKey);
+ public void setDecodeDimensions(int width, int height) {
+ if (mDecodeWidth == 0 || mDecodeHeight == 0) {
+ mDecodeWidth = width;
+ mDecodeHeight = height;
+ setImage(mCurrKey);
+ }
}
/**
@@ -133,6 +135,9 @@ public class BasicBitmapDrawable extends Drawable implements DecodeCallback,
*/
public void bind(RequestKey key) {
Trace.beginSection("bind");
+ if (mCurrKey != null && mCurrKey.equals(key)) {
+ return;
+ }
setImage(key);
Trace.endSection();
}
@@ -153,10 +158,6 @@ public class BasicBitmapDrawable extends Drawable implements DecodeCallback,
* Should only be overriden, not called.
*/
protected void setImage(final RequestKey key) {
- if (mCurrKey != null && mCurrKey.equals(key)) {
- return;
- }
-
Trace.beginSection("set image");
Trace.beginSection("release reference");
if (mBitmap != null) {
@@ -282,6 +283,10 @@ public class BasicBitmapDrawable extends Drawable implements DecodeCallback,
return NO_MULTIPLIER;
}
+ /**
+ * Clients can override this to specify which section of the source image to decode from.
+ * Possible applications include using face detection to always decode around facial features.
+ */
protected float getDecodeVerticalCenter() {
return VERTICAL_CENTER;
}
diff --git a/src/com/android/bitmap/drawable/ExtendedBitmapDrawable.java b/src/com/android/bitmap/drawable/ExtendedBitmapDrawable.java
index 6d9f05f..b6093e7 100644
--- a/src/com/android/bitmap/drawable/ExtendedBitmapDrawable.java
+++ b/src/com/android/bitmap/drawable/ExtendedBitmapDrawable.java
@@ -61,7 +61,6 @@ public class ExtendedBitmapDrawable extends BasicBitmapDrawable implements
private final ExtendedOptions mOpts;
// Parallax.
- private static final float DECODE_VERTICAL_CENTER = 1f / 3;
private float mParallaxFraction = 1f / 2;
// State changes.
@@ -157,12 +156,26 @@ public class ExtendedBitmapDrawable extends BasicBitmapDrawable implements
setLoadState(LOAD_STATE_FAILED);
}
+ /**
+ * Directly sets the decode width and height. The given height should already have had the
+ * parallaxSpeedMultiplier applied to it.
+ */
+ public void setExactDecodeDimensions(int width, int height) {
+ super.setDecodeDimensions(width, height);
+ }
+
+ /**
+ * {@inheritDoc}
+ *
+ * The given height should not have had the parallaxSpeedMultiplier applied to it.
+ */
@Override
- protected void setImage(final RequestKey key) {
- if (mCurrKey != null && mCurrKey.equals(key)) {
- return;
- }
+ public void setDecodeDimensions(int width, int height) {
+ super.setDecodeDimensions(width, (int) (height * mOpts.parallaxSpeedMultiplier));
+ }
+ @Override
+ protected void setImage(final RequestKey key) {
if (mCurrKey != null && getDecodeAggregator() != null) {
getDecodeAggregator().forget(mCurrKey);
}
@@ -212,13 +225,13 @@ public class ExtendedBitmapDrawable extends BasicBitmapDrawable implements
}
@Override
- protected float getDrawVerticalOffsetMultiplier() {
+ protected final float getDrawVerticalOffsetMultiplier() {
return mOpts.parallaxSpeedMultiplier;
}
@Override
protected float getDecodeVerticalCenter() {
- return DECODE_VERTICAL_CENTER;
+ return mOpts.decodeVerticalCenter;
}
private DecodeAggregator getDecodeAggregator() {
@@ -651,6 +664,23 @@ public class ExtendedBitmapDrawable extends BasicBitmapDrawable implements
public final int features;
/**
+ * Optional field for general decoding.
+ *
+ * This field determines which section of the source image to decode from. A value of 0
+ * indicates a preference for the very top of the source, while a value of 1 indicates a
+ * preference for the very bottom of the source. A value of .5 will result in the center
+ * of the source being decoded.
+ *
+ * This should not be confused with {@link #setParallaxFraction(float)}. This field
+ * determines the general section for decode. The parallax fraction then determines the
+ * slice from within that section for display.
+ *
+ * The default value of 1f / 3 provides a good heuristic for the subject's face in a
+ * portrait photo.
+ */
+ public float decodeVerticalCenter = 1f / 3;
+
+ /**
* Required field if {@link #FEATURE_ORDERED_DISPLAY} is supported.
*/
public DecodeAggregator decodeAggregator = null;
@@ -725,6 +755,10 @@ public class ExtendedBitmapDrawable extends BasicBitmapDrawable implements
*/
private void validate()
throws IllegalStateException {
+ if (decodeVerticalCenter < 0 || decodeVerticalCenter > 1) {
+ throw new IllegalStateException(
+ "ExtendedOptions: decodeVerticalCenter must be within 0 and 1, inclusive");
+ }
if ((features & FEATURE_ORDERED_DISPLAY) != 0 && decodeAggregator == null) {
throw new IllegalStateException(
"ExtendedOptions: To support FEATURE_ORDERED_DISPLAY, "
diff --git a/src/com/android/bitmap/view/BitmapDrawableImageView.java b/src/com/android/bitmap/view/BitmapDrawableImageView.java
index b776c34..67ef3eb 100644
--- a/src/com/android/bitmap/view/BitmapDrawableImageView.java
+++ b/src/com/android/bitmap/view/BitmapDrawableImageView.java
@@ -47,18 +47,23 @@ public class BitmapDrawableImageView extends ImageView {
}
/**
- * Get the source BasicBitmapDrawable for this BitmapDrawableImageView.
- * @return The source drawable.
+ * Get the source drawable for this BitmapDrawableImageView.
+ * @return The source drawable casted to the given type, or null if the type does not match.
*/
- public BasicBitmapDrawable getBasicBitmapDrawable() {
- return mDrawable;
+ @SuppressWarnings("unchecked") // Cast to type parameter.
+ public <E extends BasicBitmapDrawable> E getTypedDrawable() {
+ try {
+ return (E) mDrawable;
+ } catch (Exception ignored) {
+ return null;
+ }
}
/**
- * Set the given BasicBitmapDrawable as the source for this BitmapDrawableImageView.
+ * Set the given drawable as the source for this BitmapDrawableImageView.
* @param drawable The source drawable.
*/
- public void setBasicBitmapDrawable(BasicBitmapDrawable drawable) {
+ public <E extends BasicBitmapDrawable> void setTypedDrawable(E drawable) {
super.setImageDrawable(drawable);
unbindDrawable();
mDrawable = drawable;