diff options
author | Joe Onorato <joeo@google.com> | 2010-10-10 11:26:02 -0700 |
---|---|---|
committer | Patrick Dubroy <dubroy@google.com> | 2010-10-13 12:01:04 -0700 |
commit | 4be866d3a1665aa2098cb5d38d535b1ad1aab6d6 (patch) | |
tree | 2013e9ad151f31aecae8af27a0a213438549fdb2 /src/com/android/launcher2/HolographicOutlineHelper.java | |
parent | b0b2e6f588367cf40a4270cca81af7d78f8e382e (diff) | |
download | android_packages_apps_Trebuchet-4be866d3a1665aa2098cb5d38d535b1ad1aab6d6.tar.gz android_packages_apps_Trebuchet-4be866d3a1665aa2098cb5d38d535b1ad1aab6d6.tar.bz2 android_packages_apps_Trebuchet-4be866d3a1665aa2098cb5d38d535b1ad1aab6d6.zip |
fix 3029324: Implement new drag feedback
Add "shrinkwrap" icon outlines to visualize where the item will land
Diffstat (limited to 'src/com/android/launcher2/HolographicOutlineHelper.java')
-rw-r--r-- | src/com/android/launcher2/HolographicOutlineHelper.java | 89 |
1 files changed, 75 insertions, 14 deletions
diff --git a/src/com/android/launcher2/HolographicOutlineHelper.java b/src/com/android/launcher2/HolographicOutlineHelper.java index 9e61b79d0..ea4b01a4c 100644 --- a/src/com/android/launcher2/HolographicOutlineHelper.java +++ b/src/com/android/launcher2/HolographicOutlineHelper.java @@ -19,26 +19,42 @@ package com.android.launcher2; import android.graphics.Bitmap; import android.graphics.BlurMaskFilter; import android.graphics.Canvas; +import android.graphics.MaskFilter; import android.graphics.Paint; import android.graphics.PorterDuff; import android.graphics.PorterDuffXfermode; +import android.graphics.Rect; +import android.graphics.TableMaskFilter; public class HolographicOutlineHelper { private final Paint mHolographicPaint = new Paint(); - private final Paint mExpensiveBlurPaint = new Paint(); + private final Paint mBlurPaint = new Paint(); private final Paint mErasePaint = new Paint(); - private static final BlurMaskFilter mThickOuterBlurMaskFilter = new BlurMaskFilter(6.0f, - BlurMaskFilter.Blur.OUTER); - private static final BlurMaskFilter mThinOuterBlurMaskFilter = new BlurMaskFilter(1.0f, - BlurMaskFilter.Blur.OUTER); - private static final BlurMaskFilter mThickInnerBlurMaskFilter = new BlurMaskFilter(4.0f, - BlurMaskFilter.Blur.NORMAL); + private static final BlurMaskFilter sLargeGlowBlurMaskFilter = new BlurMaskFilter( + 10.0f, BlurMaskFilter.Blur.OUTER); + private static final BlurMaskFilter sThickOuterBlurMaskFilter = new BlurMaskFilter( + 6.0f, BlurMaskFilter.Blur.OUTER); + private static final BlurMaskFilter sMediumOuterBlurMaskFilter = new BlurMaskFilter( + 2.0f, BlurMaskFilter.Blur.OUTER); + private static final BlurMaskFilter sThinOuterBlurMaskFilter = new BlurMaskFilter( + 1.0f, BlurMaskFilter.Blur.OUTER); + + private static final BlurMaskFilter sThickInnerBlurMaskFilter = new BlurMaskFilter( + 4.0f, BlurMaskFilter.Blur.NORMAL); + private static final BlurMaskFilter sThinInnerBlurMaskFilter = new BlurMaskFilter( + 1.0f, BlurMaskFilter.Blur.INNER); + + private static final MaskFilter sFineClipTable = TableMaskFilter.CreateClipTable(0, 20); + private static final MaskFilter sCoarseClipTable = TableMaskFilter.CreateClipTable(0, 200); + + private int[] mTempOffset = new int[2]; HolographicOutlineHelper() { mHolographicPaint.setFilterBitmap(true); mHolographicPaint.setAntiAlias(true); - mExpensiveBlurPaint.setFilterBitmap(true); + mBlurPaint.setFilterBitmap(true); + mBlurPaint.setAntiAlias(true); mErasePaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_OUT)); mErasePaint.setFilterBitmap(true); mErasePaint.setAntiAlias(true); @@ -65,6 +81,51 @@ public class HolographicOutlineHelper { } } + void applyGlow(Bitmap bitmap, Canvas canvas, int color) { + mBlurPaint.setMaskFilter(sThickOuterBlurMaskFilter); + Bitmap glow = bitmap.extractAlpha(mBlurPaint, mTempOffset); + + // Use the clip table to make the glow heavier closer to the outline + mHolographicPaint.setMaskFilter(sCoarseClipTable); + mHolographicPaint.setAlpha(150); + mHolographicPaint.setColor(color); + canvas.drawBitmap(glow, mTempOffset[0], mTempOffset[1], mHolographicPaint); + glow.recycle(); + } + + /** + * Draws a solid outline around a bitmap, erasing the original pixels. + * + * @param bitmap The bitmap to modify + * @param canvas A canvas on the bitmap + * @param color The color to draw the outline and glow in + * @param removeOrig If true, punch out the original pixels to just leave the outline + */ + void applyExpensiveOuterOutline(Bitmap bitmap, Canvas canvas, int color, boolean removeOrig) { + Bitmap originalImage = null; + if (removeOrig) { + originalImage = bitmap.extractAlpha(); + } + + // Compute an outer blur on the original bitmap + mBlurPaint.setMaskFilter(sMediumOuterBlurMaskFilter); + Bitmap outline = bitmap.extractAlpha(mBlurPaint, mTempOffset); + + // Paint the blurred bitmap back into the canvas. Using the clip table causes any alpha + // pixels above a certain threshold to be rounded up to be fully opaque. This gives the + // effect of a thick outline, with a slight blur on the edge + mHolographicPaint.setColor(color); + mHolographicPaint.setMaskFilter(sFineClipTable); + canvas.drawBitmap(outline, mTempOffset[0], mTempOffset[1], mHolographicPaint); + outline.recycle(); + + if (removeOrig) { + // Finally, punch out the original pixels, leaving just the outline + canvas.drawBitmap(originalImage, 0, 0, mErasePaint); + originalImage.recycle(); + } + } + /** * Applies a more expensive and accurate outline to whatever is currently drawn in a specified * bitmap. @@ -72,18 +133,18 @@ public class HolographicOutlineHelper { void applyExpensiveOutlineWithBlur(Bitmap srcDst, Canvas srcDstCanvas, int color, int outlineColor) { // calculate the outer blur first - mExpensiveBlurPaint.setMaskFilter(mThickOuterBlurMaskFilter); + mBlurPaint.setMaskFilter(sThickOuterBlurMaskFilter); int[] outerBlurOffset = new int[2]; - Bitmap thickOuterBlur = srcDst.extractAlpha(mExpensiveBlurPaint, outerBlurOffset); - mExpensiveBlurPaint.setMaskFilter(mThinOuterBlurMaskFilter); + Bitmap thickOuterBlur = srcDst.extractAlpha(mBlurPaint, outerBlurOffset); + mBlurPaint.setMaskFilter(sThinOuterBlurMaskFilter); int[] thinOuterBlurOffset = new int[2]; - Bitmap thinOuterBlur = srcDst.extractAlpha(mExpensiveBlurPaint, thinOuterBlurOffset); + Bitmap thinOuterBlur = srcDst.extractAlpha(mBlurPaint, thinOuterBlurOffset); // calculate the inner blur srcDstCanvas.drawColor(0xFF000000, PorterDuff.Mode.SRC_OUT); - mExpensiveBlurPaint.setMaskFilter(mThickInnerBlurMaskFilter); + mBlurPaint.setMaskFilter(sThickInnerBlurMaskFilter); int[] thickInnerBlurOffset = new int[2]; - Bitmap thickInnerBlur = srcDst.extractAlpha(mExpensiveBlurPaint, thickInnerBlurOffset); + Bitmap thickInnerBlur = srcDst.extractAlpha(mBlurPaint, thickInnerBlurOffset); // mask out the inner blur srcDstCanvas.setBitmap(thickInnerBlur); |