DragView.java revision b8c69f3c17a40adc2d85e8e996f754c383c293dc
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
20a669d79d0dcf034651ce305a8cd334272bec3374Patrick Dubroyimport android.animation.ValueAnimator;
21a669d79d0dcf034651ce305a8cd334272bec3374Patrick Dubroyimport android.animation.ValueAnimator.AnimatorUpdateListener;
22de7658b5e02ae10010e44fcf8d9c5814f54d9eb0Patrick Dubroyimport android.content.res.Resources;
2300acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onoratoimport android.graphics.Bitmap;
2400acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onoratoimport android.graphics.Canvas;
2500acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onoratoimport android.graphics.Matrix;
2600acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onoratoimport android.graphics.Paint;
27b8c69f3c17a40adc2d85e8e996f754c383c293dcWinson Chungimport android.graphics.Point;
28e3e27a854f3eca363d3c5ce353d19de475272d87Adam Cohenimport android.graphics.Rect;
2900acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onoratoimport android.view.View;
30a669d79d0dcf034651ce305a8cd334272bec3374Patrick Dubroyimport android.view.animation.DecelerateInterpolator;
3100acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato
32120980bd00f5eecec5717f49a3d7db96571025a9Adam Cohenimport com.android.launcher.R;
33120980bd00f5eecec5717f49a3d7db96571025a9Adam Cohen
34a669d79d0dcf034651ce305a8cd334272bec3374Patrick Dubroypublic class DragView extends View {
3500acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato    private Bitmap mBitmap;
3600acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato    private Paint mPaint;
3700acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato    private int mRegistrationX;
3800acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato    private int mRegistrationY;
3900acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato
40b8c69f3c17a40adc2d85e8e996f754c383c293dcWinson Chung    private Point mDragVisualizeOffset = null;
41e3e27a854f3eca363d3c5ce353d19de475272d87Adam Cohen    private Rect mDragRegion = null;
428dfcba4af7a7ece09e8c7d96053e54f3a383e905Adam Cohen    private DragLayer mDragLayer = null;
43fc53cd22c9a78708c78c85946443f23ec8c59502Adam Cohen    private boolean mHasDrawn = false;
44a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka
45a669d79d0dcf034651ce305a8cd334272bec3374Patrick Dubroy    ValueAnimator mAnim;
46a669d79d0dcf034651ce305a8cd334272bec3374Patrick Dubroy    private float mOffsetX = 0.0f;
47a669d79d0dcf034651ce305a8cd334272bec3374Patrick Dubroy    private float mOffsetY = 0.0f;
4800acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato
498dfcba4af7a7ece09e8c7d96053e54f3a383e905Adam Cohen    private DragLayer.LayoutParams mLayoutParams;
5000acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato
5100acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato    /**
5200acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato     * Construct the drag view.
5300acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato     * <p>
5400acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato     * The registration point is the point inside our view that the touch events should
5500acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato     * be centered upon.
5600acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato     *
578dfcba4af7a7ece09e8c7d96053e54f3a383e905Adam Cohen     * @param launcher The Launcher instance
5800acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato     * @param bitmap The view that we're dragging around.  We scale it up when we draw it.
5900acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato     * @param registrationX The x coordinate of the registration point.
6000acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato     * @param registrationY The y coordinate of the registration point.
6100acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato     */
628dfcba4af7a7ece09e8c7d96053e54f3a383e905Adam Cohen    public DragView(Launcher launcher, Bitmap bitmap, int registrationX, int registrationY,
635162ea9b1f41dbebe00fd9ec4d1e15a697971439Joe Onorato            int left, int top, int width, int height) {
648dfcba4af7a7ece09e8c7d96053e54f3a383e905Adam Cohen        super(launcher);
658dfcba4af7a7ece09e8c7d96053e54f3a383e905Adam Cohen        mDragLayer = launcher.getDragLayer();
6600acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato
67de7658b5e02ae10010e44fcf8d9c5814f54d9eb0Patrick Dubroy        final Resources res = getResources();
68de7658b5e02ae10010e44fcf8d9c5814f54d9eb0Patrick Dubroy        final int dragScale = res.getInteger(R.integer.config_dragViewExtraPixels);
69de7658b5e02ae10010e44fcf8d9c5814f54d9eb0Patrick Dubroy
7000acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato        Matrix scale = new Matrix();
71a669d79d0dcf034651ce305a8cd334272bec3374Patrick Dubroy        final float scaleFactor = (width + dragScale) / width;
72a669d79d0dcf034651ce305a8cd334272bec3374Patrick Dubroy        if (scaleFactor != 1.0f) {
73a669d79d0dcf034651ce305a8cd334272bec3374Patrick Dubroy            scale.setScale(scaleFactor, scaleFactor);
74a669d79d0dcf034651ce305a8cd334272bec3374Patrick Dubroy        }
75a669d79d0dcf034651ce305a8cd334272bec3374Patrick Dubroy
768878a32f26b7e6c287d970950526cd0e6eabb21dAdam Cohen        final int offsetX = res.getDimensionPixelSize(R.dimen.dragViewOffsetX);
778878a32f26b7e6c287d970950526cd0e6eabb21dAdam Cohen        final int offsetY = res.getDimensionPixelSize(R.dimen.dragViewOffsetY);
78a669d79d0dcf034651ce305a8cd334272bec3374Patrick Dubroy
79a669d79d0dcf034651ce305a8cd334272bec3374Patrick Dubroy        // Animate the view into the correct position
80a669d79d0dcf034651ce305a8cd334272bec3374Patrick Dubroy        mAnim = ValueAnimator.ofFloat(0.0f, 1.0f);
81a669d79d0dcf034651ce305a8cd334272bec3374Patrick Dubroy        mAnim.setDuration(110);
82a669d79d0dcf034651ce305a8cd334272bec3374Patrick Dubroy        mAnim.setInterpolator(new DecelerateInterpolator(2.5f));
83a669d79d0dcf034651ce305a8cd334272bec3374Patrick Dubroy        mAnim.addUpdateListener(new AnimatorUpdateListener() {
84a669d79d0dcf034651ce305a8cd334272bec3374Patrick Dubroy            @Override
85a669d79d0dcf034651ce305a8cd334272bec3374Patrick Dubroy            public void onAnimationUpdate(ValueAnimator animation) {
86a669d79d0dcf034651ce305a8cd334272bec3374Patrick Dubroy                final float value = (Float) animation.getAnimatedValue();
87a669d79d0dcf034651ce305a8cd334272bec3374Patrick Dubroy
88a669d79d0dcf034651ce305a8cd334272bec3374Patrick Dubroy                final int deltaX = (int) ((value * offsetX) - mOffsetX);
89a669d79d0dcf034651ce305a8cd334272bec3374Patrick Dubroy                final int deltaY = (int) ((value * offsetY) - mOffsetY);
90a669d79d0dcf034651ce305a8cd334272bec3374Patrick Dubroy
91a669d79d0dcf034651ce305a8cd334272bec3374Patrick Dubroy                mOffsetX += deltaX;
92a669d79d0dcf034651ce305a8cd334272bec3374Patrick Dubroy                mOffsetY += deltaY;
93a669d79d0dcf034651ce305a8cd334272bec3374Patrick Dubroy
94a669d79d0dcf034651ce305a8cd334272bec3374Patrick Dubroy                if (getParent() == null) {
95a669d79d0dcf034651ce305a8cd334272bec3374Patrick Dubroy                    animation.cancel();
96a669d79d0dcf034651ce305a8cd334272bec3374Patrick Dubroy                } else {
978dfcba4af7a7ece09e8c7d96053e54f3a383e905Adam Cohen                    DragLayer.LayoutParams lp = mLayoutParams;
98a669d79d0dcf034651ce305a8cd334272bec3374Patrick Dubroy                    lp.x += deltaX;
99a669d79d0dcf034651ce305a8cd334272bec3374Patrick Dubroy                    lp.y += deltaY;
1008dfcba4af7a7ece09e8c7d96053e54f3a383e905Adam Cohen                    mDragLayer.requestLayout();
101a669d79d0dcf034651ce305a8cd334272bec3374Patrick Dubroy                }
102a669d79d0dcf034651ce305a8cd334272bec3374Patrick Dubroy            }
103a669d79d0dcf034651ce305a8cd334272bec3374Patrick Dubroy        });
10400acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato
1055162ea9b1f41dbebe00fd9ec4d1e15a697971439Joe Onorato        mBitmap = Bitmap.createBitmap(bitmap, left, top, width, height, scale, true);
106e3e27a854f3eca363d3c5ce353d19de475272d87Adam Cohen        setDragRegion(new Rect(0, 0, width, height));
10700acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato
10800acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato        // The point in our scaled bitmap that the touch events are located
109a669d79d0dcf034651ce305a8cd334272bec3374Patrick Dubroy        mRegistrationX = registrationX;
110a669d79d0dcf034651ce305a8cd334272bec3374Patrick Dubroy        mRegistrationY = registrationY;
11162bbb3c573fe902940431e4b957c0c4918358d36Patrick Dubroy
11262bbb3c573fe902940431e4b957c0c4918358d36Patrick Dubroy        // Force a measure, because Workspace uses getMeasuredHeight() before the layout pass
11362bbb3c573fe902940431e4b957c0c4918358d36Patrick Dubroy        int ms = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED);
11462bbb3c573fe902940431e4b957c0c4918358d36Patrick Dubroy        measure(ms, ms);
11562bbb3c573fe902940431e4b957c0c4918358d36Patrick Dubroy    }
11662bbb3c573fe902940431e4b957c0c4918358d36Patrick Dubroy
11762bbb3c573fe902940431e4b957c0c4918358d36Patrick Dubroy    public float getOffsetY() {
11862bbb3c573fe902940431e4b957c0c4918358d36Patrick Dubroy        return mOffsetY;
11900acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato    }
12000acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato
121a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka    public int getDragRegionLeft() {
122e3e27a854f3eca363d3c5ce353d19de475272d87Adam Cohen        return mDragRegion.left;
123a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka    }
124a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka
125a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka    public int getDragRegionTop() {
126e3e27a854f3eca363d3c5ce353d19de475272d87Adam Cohen        return mDragRegion.top;
127a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka    }
128a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka
129a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka    public int getDragRegionWidth() {
130e3e27a854f3eca363d3c5ce353d19de475272d87Adam Cohen        return mDragRegion.width();
131a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka    }
132a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka
133a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka    public int getDragRegionHeight() {
134e3e27a854f3eca363d3c5ce353d19de475272d87Adam Cohen        return mDragRegion.height();
135e3e27a854f3eca363d3c5ce353d19de475272d87Adam Cohen    }
136e3e27a854f3eca363d3c5ce353d19de475272d87Adam Cohen
137b8c69f3c17a40adc2d85e8e996f754c383c293dcWinson Chung    public void setDragVisualizeOffset(Point p) {
138b8c69f3c17a40adc2d85e8e996f754c383c293dcWinson Chung        mDragVisualizeOffset = p;
139b8c69f3c17a40adc2d85e8e996f754c383c293dcWinson Chung    }
140b8c69f3c17a40adc2d85e8e996f754c383c293dcWinson Chung
141b8c69f3c17a40adc2d85e8e996f754c383c293dcWinson Chung    public Point getDragVisualizeOffset() {
142b8c69f3c17a40adc2d85e8e996f754c383c293dcWinson Chung        return mDragVisualizeOffset;
143b8c69f3c17a40adc2d85e8e996f754c383c293dcWinson Chung    }
144b8c69f3c17a40adc2d85e8e996f754c383c293dcWinson Chung
145e3e27a854f3eca363d3c5ce353d19de475272d87Adam Cohen    public void setDragRegion(Rect r) {
146e3e27a854f3eca363d3c5ce353d19de475272d87Adam Cohen        mDragRegion = r;
147e3e27a854f3eca363d3c5ce353d19de475272d87Adam Cohen    }
148e3e27a854f3eca363d3c5ce353d19de475272d87Adam Cohen
149e3e27a854f3eca363d3c5ce353d19de475272d87Adam Cohen    public Rect getDragRegion() {
150e3e27a854f3eca363d3c5ce353d19de475272d87Adam Cohen        return mDragRegion;
151a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka    }
152a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka
15300acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato    @Override
15400acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
155eebd92496e2fbfbd81ea871862a681929101ba06Joe Onorato        setMeasuredDimension(mBitmap.getWidth(), mBitmap.getHeight());
15600acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato    }
15700acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato
15800acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato    @Override
15900acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato    protected void onDraw(Canvas canvas) {
16000acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato        if (false) {
16100acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato            // for debugging
16200acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato            Paint p = new Paint();
16300acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato            p.setStyle(Paint.Style.FILL);
16400acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato            p.setColor(0xaaffffff);
16500acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato            canvas.drawRect(0, 0, getWidth(), getHeight(), p);
16600acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato        }
167a669d79d0dcf034651ce305a8cd334272bec3374Patrick Dubroy
168fc53cd22c9a78708c78c85946443f23ec8c59502Adam Cohen        mHasDrawn = true;
16900acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato        canvas.drawBitmap(mBitmap, 0.0f, 0.0f, mPaint);
17000acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato    }
17100acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato
17200acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato    public void setPaint(Paint paint) {
17300acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato        mPaint = paint;
17400acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato        invalidate();
17500acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato    }
17600acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato
177fc53cd22c9a78708c78c85946443f23ec8c59502Adam Cohen    public boolean hasDrawn() {
178fc53cd22c9a78708c78c85946443f23ec8c59502Adam Cohen        return mHasDrawn;
179fc53cd22c9a78708c78c85946443f23ec8c59502Adam Cohen    }
180fc53cd22c9a78708c78c85946443f23ec8c59502Adam Cohen
1813e8f811f31a2275e778244427271f77f4116c08bAdam Cohen    @Override
1823e8f811f31a2275e778244427271f77f4116c08bAdam Cohen    public void setAlpha(float alpha) {
1833e8f811f31a2275e778244427271f77f4116c08bAdam Cohen        super.setAlpha(alpha);
1843e8f811f31a2275e778244427271f77f4116c08bAdam Cohen        if (mPaint == null) {
1853e8f811f31a2275e778244427271f77f4116c08bAdam Cohen            mPaint = new Paint();
1863e8f811f31a2275e778244427271f77f4116c08bAdam Cohen        }
1873e8f811f31a2275e778244427271f77f4116c08bAdam Cohen        mPaint.setAlpha((int) (255 * alpha));
1883e8f811f31a2275e778244427271f77f4116c08bAdam Cohen        invalidate();
1893e8f811f31a2275e778244427271f77f4116c08bAdam Cohen    }
1903e8f811f31a2275e778244427271f77f4116c08bAdam Cohen
19100acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato    /**
19200acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato     * Create a window containing this view and show it.
19300acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato     *
19400acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato     * @param windowToken obtained from v.getWindowToken() from one of your views
1958dfcba4af7a7ece09e8c7d96053e54f3a383e905Adam Cohen     * @param touchX the x coordinate the user touched in DragLayer coordinates
1968dfcba4af7a7ece09e8c7d96053e54f3a383e905Adam Cohen     * @param touchY the y coordinate the user touched in DragLayer coordinates
19700acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato     */
1988dfcba4af7a7ece09e8c7d96053e54f3a383e905Adam Cohen    public void show(int touchX, int touchY) {
1998dfcba4af7a7ece09e8c7d96053e54f3a383e905Adam Cohen        mDragLayer.addView(this);
2008dfcba4af7a7ece09e8c7d96053e54f3a383e905Adam Cohen        DragLayer.LayoutParams lp = new DragLayer.LayoutParams(0, 0);
2018dfcba4af7a7ece09e8c7d96053e54f3a383e905Adam Cohen        lp.width = mBitmap.getWidth();
2028dfcba4af7a7ece09e8c7d96053e54f3a383e905Adam Cohen        lp.height = mBitmap.getHeight();
2038dfcba4af7a7ece09e8c7d96053e54f3a383e905Adam Cohen        lp.x = touchX - mRegistrationX;
2048dfcba4af7a7ece09e8c7d96053e54f3a383e905Adam Cohen        lp.y = touchY - mRegistrationY;
2058dfcba4af7a7ece09e8c7d96053e54f3a383e905Adam Cohen        lp.customPosition = true;
2068dfcba4af7a7ece09e8c7d96053e54f3a383e905Adam Cohen        setLayoutParams(lp);
20700acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato        mLayoutParams = lp;
208a669d79d0dcf034651ce305a8cd334272bec3374Patrick Dubroy        mAnim.start();
20900acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato    }
210716b51e030f9c6ed34af2b947760e46a280c65a6Adam Cohen
21100acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato    /**
21200acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato     * Move the window containing this view.
21300acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato     *
2148dfcba4af7a7ece09e8c7d96053e54f3a383e905Adam Cohen     * @param touchX the x coordinate the user touched in DragLayer coordinates
2158dfcba4af7a7ece09e8c7d96053e54f3a383e905Adam Cohen     * @param touchY the y coordinate the user touched in DragLayer coordinates
21600acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato     */
21700acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato    void move(int touchX, int touchY) {
2188dfcba4af7a7ece09e8c7d96053e54f3a383e905Adam Cohen        DragLayer.LayoutParams lp = mLayoutParams;
219a669d79d0dcf034651ce305a8cd334272bec3374Patrick Dubroy        lp.x = touchX - mRegistrationX + (int) mOffsetX;
220a669d79d0dcf034651ce305a8cd334272bec3374Patrick Dubroy        lp.y = touchY - mRegistrationY + (int) mOffsetY;
2218dfcba4af7a7ece09e8c7d96053e54f3a383e905Adam Cohen        mDragLayer.requestLayout();
22200acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato    }
22300acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato
22400acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato    void remove() {
2253e8f811f31a2275e778244427271f77f4116c08bAdam Cohen        post(new Runnable() {
2263e8f811f31a2275e778244427271f77f4116c08bAdam Cohen            public void run() {
2278dfcba4af7a7ece09e8c7d96053e54f3a383e905Adam Cohen                mDragLayer.removeView(DragView.this);
2283e8f811f31a2275e778244427271f77f4116c08bAdam Cohen            }
2293e8f811f31a2275e778244427271f77f4116c08bAdam Cohen        });
23000acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato    }
2316f13342ffd3f968de9ff86b988621cc91d94adffPatrick Dubroy
2326f13342ffd3f968de9ff86b988621cc91d94adffPatrick Dubroy    int[] getPosition(int[] result) {
2338dfcba4af7a7ece09e8c7d96053e54f3a383e905Adam Cohen        DragLayer.LayoutParams lp = mLayoutParams;
2346f13342ffd3f968de9ff86b988621cc91d94adffPatrick Dubroy        if (result == null) result = new int[2];
2356f13342ffd3f968de9ff86b988621cc91d94adffPatrick Dubroy        result[0] = lp.x;
2366f13342ffd3f968de9ff86b988621cc91d94adffPatrick Dubroy        result[1] = lp.y;
2376f13342ffd3f968de9ff86b988621cc91d94adffPatrick Dubroy        return result;
2386f13342ffd3f968de9ff86b988621cc91d94adffPatrick Dubroy    }
23900acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato}
24000acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato
241