diff options
Diffstat (limited to 'src/com/android/launcher3/folder/PreviewImageView.java')
-rw-r--r-- | src/com/android/launcher3/folder/PreviewImageView.java | 98 |
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; + } +} |