DragView.java revision 6cfafb96c3b108fec90897c1a251229be9861ddb
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 {
35867ca62c0e4b811d46734ff940d59c7a787525c8Winson Chung    private static float sDragAlpha = 1f;
367bd1bbb509f9569fa18d6b4d33242679fd98bc9bWinson Chung
3700acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato    private Bitmap mBitmap;
38ed66b2bac7447febe2e405b4ce725cae4f6b5988Adam Cohen    private Bitmap mCrossFadeBitmap;
3900acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato    private Paint mPaint;
4000acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato    private int mRegistrationX;
4100acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato    private int mRegistrationY;
4200acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato
43b8c69f3c17a40adc2d85e8e996f754c383c293dcWinson Chung    private Point mDragVisualizeOffset = null;
44e3e27a854f3eca363d3c5ce353d19de475272d87Adam Cohen    private Rect mDragRegion = null;
458dfcba4af7a7ece09e8c7d96053e54f3a383e905Adam Cohen    private DragLayer mDragLayer = null;
46fc53cd22c9a78708c78c85946443f23ec8c59502Adam Cohen    private boolean mHasDrawn = false;
47ed66b2bac7447febe2e405b4ce725cae4f6b5988Adam Cohen    private float mCrossFadeProgress = 0f;
48a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka
49a669d79d0dcf034651ce305a8cd334272bec3374Patrick Dubroy    ValueAnimator mAnim;
50a669d79d0dcf034651ce305a8cd334272bec3374Patrick Dubroy    private float mOffsetX = 0.0f;
51a669d79d0dcf034651ce305a8cd334272bec3374Patrick Dubroy    private float mOffsetY = 0.0f;
5200acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato
5300acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato    /**
5400acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato     * Construct the drag view.
5500acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato     * <p>
5600acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato     * The registration point is the point inside our view that the touch events should
5700acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato     * be centered upon.
5800acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato     *
598dfcba4af7a7ece09e8c7d96053e54f3a383e905Adam Cohen     * @param launcher The Launcher instance
6000acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato     * @param bitmap The view that we're dragging around.  We scale it up when we draw it.
6100acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato     * @param registrationX The x coordinate of the registration point.
6200acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato     * @param registrationY The y coordinate of the registration point.
6300acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato     */
648dfcba4af7a7ece09e8c7d96053e54f3a383e905Adam Cohen    public DragView(Launcher launcher, Bitmap bitmap, int registrationX, int registrationY,
6572d598400da7cef9c7fc4f99bb1fcd7ff0710011Winson Chung            int left, int top, int width, int height, final float initialScale) {
668dfcba4af7a7ece09e8c7d96053e54f3a383e905Adam Cohen        super(launcher);
678dfcba4af7a7ece09e8c7d96053e54f3a383e905Adam Cohen        mDragLayer = launcher.getDragLayer();
6800acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato
69de7658b5e02ae10010e44fcf8d9c5814f54d9eb0Patrick Dubroy        final Resources res = getResources();
707bd1bbb509f9569fa18d6b4d33242679fd98bc9bWinson Chung        final float offsetX = res.getDimensionPixelSize(R.dimen.dragViewOffsetX);
717bd1bbb509f9569fa18d6b4d33242679fd98bc9bWinson Chung        final float offsetY = res.getDimensionPixelSize(R.dimen.dragViewOffsetY);
727bd1bbb509f9569fa18d6b4d33242679fd98bc9bWinson Chung        final float scaleDps = res.getDimensionPixelSize(R.dimen.dragViewScale);
737bd1bbb509f9569fa18d6b4d33242679fd98bc9bWinson Chung        final float scale = (width + scaleDps) / width;
74a669d79d0dcf034651ce305a8cd334272bec3374Patrick Dubroy
75a669d79d0dcf034651ce305a8cd334272bec3374Patrick Dubroy        // Animate the view into the correct position
76a669d79d0dcf034651ce305a8cd334272bec3374Patrick Dubroy        mAnim = ValueAnimator.ofFloat(0.0f, 1.0f);
777bd1bbb509f9569fa18d6b4d33242679fd98bc9bWinson Chung        mAnim.setDuration(150);
78a669d79d0dcf034651ce305a8cd334272bec3374Patrick Dubroy        mAnim.addUpdateListener(new AnimatorUpdateListener() {
79a669d79d0dcf034651ce305a8cd334272bec3374Patrick Dubroy            @Override
80a669d79d0dcf034651ce305a8cd334272bec3374Patrick Dubroy            public void onAnimationUpdate(ValueAnimator animation) {
81a669d79d0dcf034651ce305a8cd334272bec3374Patrick Dubroy                final float value = (Float) animation.getAnimatedValue();
82a669d79d0dcf034651ce305a8cd334272bec3374Patrick Dubroy
83a669d79d0dcf034651ce305a8cd334272bec3374Patrick Dubroy                final int deltaX = (int) ((value * offsetX) - mOffsetX);
84a669d79d0dcf034651ce305a8cd334272bec3374Patrick Dubroy                final int deltaY = (int) ((value * offsetY) - mOffsetY);
85a669d79d0dcf034651ce305a8cd334272bec3374Patrick Dubroy
86a669d79d0dcf034651ce305a8cd334272bec3374Patrick Dubroy                mOffsetX += deltaX;
87a669d79d0dcf034651ce305a8cd334272bec3374Patrick Dubroy                mOffsetY += deltaY;
8872d598400da7cef9c7fc4f99bb1fcd7ff0710011Winson Chung                setScaleX(initialScale + (value * (scale - initialScale)));
8972d598400da7cef9c7fc4f99bb1fcd7ff0710011Winson Chung                setScaleY(initialScale + (value * (scale - initialScale)));
90867ca62c0e4b811d46734ff940d59c7a787525c8Winson Chung                if (sDragAlpha != 1f) {
91867ca62c0e4b811d46734ff940d59c7a787525c8Winson Chung                    setAlpha(sDragAlpha * value + (1f - value));
92867ca62c0e4b811d46734ff940d59c7a787525c8Winson Chung                }
93a669d79d0dcf034651ce305a8cd334272bec3374Patrick Dubroy
94a669d79d0dcf034651ce305a8cd334272bec3374Patrick Dubroy                if (getParent() == null) {
95a669d79d0dcf034651ce305a8cd334272bec3374Patrick Dubroy                    animation.cancel();
96a669d79d0dcf034651ce305a8cd334272bec3374Patrick Dubroy                } else {
977bd1bbb509f9569fa18d6b4d33242679fd98bc9bWinson Chung                    setTranslationX(getTranslationX() + deltaX);
987bd1bbb509f9569fa18d6b4d33242679fd98bc9bWinson Chung                    setTranslationY(getTranslationY() + deltaY);
99a669d79d0dcf034651ce305a8cd334272bec3374Patrick Dubroy                }
100a669d79d0dcf034651ce305a8cd334272bec3374Patrick Dubroy            }
101a669d79d0dcf034651ce305a8cd334272bec3374Patrick Dubroy        });
10200acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato
1037bd1bbb509f9569fa18d6b4d33242679fd98bc9bWinson Chung        mBitmap = Bitmap.createBitmap(bitmap, left, top, width, height);
104e3e27a854f3eca363d3c5ce353d19de475272d87Adam Cohen        setDragRegion(new Rect(0, 0, width, height));
10500acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato
10600acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato        // The point in our scaled bitmap that the touch events are located
107a669d79d0dcf034651ce305a8cd334272bec3374Patrick Dubroy        mRegistrationX = registrationX;
108a669d79d0dcf034651ce305a8cd334272bec3374Patrick Dubroy        mRegistrationY = registrationY;
10962bbb3c573fe902940431e4b957c0c4918358d36Patrick Dubroy
11062bbb3c573fe902940431e4b957c0c4918358d36Patrick Dubroy        // Force a measure, because Workspace uses getMeasuredHeight() before the layout pass
11162bbb3c573fe902940431e4b957c0c4918358d36Patrick Dubroy        int ms = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED);
11262bbb3c573fe902940431e4b957c0c4918358d36Patrick Dubroy        measure(ms, ms);
1136cfafb96c3b108fec90897c1a251229be9861ddbMichael Jurka        mPaint = new Paint(Paint.FILTER_BITMAP_FLAG);
11462bbb3c573fe902940431e4b957c0c4918358d36Patrick Dubroy    }
11562bbb3c573fe902940431e4b957c0c4918358d36Patrick Dubroy
11662bbb3c573fe902940431e4b957c0c4918358d36Patrick Dubroy    public float getOffsetY() {
11762bbb3c573fe902940431e4b957c0c4918358d36Patrick Dubroy        return mOffsetY;
11800acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato    }
11900acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato
120a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka    public int getDragRegionLeft() {
121e3e27a854f3eca363d3c5ce353d19de475272d87Adam Cohen        return mDragRegion.left;
122a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka    }
123a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka
124a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka    public int getDragRegionTop() {
125e3e27a854f3eca363d3c5ce353d19de475272d87Adam Cohen        return mDragRegion.top;
126a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka    }
127a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka
128a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka    public int getDragRegionWidth() {
129e3e27a854f3eca363d3c5ce353d19de475272d87Adam Cohen        return mDragRegion.width();
130a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka    }
131a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka
132a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka    public int getDragRegionHeight() {
133e3e27a854f3eca363d3c5ce353d19de475272d87Adam Cohen        return mDragRegion.height();
134e3e27a854f3eca363d3c5ce353d19de475272d87Adam Cohen    }
135e3e27a854f3eca363d3c5ce353d19de475272d87Adam Cohen
136b8c69f3c17a40adc2d85e8e996f754c383c293dcWinson Chung    public void setDragVisualizeOffset(Point p) {
137b8c69f3c17a40adc2d85e8e996f754c383c293dcWinson Chung        mDragVisualizeOffset = p;
138b8c69f3c17a40adc2d85e8e996f754c383c293dcWinson Chung    }
139b8c69f3c17a40adc2d85e8e996f754c383c293dcWinson Chung
140b8c69f3c17a40adc2d85e8e996f754c383c293dcWinson Chung    public Point getDragVisualizeOffset() {
141b8c69f3c17a40adc2d85e8e996f754c383c293dcWinson Chung        return mDragVisualizeOffset;
142b8c69f3c17a40adc2d85e8e996f754c383c293dcWinson Chung    }
143b8c69f3c17a40adc2d85e8e996f754c383c293dcWinson Chung
144e3e27a854f3eca363d3c5ce353d19de475272d87Adam Cohen    public void setDragRegion(Rect r) {
145e3e27a854f3eca363d3c5ce353d19de475272d87Adam Cohen        mDragRegion = r;
146e3e27a854f3eca363d3c5ce353d19de475272d87Adam Cohen    }
147e3e27a854f3eca363d3c5ce353d19de475272d87Adam Cohen
148e3e27a854f3eca363d3c5ce353d19de475272d87Adam Cohen    public Rect getDragRegion() {
149e3e27a854f3eca363d3c5ce353d19de475272d87Adam Cohen        return mDragRegion;
150a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka    }
151a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka
15200acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato    @Override
15300acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
154eebd92496e2fbfbd81ea871862a681929101ba06Joe Onorato        setMeasuredDimension(mBitmap.getWidth(), mBitmap.getHeight());
15500acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato    }
15600acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato
15700acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato    @Override
15800acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato    protected void onDraw(Canvas canvas) {
15900acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato        if (false) {
16000acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato            // for debugging
16100acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato            Paint p = new Paint();
16200acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato            p.setStyle(Paint.Style.FILL);
16300acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato            p.setColor(0xaaffffff);
16400acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato            canvas.drawRect(0, 0, getWidth(), getHeight(), p);
16500acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato        }
166a669d79d0dcf034651ce305a8cd334272bec3374Patrick Dubroy
167fc53cd22c9a78708c78c85946443f23ec8c59502Adam Cohen        mHasDrawn = true;
168ed66b2bac7447febe2e405b4ce725cae4f6b5988Adam Cohen        boolean crossFade = mCrossFadeProgress > 0 && mCrossFadeBitmap != null;
169ed66b2bac7447febe2e405b4ce725cae4f6b5988Adam Cohen        if (crossFade) {
170ed66b2bac7447febe2e405b4ce725cae4f6b5988Adam Cohen            int alpha = crossFade ? (int) (255 * (1 - mCrossFadeProgress)) : 255;
171ed66b2bac7447febe2e405b4ce725cae4f6b5988Adam Cohen            mPaint.setAlpha(alpha);
172ed66b2bac7447febe2e405b4ce725cae4f6b5988Adam Cohen        }
17300acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato        canvas.drawBitmap(mBitmap, 0.0f, 0.0f, mPaint);
174ed66b2bac7447febe2e405b4ce725cae4f6b5988Adam Cohen        if (crossFade) {
175ed66b2bac7447febe2e405b4ce725cae4f6b5988Adam Cohen            mPaint.setAlpha((int) (255 * mCrossFadeProgress));
176ed66b2bac7447febe2e405b4ce725cae4f6b5988Adam Cohen            canvas.save();
177ed66b2bac7447febe2e405b4ce725cae4f6b5988Adam Cohen            float sX = (mBitmap.getWidth() * 1.0f) / mCrossFadeBitmap.getWidth();
178ed66b2bac7447febe2e405b4ce725cae4f6b5988Adam Cohen            float sY = (mBitmap.getHeight() * 1.0f) / mCrossFadeBitmap.getHeight();
179ed66b2bac7447febe2e405b4ce725cae4f6b5988Adam Cohen            canvas.scale(sX, sY);
180ed66b2bac7447febe2e405b4ce725cae4f6b5988Adam Cohen            canvas.drawBitmap(mCrossFadeBitmap, 0.0f, 0.0f, mPaint);
181ed66b2bac7447febe2e405b4ce725cae4f6b5988Adam Cohen            canvas.restore();
182ed66b2bac7447febe2e405b4ce725cae4f6b5988Adam Cohen        }
183ed66b2bac7447febe2e405b4ce725cae4f6b5988Adam Cohen    }
184ed66b2bac7447febe2e405b4ce725cae4f6b5988Adam Cohen
185ed66b2bac7447febe2e405b4ce725cae4f6b5988Adam Cohen    public void setCrossFadeBitmap(Bitmap crossFadeBitmap) {
186ed66b2bac7447febe2e405b4ce725cae4f6b5988Adam Cohen        mCrossFadeBitmap = crossFadeBitmap;
187ed66b2bac7447febe2e405b4ce725cae4f6b5988Adam Cohen    }
188ed66b2bac7447febe2e405b4ce725cae4f6b5988Adam Cohen
189ed66b2bac7447febe2e405b4ce725cae4f6b5988Adam Cohen    public void crossFade(int duration) {
190ed66b2bac7447febe2e405b4ce725cae4f6b5988Adam Cohen        ValueAnimator va = ValueAnimator.ofFloat(0f, 1f);
191ed66b2bac7447febe2e405b4ce725cae4f6b5988Adam Cohen        va.setDuration(duration);
192ed66b2bac7447febe2e405b4ce725cae4f6b5988Adam Cohen        va.setInterpolator(new DecelerateInterpolator(1.5f));
193ed66b2bac7447febe2e405b4ce725cae4f6b5988Adam Cohen        va.addUpdateListener(new AnimatorUpdateListener() {
194ed66b2bac7447febe2e405b4ce725cae4f6b5988Adam Cohen            @Override
195ed66b2bac7447febe2e405b4ce725cae4f6b5988Adam Cohen            public void onAnimationUpdate(ValueAnimator animation) {
196ed66b2bac7447febe2e405b4ce725cae4f6b5988Adam Cohen                mCrossFadeProgress = animation.getAnimatedFraction();
197ed66b2bac7447febe2e405b4ce725cae4f6b5988Adam Cohen            }
198ed66b2bac7447febe2e405b4ce725cae4f6b5988Adam Cohen        });
199ed66b2bac7447febe2e405b4ce725cae4f6b5988Adam Cohen        va.start();
20000acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato    }
20100acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato
20200acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato    public void setPaint(Paint paint) {
20300acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato        mPaint = paint;
2046cfafb96c3b108fec90897c1a251229be9861ddbMichael Jurka        if (mPaint == null) {
2056cfafb96c3b108fec90897c1a251229be9861ddbMichael Jurka            mPaint = new Paint(Paint.FILTER_BITMAP_FLAG);
2066cfafb96c3b108fec90897c1a251229be9861ddbMichael Jurka        }
20700acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato        invalidate();
20800acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato    }
20900acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato
210fc53cd22c9a78708c78c85946443f23ec8c59502Adam Cohen    public boolean hasDrawn() {
211fc53cd22c9a78708c78c85946443f23ec8c59502Adam Cohen        return mHasDrawn;
212fc53cd22c9a78708c78c85946443f23ec8c59502Adam Cohen    }
213fc53cd22c9a78708c78c85946443f23ec8c59502Adam Cohen
2143e8f811f31a2275e778244427271f77f4116c08bAdam Cohen    @Override
2153e8f811f31a2275e778244427271f77f4116c08bAdam Cohen    public void setAlpha(float alpha) {
2163e8f811f31a2275e778244427271f77f4116c08bAdam Cohen        super.setAlpha(alpha);
2173e8f811f31a2275e778244427271f77f4116c08bAdam Cohen        mPaint.setAlpha((int) (255 * alpha));
2183e8f811f31a2275e778244427271f77f4116c08bAdam Cohen        invalidate();
2193e8f811f31a2275e778244427271f77f4116c08bAdam Cohen    }
2203e8f811f31a2275e778244427271f77f4116c08bAdam Cohen
22100acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato    /**
22200acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato     * Create a window containing this view and show it.
22300acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato     *
22400acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato     * @param windowToken obtained from v.getWindowToken() from one of your views
2258dfcba4af7a7ece09e8c7d96053e54f3a383e905Adam Cohen     * @param touchX the x coordinate the user touched in DragLayer coordinates
2268dfcba4af7a7ece09e8c7d96053e54f3a383e905Adam Cohen     * @param touchY the y coordinate the user touched in DragLayer coordinates
22700acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato     */
2288dfcba4af7a7ece09e8c7d96053e54f3a383e905Adam Cohen    public void show(int touchX, int touchY) {
2298dfcba4af7a7ece09e8c7d96053e54f3a383e905Adam Cohen        mDragLayer.addView(this);
2308dfcba4af7a7ece09e8c7d96053e54f3a383e905Adam Cohen        DragLayer.LayoutParams lp = new DragLayer.LayoutParams(0, 0);
2318dfcba4af7a7ece09e8c7d96053e54f3a383e905Adam Cohen        lp.width = mBitmap.getWidth();
2328dfcba4af7a7ece09e8c7d96053e54f3a383e905Adam Cohen        lp.height = mBitmap.getHeight();
2338dfcba4af7a7ece09e8c7d96053e54f3a383e905Adam Cohen        lp.customPosition = true;
2348dfcba4af7a7ece09e8c7d96053e54f3a383e905Adam Cohen        setLayoutParams(lp);
2357bd1bbb509f9569fa18d6b4d33242679fd98bc9bWinson Chung        setTranslationX(touchX - mRegistrationX);
2367bd1bbb509f9569fa18d6b4d33242679fd98bc9bWinson Chung        setTranslationY(touchY - mRegistrationY);
237a669d79d0dcf034651ce305a8cd334272bec3374Patrick Dubroy        mAnim.start();
23800acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato    }
239716b51e030f9c6ed34af2b947760e46a280c65a6Adam Cohen
2407bd1bbb509f9569fa18d6b4d33242679fd98bc9bWinson Chung    public void cancelAnimation() {
2417bd1bbb509f9569fa18d6b4d33242679fd98bc9bWinson Chung        if (mAnim != null && mAnim.isRunning()) {
2427bd1bbb509f9569fa18d6b4d33242679fd98bc9bWinson Chung            mAnim.cancel();
2437bd1bbb509f9569fa18d6b4d33242679fd98bc9bWinson Chung        }
2447bd1bbb509f9569fa18d6b4d33242679fd98bc9bWinson Chung    }
2457bd1bbb509f9569fa18d6b4d33242679fd98bc9bWinson Chung
2467bd1bbb509f9569fa18d6b4d33242679fd98bc9bWinson Chung    public void resetLayoutParams() {
2477bd1bbb509f9569fa18d6b4d33242679fd98bc9bWinson Chung        mOffsetX = mOffsetY = 0;
2487bd1bbb509f9569fa18d6b4d33242679fd98bc9bWinson Chung        requestLayout();
2497bd1bbb509f9569fa18d6b4d33242679fd98bc9bWinson Chung    }
2507bd1bbb509f9569fa18d6b4d33242679fd98bc9bWinson Chung
25100acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato    /**
25200acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato     * Move the window containing this view.
25300acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato     *
2548dfcba4af7a7ece09e8c7d96053e54f3a383e905Adam Cohen     * @param touchX the x coordinate the user touched in DragLayer coordinates
2558dfcba4af7a7ece09e8c7d96053e54f3a383e905Adam Cohen     * @param touchY the y coordinate the user touched in DragLayer coordinates
25600acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato     */
25700acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato    void move(int touchX, int touchY) {
2587bd1bbb509f9569fa18d6b4d33242679fd98bc9bWinson Chung        setTranslationX(touchX - mRegistrationX + (int) mOffsetX);
2597bd1bbb509f9569fa18d6b4d33242679fd98bc9bWinson Chung        setTranslationY(touchY - mRegistrationY + (int) mOffsetY);
26000acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato    }
26100acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato
26200acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato    void remove() {
2637bd1bbb509f9569fa18d6b4d33242679fd98bc9bWinson Chung        if (getParent() != null) {
2647bd1bbb509f9569fa18d6b4d33242679fd98bc9bWinson Chung            mDragLayer.removeView(DragView.this);
2657bd1bbb509f9569fa18d6b4d33242679fd98bc9bWinson Chung        }
2666f13342ffd3f968de9ff86b988621cc91d94adffPatrick Dubroy    }
26700acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato}
26800acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato
269