summaryrefslogtreecommitdiffstats
path: root/src/com/android/launcher3/folder/PreviewImageView.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/com/android/launcher3/folder/PreviewImageView.java')
-rw-r--r--src/com/android/launcher3/folder/PreviewImageView.java98
1 files changed, 98 insertions, 0 deletions
diff --git a/src/com/android/launcher3/folder/PreviewImageView.java b/src/com/android/launcher3/folder/PreviewImageView.java
new file mode 100644
index 000000000..c4f3ee15c
--- /dev/null
+++ b/src/com/android/launcher3/folder/PreviewImageView.java
@@ -0,0 +1,98 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.launcher3.folder;
+
+import android.content.Context;
+import android.graphics.Bitmap;
+import android.graphics.Canvas;
+import android.graphics.PorterDuff;
+import android.graphics.Rect;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.ImageView;
+
+import com.android.launcher3.Launcher;
+import com.android.launcher3.R;
+import com.android.launcher3.dragndrop.DragLayer;
+
+/**
+ * A temporary view which displays the a bitmap (used for folder icon animation)
+ */
+public class PreviewImageView extends ImageView {
+
+ private final Rect mTempRect = new Rect();
+ private final DragLayer mParent;
+
+ private Bitmap mBitmap;
+ private Canvas mCanvas;
+
+ public PreviewImageView(DragLayer parent) {
+ super(parent.getContext());
+ mParent = parent;
+ }
+
+ public void copy(View view) {
+ final int width = view.getMeasuredWidth();
+ final int height = view.getMeasuredHeight();
+
+ if (mBitmap == null || mBitmap.getWidth() != width || mBitmap.getHeight() != height) {
+ mBitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
+ mCanvas = new Canvas(mBitmap);
+ }
+
+ DragLayer.LayoutParams lp;
+ if (getLayoutParams() instanceof DragLayer.LayoutParams) {
+ lp = (DragLayer.LayoutParams) getLayoutParams();
+ } else {
+ lp = new DragLayer.LayoutParams(width, height);
+ }
+
+ // The layout from which the folder is being opened may be scaled, adjust the starting
+ // view size by this scale factor.
+ float scale = mParent.getDescendantRectRelativeToSelf(view, mTempRect);
+ lp.customPosition = true;
+ lp.x = mTempRect.left;
+ lp.y = mTempRect.top;
+ lp.width = (int) (scale * width);
+ lp.height = (int) (scale * height);
+
+ mCanvas.drawColor(0, PorterDuff.Mode.CLEAR);
+ view.draw(mCanvas);
+ setImageBitmap(mBitmap);
+
+ // Just in case this image view is still in the drag layer from a previous animation,
+ // we remove it and re-add it.
+ removeFromParent();
+ mParent.addView(this, lp);
+ }
+
+ public void removeFromParent() {
+ if (mParent.indexOfChild(this) != -1) {
+ mParent.removeView(this);
+ }
+ }
+
+ public static PreviewImageView get(Context context) {
+ DragLayer dragLayer = Launcher.getLauncher(context).getDragLayer();
+ PreviewImageView view = (PreviewImageView) dragLayer.getTag(R.id.preview_image_id);
+ if (view == null) {
+ view = new PreviewImageView(dragLayer);
+ dragLayer.setTag(R.id.preview_image_id, view);
+ }
+ return view;
+ }
+}