From e6b8e2fa73b5b2e8e3adfa9ea1b4ca9659e10686 Mon Sep 17 00:00:00 2001 From: Romain Guy Date: Tue, 10 Nov 2009 11:56:55 -0800 Subject: [PATCH] Better previews. Change-Id: I400c6b45fae2f74722985f766dc17c0892550403 --- res/drawable-hdpi/preview_popup.9.png | Bin 4398 -> 4108 bytes src/com/android/launcher2/Launcher.java | 108 +++++++++++------------- 2 files changed, 51 insertions(+), 57 deletions(-) diff --git a/res/drawable-hdpi/preview_popup.9.png b/res/drawable-hdpi/preview_popup.9.png index 6eeddb2ba7918f4cd75f71e4526192db8a874de5..c2dd07cf608bb9c19628e64aa37e7c70c656fb4c 100644 GIT binary patch delta 1410 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 bitmaps = (ArrayList) v.getTag(R.id.icon); + for (Bitmap bitmap : bitmaps) bitmap.recycle(); v.setTag(R.id.workspace, null); v.setTag(R.id.icon, null); @@ -1549,20 +1558,17 @@ public final class Launcher extends Activity } private void showPreviews(final View anchor, int start, int end) { - ImageView preview = new ImageView(this); - preview.requestFocus(); - Drawable d = getResources().getDrawable(R.drawable.preview_popup); - Rect r = new Rect(); - d.getPadding(r); - int extraW = r.left + r.right; - int extraH = r.top + r.bottom; - Workspace workspace = mWorkspace; CellLayout cell = ((CellLayout) workspace.getChildAt(start)); float max = workspace.getChildCount() - 1; + + Rect r = new Rect(); + d.getPadding(r); + int extraW = (int) ((r.left + r.right) * max); + int extraH = r.top + r.bottom; int aW = cell.getWidth() - extraW; float w = aW / max; @@ -1581,75 +1587,63 @@ public final class Launcher extends Activity final float sWidth = width * scale; float sHeight = height * scale; - Bitmap bitmap = Bitmap.createBitmap((int) (sWidth * count), - (int) sHeight, Bitmap.Config.ARGB_8888); + LinearLayout preview = new LinearLayout(this); + preview.setFocusable(true); - PopupWindow p = new PopupWindow(this); - p.setContentView(preview); - p.setWidth(bitmap.getWidth() + extraW); - p.setHeight(bitmap.getHeight() + extraH); - p.setAnimationStyle(R.style.AnimationPreview); - p.setOutsideTouchable(true); - p.setBackgroundDrawable(d); - p.showAsDropDown(anchor, 0, 0); - - Canvas c = new Canvas(bitmap); + PreviewTouchHandler handler = new PreviewTouchHandler(anchor); + ArrayList bitmaps = new ArrayList(count); for (int i = start; i < end; i++) { + ImageView image = new ImageView(this); cell = (CellLayout) workspace.getChildAt(i); - c.save(); + Bitmap bitmap = Bitmap.createBitmap((int) sWidth, (int) sHeight, + Bitmap.Config.ARGB_8888); + + Canvas c = new Canvas(bitmap); c.scale(scale, scale); c.translate(-cell.getLeftPadding(), -cell.getTopPadding()); cell.dispatchDraw(c); - c.restore(); - c.translate(sWidth, 0.0f); + image.setBackgroundDrawable(d); + image.setImageBitmap(bitmap); + image.setTag(i); + image.setOnClickListener(handler); + bitmaps.add(bitmap); + + preview.addView(image, + ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT); } + + PopupWindow p = new PopupWindow(this); + p.setContentView(preview); + p.setWidth((int) (sWidth * count + extraW)); + p.setHeight((int) (sHeight + extraH)); + p.setAnimationStyle(R.style.AnimationPreview); + p.setOutsideTouchable(true); + p.setBackgroundDrawable(null); + p.showAsDropDown(anchor, 0, 0); - preview.setImageBitmap(bitmap); - - PreviewTouchHandler handler = new PreviewTouchHandler(anchor, sWidth); - preview.setOnClickListener(handler); - preview.setOnTouchListener(handler); - p.setOnDismissListener(handler); + p.setOnDismissListener(new PopupWindow.OnDismissListener() { + public void onDismiss() { + dismissPreview(anchor); + } + }); anchor.setTag(p); anchor.setTag(R.id.workspace, preview); - anchor.setTag(R.id.icon, bitmap); + anchor.setTag(R.id.icon, bitmaps); } - class PreviewTouchHandler implements View.OnTouchListener, View.OnClickListener, - PopupWindow.OnDismissListener { - + class PreviewTouchHandler implements View.OnClickListener { private final View mAnchor; - private final float mWidth; - private float mTouchX; - public PreviewTouchHandler(View anchor, float width) { + public PreviewTouchHandler(View anchor) { mAnchor = anchor; - mWidth = width; - } - - public boolean onTouch(View v, MotionEvent event) { - if (event.getAction() == MotionEvent.ACTION_UP) { - mTouchX = event.getX(); - } - return false; } public void onClick(View v) { - int screen = 0; - if (mAnchor == mNextView) { - screen = mWorkspace.getCurrentScreen() + (int) (mTouchX / mWidth) + 1; - } else if (mAnchor == mPreviousView) { - screen = (int) (mTouchX / mWidth); - } - mWorkspace.snapToScreen(screen); - dismissPreview(mAnchor); - } - - public void onDismiss() { + mWorkspace.snapToScreen((Integer) v.getTag()); dismissPreview(mAnchor); } }