/* * Copyright (C) 2008 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.fruit.launcher; import android.content.Context; import android.graphics.Bitmap; import android.graphics.Canvas; import android.graphics.Matrix; import android.graphics.Paint; import android.graphics.PixelFormat; import android.os.IBinder; import android.view.Gravity; import android.view.View; import android.view.ViewGroup; import android.view.WindowManager; import android.view.WindowManagerImpl; public class DragView extends View implements TweenCallback { // Number of pixels to add to the dragged item for scaling. Should be even // for pixel alignment. private static final int DRAG_SCALE = 40; private static final boolean DEBUG = false; private Bitmap mBitmap; private Paint mPaint; private int mRegistrationX; private int mRegistrationY; private boolean mCallbackFlag = true; // yfzhao SymmetricalLinearTween mTween; private float mScale; private float mAnimationScale = 1.0f; private WindowManager.LayoutParams mLayoutParams; private WindowManager mWindowManager; private int mOriginalWidth; private int mOriginalHeight; /** * Construct the drag view. * <p> * The registration point is the point inside our view that the touch events * should be centered upon. * * @param context * A context * @param bitmap * The view that we're dragging around. We scale it up when we * draw it. * @param registrationX * The x coordinate of the registration point. * @param registrationY * The y coordinate of the registration point. */ public DragView(Context context, Bitmap bitmap, int registrationX, int registrationY, int left, int top, int width, int height) { super(context); mWindowManager = WindowManagerImpl.getDefault(); mTween = new SymmetricalLinearTween(false, 110/* ms duration */, this); Matrix scale = new Matrix(); float scaleFactor = width; scaleFactor = mScale = (scaleFactor + DRAG_SCALE) / scaleFactor; scale.setScale(scaleFactor, scaleFactor); mBitmap = Bitmap.createBitmap(bitmap, left, top, width, height, scale, true); // The point in our scaled bitmap that the touch events are located mRegistrationX = registrationX + (DRAG_SCALE / 2); mRegistrationY = registrationY + (DRAG_SCALE / 2); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { setMeasuredDimension(mBitmap.getWidth(), mBitmap.getHeight()); } @Override protected void onDraw(Canvas canvas) { if (DEBUG) { // for debugging Paint p = new Paint(); p.setStyle(Paint.Style.FILL); p.setColor(0xaaffffff); canvas.drawRect(0, 0, getWidth(), getHeight(), p); } float scale = mAnimationScale; if (scale < 0.999f) { // allow for some float error float width = mBitmap.getWidth(); float offset = (width - (width * scale)) / 2; canvas.translate(offset, offset); canvas.scale(scale, scale); } canvas.drawBitmap(mBitmap, 0.0f, 0.0f, mPaint); } @Override protected void onDetachedFromWindow() { super.onDetachedFromWindow(); mBitmap.recycle(); } @Override public void onTweenValueChanged(float value, float oldValue) { mAnimationScale = (1.0f + ((mScale - 1.0f) * value)) / mScale; invalidate(); } @Override public void onTweenStarted() { } @Override public void onTweenFinished() { } public void setPaint(Paint paint) { mPaint = paint; invalidate(); } /** * Create a window containing this view and show it. * * @param windowToken * obtained from v.getWindowToken() from one of your views * @param touchX * the x coordinate the user touched in screen coordinates * @param touchY * the y coordinate the user touched in screen coordinates */ public void show(IBinder windowToken, int touchX, int touchY) { WindowManager.LayoutParams lp; int pixelFormat; pixelFormat = PixelFormat.TRANSLUCENT; lp = new WindowManager.LayoutParams( ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT, touchX - mRegistrationX, touchY - mRegistrationY, WindowManager.LayoutParams.TYPE_APPLICATION_SUB_PANEL, WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN | WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS /* | WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM */, pixelFormat); // lp.token = mStatusBarView.getWindowToken(); lp.gravity = Gravity.LEFT | Gravity.TOP; lp.token = windowToken; lp.setTitle("DragView"); mLayoutParams = lp; mWindowManager.addView(this, lp); mAnimationScale = 1.0f / mScale; mTween.start(true); } /** * Move the window containing this view. * * @param touchX * the x coordinate the user touched in screen coordinates * @param touchY * the y coordinate the user touched in screen coordinates */ void move(int touchX, int touchY) { WindowManager.LayoutParams lp = mLayoutParams; lp.x = touchX - mRegistrationX; lp.y = touchY - mRegistrationY; mWindowManager.updateViewLayout(this, lp); } void remove() { mWindowManager.removeView(this); } // yfzhao /** * @return the mCallbackFlag */ public boolean ismCallbackFlag() { return mCallbackFlag; } /** * @param mCallbackFlag * the mCallbackFlag to set */ public void setmCallbackFlag(boolean mCallbackFlag) { this.mCallbackFlag = mCallbackFlag; } /** * @return the mOriginalWidth */ public int getmOriginalWidth() { return mOriginalWidth; } /** * @param mOriginalWidth * the mOriginalWidth to set */ public void setmOriginalWidth(int mOriginalWidth) { this.mOriginalWidth = mOriginalWidth; } /** * @return the mOriginalHeight */ public int getmOriginalHeight() { return mOriginalHeight; } /** * @param mOriginalHeight * the mOriginalHeight to set */ public void setmOriginalHeight(int mOriginalHeight) { this.mOriginalHeight = mOriginalHeight; } }