diff options
Diffstat (limited to 'src/com/android/launcher2/CellLayout.java')
-rw-r--r-- | src/com/android/launcher2/CellLayout.java | 106 |
1 files changed, 106 insertions, 0 deletions
diff --git a/src/com/android/launcher2/CellLayout.java b/src/com/android/launcher2/CellLayout.java index 7ca549e84..16f8135f1 100644 --- a/src/com/android/launcher2/CellLayout.java +++ b/src/com/android/launcher2/CellLayout.java @@ -22,7 +22,11 @@ import android.app.WallpaperManager; import android.content.Context; import android.content.res.Resources; import android.content.res.TypedArray; +import android.graphics.Bitmap; import android.graphics.Canvas; +import android.graphics.Matrix; +import android.graphics.Paint; +import android.graphics.PorterDuff; import android.graphics.Rect; import android.graphics.RectF; import android.graphics.drawable.Drawable; @@ -32,6 +36,7 @@ import android.view.MotionEvent; import android.view.View; import android.view.ViewDebug; import android.view.ViewGroup; +import android.view.View.OnTouchListener; import android.view.animation.Animation; import android.view.animation.LayoutAnimationController; @@ -40,6 +45,8 @@ import java.util.Arrays; public class CellLayout extends ViewGroup { static final String TAG = "CellLayout"; + // we make the dimmed bitmap smaller than the screen itself for memory + perf reasons + static final float DIMMED_BITMAP_SCALE = 0.25f; private boolean mPortrait; @@ -72,6 +79,18 @@ public class CellLayout extends ViewGroup { boolean[][] mOccupied; + private OnTouchListener mInterceptTouchListener; + + // this is what the home screen fades to when it shrinks + // (ie in all apps and in home screen customize mode) + private Bitmap mDimmedBitmap; + private Canvas mDimmedBitmapCanvas; + private float mDimmedBitmapAlpha; + private boolean mDimmedBitmapDirty; + private final Paint mDimmedBitmapPaint = new Paint(); + private final Rect mLayoutRect = new Rect(); + private final Rect mDimmedBitmapRect = new Rect(); + private final RectF mDragRect = new RectF(); // When dragging, used to indicate a vacant drop location @@ -130,6 +149,8 @@ public class CellLayout extends ViewGroup { setAlwaysDrawnWithCacheEnabled(false); mWallpaperManager = WallpaperManager.getInstance(getContext()); + + mDimmedBitmapPaint.setFilterBitmap(true); } @Override @@ -147,6 +168,15 @@ public class CellLayout extends ViewGroup { (int)mDragRect.bottom); mDragRectDrawable.draw(canvas); } + if (mDimmedBitmap != null && mDimmedBitmapAlpha > 0.0f) { + if (mDimmedBitmapDirty) { + updateDimmedBitmap(); + mDimmedBitmapDirty = false; + } + mDimmedBitmapPaint.setAlpha((int) (mDimmedBitmapAlpha * 255)); + + canvas.drawBitmap(mDimmedBitmap, mDimmedBitmapRect, mLayoutRect, mDimmedBitmapPaint); + } } @Override @@ -161,6 +191,10 @@ public class CellLayout extends ViewGroup { } } + public void setOnInterceptTouchListener(View.OnTouchListener listener) { + mInterceptTouchListener = listener; + } + int getCountX() { return mPortrait ? mShortAxisCells : mLongAxisCells; } @@ -183,13 +217,26 @@ public class CellLayout extends ViewGroup { child.setId(childId); + // We might be in the middle or end of shrinking/fading to a dimmed view + // Make sure this view's alpha is set the same as all the rest of the views + child.setAlpha(1.0f - mDimmedBitmapAlpha); + addView(child, index, lp); + + // next time we draw the dimmed bitmap we need to update it + mDimmedBitmapDirty = true; return true; } return false; } @Override + public void removeView(View view) { + super.removeView(view); + mDimmedBitmapDirty = true; + } + + @Override public void requestChildFocus(View child, View focused) { super.requestChildFocus(child, focused); if (child != null) { @@ -267,6 +314,9 @@ public class CellLayout extends ViewGroup { @Override public boolean onInterceptTouchEvent(MotionEvent ev) { + if (mInterceptTouchListener != null && mInterceptTouchListener.onTouch(this, ev)) { + return true; + } final int action = ev.getAction(); final CellInfo cellInfo = mCellInfo; @@ -654,6 +704,13 @@ public class CellLayout extends ViewGroup { } @Override + protected void onSizeChanged(int w, int h, int oldw, int oldh) { + super.onSizeChanged(w, h, oldw, oldh); + mLayoutRect.set(0, 0, w, h); + mDimmedBitmapRect.set(0, 0, (int) (DIMMED_BITMAP_SCALE * w), (int) (DIMMED_BITMAP_SCALE * h)); + } + + @Override protected void setChildrenDrawingCacheEnabled(boolean enabled) { final int count = getChildCount(); for (int i = 0; i < count; i++) { @@ -669,6 +726,55 @@ public class CellLayout extends ViewGroup { super.setChildrenDrawnWithCacheEnabled(enabled); } + public float getDimmedBitmapAlpha() { + return mDimmedBitmapAlpha; + } + + public void setDimmedBitmapAlpha(float alpha) { + // If we're dimming the screen after it was not dimmed, refresh + // to allow for updated widgets. We don't continually refresh it + // after this point, however, as an optimization + if (mDimmedBitmapAlpha == 0.0f && alpha > 0.0f) { + updateDimmedBitmap(); + } + mDimmedBitmapAlpha = alpha; + setChildrenAlpha(1.0f - mDimmedBitmapAlpha); + } + + private void setChildrenAlpha(float alpha) { + for (int i = 0; i < getChildCount(); i++) { + getChildAt(i).setAlpha(alpha); + } + } + + public void updateDimmedBitmap() { + if (mDimmedBitmap == null) { + mDimmedBitmap = Bitmap.createBitmap((int) (getWidth() * DIMMED_BITMAP_SCALE), + (int) (getHeight() * DIMMED_BITMAP_SCALE), Bitmap.Config.ARGB_8888); + mDimmedBitmapCanvas = new Canvas(mDimmedBitmap); + mDimmedBitmapCanvas.scale(DIMMED_BITMAP_SCALE, DIMMED_BITMAP_SCALE); + } + // clear the canvas + mDimmedBitmapCanvas.drawColor(0x00000000, PorterDuff.Mode.CLEAR); + + // draw the screen into the bitmap + // just for drawing to the bitmap, make all the items on the screen opaque + setChildrenAlpha(1.0f); + dispatchDraw(mDimmedBitmapCanvas); + setChildrenAlpha(1.0f - mDimmedBitmapAlpha); + + // make the bitmap 'dimmed' ie colored regions are dark grey, + // the rest is light grey + // We draw grey to the whole bitmap, but filter where we draw based on + // what regions are transparent or not (SRC_OUT), causing the intended effect + + // First, draw light grey everywhere in the background (currently transparent) regions + // This will leave the regions with the widgets as mostly transparent + mDimmedBitmapCanvas.drawColor(0xCCCCCCCC, PorterDuff.Mode.SRC_OUT); + // Now, fill the the remaining transparent regions with dark grey + mDimmedBitmapCanvas.drawColor(0xCC333333, PorterDuff.Mode.SRC_OUT); + } + private boolean isVacant(int originX, int originY, int spanX, int spanY) { for (int i = 0; i < spanY; i++) { if (!isRowEmpty(originY + i, originX, originX + spanX - 1, mOccupied)) { |