DragView.java revision de7658b5e02ae10010e44fcf8d9c5814f54d9eb0
100acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato/*
200acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato * Copyright (C) 2008 The Android Open Source Project
300acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato *
400acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato * Licensed under the Apache License, Version 2.0 (the "License");
500acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato * you may not use this file except in compliance with the License.
600acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato * You may obtain a copy of the License at
700acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato *
800acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato *      http://www.apache.org/licenses/LICENSE-2.0
900acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato *
1000acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato * Unless required by applicable law or agreed to in writing, software
1100acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato * distributed under the License is distributed on an "AS IS" BASIS,
1200acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1300acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato * See the License for the specific language governing permissions and
1400acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato * limitations under the License.
1500acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato */
1600acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato
1700acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato
1800acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onoratopackage com.android.launcher2;
1900acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato
20de7658b5e02ae10010e44fcf8d9c5814f54d9eb0Patrick Dubroyimport com.android.launcher.R;
21de7658b5e02ae10010e44fcf8d9c5814f54d9eb0Patrick Dubroy
2200acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onoratoimport android.content.Context;
23de7658b5e02ae10010e44fcf8d9c5814f54d9eb0Patrick Dubroyimport android.content.res.Resources;
2400acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onoratoimport android.graphics.Bitmap;
2500acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onoratoimport android.graphics.Canvas;
2600acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onoratoimport android.graphics.Matrix;
2700acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onoratoimport android.graphics.Paint;
2800acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onoratoimport android.graphics.PixelFormat;
2900acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onoratoimport android.os.IBinder;
3000acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onoratoimport android.view.Gravity;
3100acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onoratoimport android.view.View;
3200acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onoratoimport android.view.ViewGroup;
3300acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onoratoimport android.view.WindowManager;
3400acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onoratoimport android.view.WindowManagerImpl;
3500acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato
3600acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onoratopublic class DragView extends View implements TweenCallback {
3700acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato    private Bitmap mBitmap;
3800acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato    private Paint mPaint;
3900acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato    private int mRegistrationX;
4000acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato    private int mRegistrationY;
4100acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato
42a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka    private int mDragRegionLeft = 0;
43a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka    private int mDragRegionTop = 0;
44a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka    private int mDragRegionWidth;
45a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka    private int mDragRegionHeight;
46a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka
4700acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato    SymmetricalLinearTween mTween;
4800acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato    private float mScale;
4900acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato    private float mAnimationScale = 1.0f;
5000acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato
5100acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato    private WindowManager.LayoutParams mLayoutParams;
5200acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato    private WindowManager mWindowManager;
5300acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato
5400acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato    /**
5500acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato     * Construct the drag view.
5600acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato     * <p>
5700acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato     * The registration point is the point inside our view that the touch events should
5800acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato     * be centered upon.
5900acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato     *
6000acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato     * @param context A context
6100acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato     * @param bitmap The view that we're dragging around.  We scale it up when we draw it.
6200acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato     * @param registrationX The x coordinate of the registration point.
6300acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato     * @param registrationY The y coordinate of the registration point.
6400acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato     */
655162ea9b1f41dbebe00fd9ec4d1e15a697971439Joe Onorato    public DragView(Context context, Bitmap bitmap, int registrationX, int registrationY,
665162ea9b1f41dbebe00fd9ec4d1e15a697971439Joe Onorato            int left, int top, int width, int height) {
6700acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato        super(context);
6800acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato
69de7658b5e02ae10010e44fcf8d9c5814f54d9eb0Patrick Dubroy        final Resources res = getResources();
70de7658b5e02ae10010e44fcf8d9c5814f54d9eb0Patrick Dubroy        final int dragScale = res.getInteger(R.integer.config_dragViewExtraPixels);
71de7658b5e02ae10010e44fcf8d9c5814f54d9eb0Patrick Dubroy
7200acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato        mWindowManager = WindowManagerImpl.getDefault();
7300acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato
7400acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato        mTween = new SymmetricalLinearTween(false, 110 /*ms duration*/, this);
7500acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato
7600acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato        Matrix scale = new Matrix();
7700acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato        float scaleFactor = width;
78de7658b5e02ae10010e44fcf8d9c5814f54d9eb0Patrick Dubroy        scaleFactor = mScale = (scaleFactor + dragScale) / scaleFactor;
7900acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato        scale.setScale(scaleFactor, scaleFactor);
8000acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato
815162ea9b1f41dbebe00fd9ec4d1e15a697971439Joe Onorato        mBitmap = Bitmap.createBitmap(bitmap, left, top, width, height, scale, true);
820280c3be4d9f8fc6fdf015b7ecd276eb26f76f2dMichael Jurka        setDragRegion(0, 0, width, height);
8300acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato
8400acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato        // The point in our scaled bitmap that the touch events are located
85de7658b5e02ae10010e44fcf8d9c5814f54d9eb0Patrick Dubroy        mRegistrationX = registrationX + res.getInteger(R.integer.config_dragViewOffsetX);
86de7658b5e02ae10010e44fcf8d9c5814f54d9eb0Patrick Dubroy        mRegistrationY = registrationY + res.getInteger(R.integer.config_dragViewOffsetY);
8700acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato    }
8800acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato
89a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka    public void setDragRegion(int left, int top, int width, int height) {
90a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka        mDragRegionLeft = left;
91a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka        mDragRegionTop = top;
92a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka        mDragRegionWidth = width;
93a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka        mDragRegionHeight = height;
94a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka    }
95a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka
960280c3be4d9f8fc6fdf015b7ecd276eb26f76f2dMichael Jurka    public int getScaledDragRegionXOffset() {
970280c3be4d9f8fc6fdf015b7ecd276eb26f76f2dMichael Jurka        return -(int)((mScale - 1.0f) * mDragRegionWidth / 2);
980280c3be4d9f8fc6fdf015b7ecd276eb26f76f2dMichael Jurka    }
990280c3be4d9f8fc6fdf015b7ecd276eb26f76f2dMichael Jurka
1000280c3be4d9f8fc6fdf015b7ecd276eb26f76f2dMichael Jurka    public int getScaledDragRegionWidth() {
1010280c3be4d9f8fc6fdf015b7ecd276eb26f76f2dMichael Jurka        return (int)(mScale * mDragRegionWidth);
1020280c3be4d9f8fc6fdf015b7ecd276eb26f76f2dMichael Jurka    }
1030280c3be4d9f8fc6fdf015b7ecd276eb26f76f2dMichael Jurka
1040280c3be4d9f8fc6fdf015b7ecd276eb26f76f2dMichael Jurka    public int getScaledDragRegionYOffset() {
1050280c3be4d9f8fc6fdf015b7ecd276eb26f76f2dMichael Jurka        return -(int)((mScale - 1.0f) * mDragRegionHeight / 2);
1060280c3be4d9f8fc6fdf015b7ecd276eb26f76f2dMichael Jurka    }
1070280c3be4d9f8fc6fdf015b7ecd276eb26f76f2dMichael Jurka
1080280c3be4d9f8fc6fdf015b7ecd276eb26f76f2dMichael Jurka    public int getScaledDragRegionHeight() {
1090280c3be4d9f8fc6fdf015b7ecd276eb26f76f2dMichael Jurka        return (int)(mScale * mDragRegionWidth);
1100280c3be4d9f8fc6fdf015b7ecd276eb26f76f2dMichael Jurka    }
1110280c3be4d9f8fc6fdf015b7ecd276eb26f76f2dMichael Jurka
112a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka    public int getDragRegionLeft() {
113a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka        return mDragRegionLeft;
114a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka    }
115a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka
116a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka    public int getDragRegionTop() {
117a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka        return mDragRegionTop;
118a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka    }
119a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka
120a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka    public int getDragRegionWidth() {
121a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka        return mDragRegionWidth;
122a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka    }
123a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka
124a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka    public int getDragRegionHeight() {
125a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka        return mDragRegionHeight;
126a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka    }
127a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka
12800acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato    @Override
12900acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
130eebd92496e2fbfbd81ea871862a681929101ba06Joe Onorato        setMeasuredDimension(mBitmap.getWidth(), mBitmap.getHeight());
13100acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato    }
13200acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato
13300acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato    @Override
13400acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato    protected void onDraw(Canvas canvas) {
13500acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato        if (false) {
13600acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato            // for debugging
13700acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato            Paint p = new Paint();
13800acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato            p.setStyle(Paint.Style.FILL);
13900acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato            p.setColor(0xaaffffff);
14000acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato            canvas.drawRect(0, 0, getWidth(), getHeight(), p);
14100acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato        }
14200acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato        float scale = mAnimationScale;
14300acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato        if (scale < 0.999f) { // allow for some float error
14400acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato            float width = mBitmap.getWidth();
14500acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato            float offset = (width-(width*scale))/2;
14600acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato            canvas.translate(offset, offset);
14700acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato            canvas.scale(scale, scale);
14800acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato        }
14900acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato        canvas.drawBitmap(mBitmap, 0.0f, 0.0f, mPaint);
15000acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato    }
15100acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato
15200acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato    @Override
15300acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato    protected void onDetachedFromWindow() {
15400acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato        super.onDetachedFromWindow();
15500acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato        mBitmap.recycle();
15600acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato    }
15700acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato
15800acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato    public void onTweenValueChanged(float value, float oldValue) {
15900acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato        mAnimationScale = (1.0f+((mScale-1.0f)*value))/mScale;
16000acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato        invalidate();
16100acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato    }
16200acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato
16300acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato    public void onTweenStarted() {
16400acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato    }
16500acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato
16600acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato    public void onTweenFinished() {
16700acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato    }
16800acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato
16900acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato    public void setPaint(Paint paint) {
17000acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato        mPaint = paint;
17100acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato        invalidate();
17200acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato    }
17300acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato
17400acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato    /**
17500acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato     * Create a window containing this view and show it.
17600acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato     *
17700acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato     * @param windowToken obtained from v.getWindowToken() from one of your views
17800acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato     * @param touchX the x coordinate the user touched in screen coordinates
17900acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato     * @param touchY the y coordinate the user touched in screen coordinates
18000acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato     */
18100acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato    public void show(IBinder windowToken, int touchX, int touchY) {
18200acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato        WindowManager.LayoutParams lp;
18300acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato        int pixelFormat;
18400acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato
18500acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato        pixelFormat = PixelFormat.TRANSLUCENT;
18600acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato
18700acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato        lp = new WindowManager.LayoutParams(
18800acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato                ViewGroup.LayoutParams.WRAP_CONTENT,
18900acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato                ViewGroup.LayoutParams.WRAP_CONTENT,
19000acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato                touchX-mRegistrationX, touchY-mRegistrationY,
19100acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato                WindowManager.LayoutParams.TYPE_APPLICATION_SUB_PANEL,
19200acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato                WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN
19300acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato                    | WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS
19400acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato                    /*| WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM*/,
19500acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato                pixelFormat);
19600acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato//        lp.token = mStatusBarView.getWindowToken();
19700acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato        lp.gravity = Gravity.LEFT | Gravity.TOP;
19800acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato        lp.token = windowToken;
19900acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato        lp.setTitle("DragView");
20000acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato        mLayoutParams = lp;
20100acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato
20200acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato        mWindowManager.addView(this, lp);
20300acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato
20400acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato        mAnimationScale = 1.0f/mScale;
20500acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato        mTween.start(true);
20600acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato    }
20700acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato
20800acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato    /**
20900acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato     * Move the window containing this view.
21000acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato     *
21100acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato     * @param touchX the x coordinate the user touched in screen coordinates
21200acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato     * @param touchY the y coordinate the user touched in screen coordinates
21300acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato     */
21400acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato    void move(int touchX, int touchY) {
21500acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato        WindowManager.LayoutParams lp = mLayoutParams;
21600acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato        lp.x = touchX - mRegistrationX;
21700acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato        lp.y = touchY - mRegistrationY;
21800acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato        mWindowManager.updateViewLayout(this, lp);
21900acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato    }
22000acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato
22100acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato    void remove() {
22200acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato        mWindowManager.removeView(this);
22300acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato    }
22400acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato}
22500acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato
226