DragView.java revision 0280c3be4d9f8fc6fdf015b7ecd276eb26f76f2d
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 2000acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onoratoimport android.content.Context; 2100acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onoratoimport android.graphics.Bitmap; 2200acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onoratoimport android.graphics.Canvas; 2300acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onoratoimport android.graphics.Matrix; 2400acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onoratoimport android.graphics.Paint; 2500acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onoratoimport android.graphics.PixelFormat; 2600acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onoratoimport android.os.IBinder; 2700acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onoratoimport android.view.Gravity; 2800acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onoratoimport android.view.View; 2900acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onoratoimport android.view.ViewGroup; 3000acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onoratoimport android.view.WindowManager; 3100acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onoratoimport android.view.WindowManagerImpl; 3200acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato 3300acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onoratopublic class DragView extends View implements TweenCallback { 3400acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato // Number of pixels to add to the dragged item for scaling. Should be even for pixel alignment. 35e538b113714930df4ef45e68f75342d83f19af06Joe Onorato private static final int DRAG_SCALE = 40; 3600acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato 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 6900acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato mWindowManager = WindowManagerImpl.getDefault(); 7000acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato 7100acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato mTween = new SymmetricalLinearTween(false, 110 /*ms duration*/, this); 7200acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato 7300acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato Matrix scale = new Matrix(); 7400acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato float scaleFactor = width; 7500acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato scaleFactor = mScale = (scaleFactor + DRAG_SCALE) / scaleFactor; 7600acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato scale.setScale(scaleFactor, scaleFactor); 7700acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato 785162ea9b1f41dbebe00fd9ec4d1e15a697971439Joe Onorato mBitmap = Bitmap.createBitmap(bitmap, left, top, width, height, scale, true); 790280c3be4d9f8fc6fdf015b7ecd276eb26f76f2dMichael Jurka setDragRegion(0, 0, width, height); 8000acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato 8100acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato // The point in our scaled bitmap that the touch events are located 8200acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato mRegistrationX = registrationX + (DRAG_SCALE / 2); 8300acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato mRegistrationY = registrationY + (DRAG_SCALE / 2); 8400acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato } 8500acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato 86a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka public void setDragRegion(int left, int top, int width, int height) { 87a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka mDragRegionLeft = left; 88a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka mDragRegionTop = top; 89a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka mDragRegionWidth = width; 90a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka mDragRegionHeight = height; 91a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka } 92a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka 930280c3be4d9f8fc6fdf015b7ecd276eb26f76f2dMichael Jurka public int getScaledDragRegionXOffset() { 940280c3be4d9f8fc6fdf015b7ecd276eb26f76f2dMichael Jurka return -(int)((mScale - 1.0f) * mDragRegionWidth / 2); 950280c3be4d9f8fc6fdf015b7ecd276eb26f76f2dMichael Jurka } 960280c3be4d9f8fc6fdf015b7ecd276eb26f76f2dMichael Jurka 970280c3be4d9f8fc6fdf015b7ecd276eb26f76f2dMichael Jurka public int getScaledDragRegionWidth() { 980280c3be4d9f8fc6fdf015b7ecd276eb26f76f2dMichael Jurka return (int)(mScale * mDragRegionWidth); 990280c3be4d9f8fc6fdf015b7ecd276eb26f76f2dMichael Jurka } 1000280c3be4d9f8fc6fdf015b7ecd276eb26f76f2dMichael Jurka 1010280c3be4d9f8fc6fdf015b7ecd276eb26f76f2dMichael Jurka public int getScaledDragRegionYOffset() { 1020280c3be4d9f8fc6fdf015b7ecd276eb26f76f2dMichael Jurka return -(int)((mScale - 1.0f) * mDragRegionHeight / 2); 1030280c3be4d9f8fc6fdf015b7ecd276eb26f76f2dMichael Jurka } 1040280c3be4d9f8fc6fdf015b7ecd276eb26f76f2dMichael Jurka 1050280c3be4d9f8fc6fdf015b7ecd276eb26f76f2dMichael Jurka public int getScaledDragRegionHeight() { 1060280c3be4d9f8fc6fdf015b7ecd276eb26f76f2dMichael Jurka return (int)(mScale * mDragRegionWidth); 1070280c3be4d9f8fc6fdf015b7ecd276eb26f76f2dMichael Jurka } 1080280c3be4d9f8fc6fdf015b7ecd276eb26f76f2dMichael Jurka 109a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka public int getDragRegionLeft() { 110a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka return mDragRegionLeft; 111a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka } 112a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka 113a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka public int getDragRegionTop() { 114a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka return mDragRegionTop; 115a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka } 116a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka 117a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka public int getDragRegionWidth() { 118a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka return mDragRegionWidth; 119a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka } 120a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka 121a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka public int getDragRegionHeight() { 122a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka return mDragRegionHeight; 123a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka } 124a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka 12500acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato @Override 12600acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 127eebd92496e2fbfbd81ea871862a681929101ba06Joe Onorato setMeasuredDimension(mBitmap.getWidth(), mBitmap.getHeight()); 12800acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato } 12900acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato 13000acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato @Override 13100acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato protected void onDraw(Canvas canvas) { 13200acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato if (false) { 13300acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato // for debugging 13400acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato Paint p = new Paint(); 13500acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato p.setStyle(Paint.Style.FILL); 13600acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato p.setColor(0xaaffffff); 13700acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato canvas.drawRect(0, 0, getWidth(), getHeight(), p); 13800acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato } 13900acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato float scale = mAnimationScale; 14000acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato if (scale < 0.999f) { // allow for some float error 14100acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato float width = mBitmap.getWidth(); 14200acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato float offset = (width-(width*scale))/2; 14300acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato canvas.translate(offset, offset); 14400acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato canvas.scale(scale, scale); 14500acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato } 14600acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato canvas.drawBitmap(mBitmap, 0.0f, 0.0f, mPaint); 14700acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato } 14800acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato 14900acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato @Override 15000acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato protected void onDetachedFromWindow() { 15100acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato super.onDetachedFromWindow(); 15200acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato mBitmap.recycle(); 15300acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato } 15400acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato 15500acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato public void onTweenValueChanged(float value, float oldValue) { 15600acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato mAnimationScale = (1.0f+((mScale-1.0f)*value))/mScale; 15700acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato invalidate(); 15800acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato } 15900acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato 16000acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato public void onTweenStarted() { 16100acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato } 16200acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato 16300acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato public void onTweenFinished() { 16400acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato } 16500acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato 16600acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato public void setPaint(Paint paint) { 16700acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato mPaint = paint; 16800acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato invalidate(); 16900acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato } 17000acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato 17100acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato /** 17200acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato * Create a window containing this view and show it. 17300acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato * 17400acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato * @param windowToken obtained from v.getWindowToken() from one of your views 17500acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato * @param touchX the x coordinate the user touched in screen coordinates 17600acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato * @param touchY the y coordinate the user touched in screen coordinates 17700acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato */ 17800acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato public void show(IBinder windowToken, int touchX, int touchY) { 17900acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato WindowManager.LayoutParams lp; 18000acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato int pixelFormat; 18100acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato 18200acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato pixelFormat = PixelFormat.TRANSLUCENT; 18300acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato 18400acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato lp = new WindowManager.LayoutParams( 18500acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato ViewGroup.LayoutParams.WRAP_CONTENT, 18600acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato ViewGroup.LayoutParams.WRAP_CONTENT, 18700acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato touchX-mRegistrationX, touchY-mRegistrationY, 18800acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato WindowManager.LayoutParams.TYPE_APPLICATION_SUB_PANEL, 18900acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN 19000acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato | WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS 19100acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato /*| WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM*/, 19200acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato pixelFormat); 19300acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato// lp.token = mStatusBarView.getWindowToken(); 19400acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato lp.gravity = Gravity.LEFT | Gravity.TOP; 19500acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato lp.token = windowToken; 19600acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato lp.setTitle("DragView"); 19700acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato mLayoutParams = lp; 19800acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato 19900acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato mWindowManager.addView(this, lp); 20000acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato 20100acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato mAnimationScale = 1.0f/mScale; 20200acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato mTween.start(true); 20300acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato } 20400acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato 20500acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato /** 20600acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato * Move the window containing this view. 20700acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato * 20800acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato * @param touchX the x coordinate the user touched in screen coordinates 20900acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato * @param touchY the y coordinate the user touched in screen coordinates 21000acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato */ 21100acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato void move(int touchX, int touchY) { 21200acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato WindowManager.LayoutParams lp = mLayoutParams; 21300acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato lp.x = touchX - mRegistrationX; 21400acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato lp.y = touchY - mRegistrationY; 21500acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato mWindowManager.updateViewLayout(this, lp); 21600acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato } 21700acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato 21800acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato void remove() { 21900acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato mWindowManager.removeView(this); 22000acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato } 22100acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato} 22200acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato 223