diff options
author | Michael Jurka <mikejurka@google.com> | 2010-12-14 16:46:39 -0800 |
---|---|---|
committer | Michael Jurka <mikejurka@google.com> | 2010-12-15 21:18:17 -0800 |
commit | 38b4f7c5eab773ad36048b5ab8713750dcaaf748 (patch) | |
tree | 68f28e9d9a7fcd279cd53eb5ea994b3e64186fee /src/com/android/launcher2/BubbleTextView.java | |
parent | 760e5375f003accf04f789e90a919ed476d4c335 (diff) | |
download | android_packages_apps_Trebuchet-38b4f7c5eab773ad36048b5ab8713750dcaaf748.tar.gz android_packages_apps_Trebuchet-38b4f7c5eab773ad36048b5ab8713750dcaaf748.tar.bz2 android_packages_apps_Trebuchet-38b4f7c5eab773ad36048b5ab8713750dcaaf748.zip |
holo look for pressed/focused workspace icons
Change-Id: Ia964c868afd200be3828e4397659391f857599e6
Diffstat (limited to 'src/com/android/launcher2/BubbleTextView.java')
-rw-r--r-- | src/com/android/launcher2/BubbleTextView.java | 144 |
1 files changed, 128 insertions, 16 deletions
diff --git a/src/com/android/launcher2/BubbleTextView.java b/src/com/android/launcher2/BubbleTextView.java index 995877b91..6e2a58b9e 100644 --- a/src/com/android/launcher2/BubbleTextView.java +++ b/src/com/android/launcher2/BubbleTextView.java @@ -16,18 +16,19 @@ package com.android.launcher2; +import com.android.launcher.R; + import android.content.Context; import android.content.res.Resources; import android.graphics.Bitmap; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; -import android.graphics.RectF; +import android.graphics.Rect; +import android.graphics.Region.Op; import android.graphics.drawable.Drawable; -import android.text.Layout; import android.util.AttributeSet; - -import com.android.launcher.R; +import android.view.MotionEvent; /** * TextView that draws a bubble behind the text. We cannot use a LineBackgroundSpan @@ -44,16 +45,23 @@ public class BubbleTextView extends CacheableTextView { static final float PADDING_H = 8.0f; static final float PADDING_V = 3.0f; - private final RectF mRect = new RectF(); private Paint mPaint; private float mBubbleColorAlpha; private int mPrevAlpha = -1; + private final HolographicOutlineHelper mOutlineHelper = new HolographicOutlineHelper(); + private final Canvas mTempCanvas = new Canvas(); + private final Rect mTempRect = new Rect(); + private final Paint mTempPaint = new Paint(); + private boolean mDidInvalidateForPressedState; + private Bitmap mPressedOrFocusedBackground; + private int mFocusedOutlineColor; + private int mFocusedGlowColor; + private int mPressedOutlineColor; + private int mPressedGlowColor; + private boolean mBackgroundSizeChanged; private Drawable mBackground; - private float mCornerRadius; - private float mPaddingH; - private float mPaddingV; public BubbleTextView(Context context) { super(context); @@ -80,12 +88,13 @@ public class BubbleTextView extends CacheableTextView { mPaint = new Paint(Paint.ANTI_ALIAS_FLAG); mPaint.setColor(bubbleColor); mBubbleColorAlpha = Color.alpha(bubbleColor) / 255.0f; - - final float scale = res.getDisplayMetrics().density; - mCornerRadius = CORNER_RADIUS * scale; - mPaddingH = PADDING_H * scale; - //noinspection PointlessArithmeticExpression - mPaddingV = PADDING_V * scale; + mFocusedOutlineColor = + getResources().getColor(R.color.workspace_item_focused_outline_color); + mFocusedGlowColor = getResources().getColor(R.color.workspace_item_focused_glow_color); + mPressedOutlineColor = + getResources().getColor(R.color.workspace_item_pressed_outline_color); + mPressedGlowColor = + getResources().getColor(R.color.workspace_item_pressed_glow_color); } protected int getCacheTopPadding() { @@ -110,7 +119,6 @@ public class BubbleTextView extends CacheableTextView { setText(info.title); buildAndEnableCache(); setTag(info); - } @Override @@ -128,6 +136,28 @@ public class BubbleTextView extends CacheableTextView { @Override protected void drawableStateChanged() { + if (isPressed()) { + // In this case, we have already created the pressed outline on ACTION_DOWN, + // so we just need to do an invalidate to trigger draw + if (!mDidInvalidateForPressedState) { + invalidate(); + } + } else { + // Otherwise, either clear the pressed/focused background, or create a background + // for the focused state + final boolean backgroundEmptyBefore = mPressedOrFocusedBackground == null; + mPressedOrFocusedBackground = null; + if (isFocused()) { + mPressedOrFocusedBackground = createGlowingOutline( + mTempCanvas, mFocusedGlowColor, mFocusedOutlineColor); + invalidate(); + } + final boolean backgroundEmptyNow = mPressedOrFocusedBackground == null; + if (!backgroundEmptyBefore && backgroundEmptyNow) { + invalidate(); + } + } + Drawable d = mBackground; if (d != null && d.isStateful()) { d.setState(getDrawableState()); @@ -135,8 +165,91 @@ public class BubbleTextView extends CacheableTextView { super.drawableStateChanged(); } + /** + * Draw the View v into the given Canvas. + * + * @param v the view to draw + * @param destCanvas the canvas to draw on + * @param padding the horizontal and vertical padding to use when drawing + */ + private void drawWithPadding(Canvas destCanvas, int padding) { + final Rect clipRect = mTempRect; + getDrawingRect(clipRect); + + // adjust the clip rect so that we don't include the text label + clipRect.bottom = + getExtendedPaddingTop() - (int) BubbleTextView.PADDING_V + getLayout().getLineTop(0); + + // Draw the View into the bitmap. + // The translate of scrollX and scrollY is necessary when drawing TextViews, because + // they set scrollX and scrollY to large values to achieve centered text + destCanvas.save(); + destCanvas.translate(-getScrollX() + padding / 2, -getScrollY() + padding / 2); + destCanvas.clipRect(clipRect, Op.REPLACE); + draw(destCanvas); + destCanvas.restore(); + } + + /** + * Returns a new bitmap to be used as the object outline, e.g. to visualize the drop location. + * Responsibility for the bitmap is transferred to the caller. + */ + private Bitmap createGlowingOutline(Canvas canvas, int outlineColor, int glowColor) { + final int padding = HolographicOutlineHelper.MAX_OUTER_BLUR_RADIUS; + final Bitmap b = Bitmap.createBitmap( + getWidth() + padding, getHeight() + padding, Bitmap.Config.ARGB_8888); + + canvas.setBitmap(b); + drawWithPadding(canvas, padding); + mOutlineHelper.applyExtraThickExpensiveOutlineWithBlur(b, canvas, glowColor, outlineColor); + + return b; + } + + @Override + public boolean onTouchEvent(MotionEvent event) { + // Call the superclass onTouchEvent first, because sometimes it changes the state to + // isPressed() on an ACTION_UP + boolean result = super.onTouchEvent(event); + + switch (event.getAction()) { + case MotionEvent.ACTION_DOWN: + // So that the pressed outline is visible immediately when isPressed() is true, + // we pre-create it on ACTION_DOWN (it takes a small but perceptible amount of time + // to create it) + if (mPressedOrFocusedBackground == null) { + mPressedOrFocusedBackground = createGlowingOutline( + mTempCanvas, mPressedGlowColor, mPressedOutlineColor); + } + // Invalidate so the pressed state is visible, or set a flag so we know that we + // have to call invalidate as soon as the state is "pressed" + if (isPressed()) { + mDidInvalidateForPressedState = true; + invalidate(); + } else { + mDidInvalidateForPressedState = false; + } + break; + case MotionEvent.ACTION_CANCEL: + case MotionEvent.ACTION_UP: + // If we've touched down and up on an item, and it's still not "pressed", then + // destroy the pressed outline + if (!isPressed()) { + mPressedOrFocusedBackground = null; + } + break; + } + return result; + } + @Override public void draw(Canvas canvas) { + if (mPressedOrFocusedBackground != null && (isPressed() || isFocused())) { + canvas.drawBitmap(mPressedOrFocusedBackground, + mScrollX - HolographicOutlineHelper.MAX_OUTER_BLUR_RADIUS / 2, + mScrollY - HolographicOutlineHelper.MAX_OUTER_BLUR_RADIUS / 2, + mTempPaint); + } if (isBuildingCache()) { // We enhance the shadow by drawing the shadow twice this.setShadowLayer(SHADOW_LARGE_RADIUS, 0.0f, SHADOW_Y_OFFSET, SHADOW_LARGE_COLOUR); @@ -162,7 +275,6 @@ public class BubbleTextView extends CacheableTextView { canvas.translate(-scrollX, -scrollY); } } - super.draw(canvas); } } |