DragView.java revision 043f2af567178b82b0b41f12d379e7dd12da2936
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;
2861967cb17f8fa9ee01f93e9f25a1074559b54cf3Winson Chungimport android.graphics.PorterDuff;
2961967cb17f8fa9ee01f93e9f25a1074559b54cf3Winson Chungimport android.graphics.PorterDuffColorFilter;
30e3e27a854f3eca363d3c5ce353d19de475272d87Adam Cohenimport android.graphics.Rect;
3100acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onoratoimport android.view.View;
32a669d79d0dcf034651ce305a8cd334272bec3374Patrick Dubroyimport android.view.animation.DecelerateInterpolator;
3300acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato
34120980bd00f5eecec5717f49a3d7db96571025a9Adam Cohenimport com.android.launcher.R;
35120980bd00f5eecec5717f49a3d7db96571025a9Adam Cohen
36a669d79d0dcf034651ce305a8cd334272bec3374Patrick Dubroypublic class DragView extends View {
37867ca62c0e4b811d46734ff940d59c7a787525c8Winson Chung    private static float sDragAlpha = 1f;
387bd1bbb509f9569fa18d6b4d33242679fd98bc9bWinson Chung
3900acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato    private Bitmap mBitmap;
40ed66b2bac7447febe2e405b4ce725cae4f6b5988Adam Cohen    private Bitmap mCrossFadeBitmap;
4100acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato    private Paint mPaint;
4200acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato    private int mRegistrationX;
4300acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato    private int mRegistrationY;
4400acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato
45b8c69f3c17a40adc2d85e8e996f754c383c293dcWinson Chung    private Point mDragVisualizeOffset = null;
46e3e27a854f3eca363d3c5ce353d19de475272d87Adam Cohen    private Rect mDragRegion = null;
478dfcba4af7a7ece09e8c7d96053e54f3a383e905Adam Cohen    private DragLayer mDragLayer = null;
48fc53cd22c9a78708c78c85946443f23ec8c59502Adam Cohen    private boolean mHasDrawn = false;
49ed66b2bac7447febe2e405b4ce725cae4f6b5988Adam Cohen    private float mCrossFadeProgress = 0f;
50a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka
51a669d79d0dcf034651ce305a8cd334272bec3374Patrick Dubroy    ValueAnimator mAnim;
52a669d79d0dcf034651ce305a8cd334272bec3374Patrick Dubroy    private float mOffsetX = 0.0f;
53a669d79d0dcf034651ce305a8cd334272bec3374Patrick Dubroy    private float mOffsetY = 0.0f;
54043f2af567178b82b0b41f12d379e7dd12da2936Winson Chung    private float mInitialScale = 1f;
5500acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato
5600acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato    /**
5700acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato     * Construct the drag view.
5800acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato     * <p>
5900acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato     * The registration point is the point inside our view that the touch events should
6000acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato     * be centered upon.
6100acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato     *
628dfcba4af7a7ece09e8c7d96053e54f3a383e905Adam Cohen     * @param launcher The Launcher instance
6300acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato     * @param bitmap The view that we're dragging around.  We scale it up when we draw it.
6400acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato     * @param registrationX The x coordinate of the registration point.
6500acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato     * @param registrationY The y coordinate of the registration point.
6600acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato     */
678dfcba4af7a7ece09e8c7d96053e54f3a383e905Adam Cohen    public DragView(Launcher launcher, Bitmap bitmap, int registrationX, int registrationY,
6872d598400da7cef9c7fc4f99bb1fcd7ff0710011Winson Chung            int left, int top, int width, int height, final float initialScale) {
698dfcba4af7a7ece09e8c7d96053e54f3a383e905Adam Cohen        super(launcher);
708dfcba4af7a7ece09e8c7d96053e54f3a383e905Adam Cohen        mDragLayer = launcher.getDragLayer();
71043f2af567178b82b0b41f12d379e7dd12da2936Winson Chung        mInitialScale = initialScale;
7200acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato
73de7658b5e02ae10010e44fcf8d9c5814f54d9eb0Patrick Dubroy        final Resources res = getResources();
747bd1bbb509f9569fa18d6b4d33242679fd98bc9bWinson Chung        final float offsetX = res.getDimensionPixelSize(R.dimen.dragViewOffsetX);
757bd1bbb509f9569fa18d6b4d33242679fd98bc9bWinson Chung        final float offsetY = res.getDimensionPixelSize(R.dimen.dragViewOffsetY);
767bd1bbb509f9569fa18d6b4d33242679fd98bc9bWinson Chung        final float scaleDps = res.getDimensionPixelSize(R.dimen.dragViewScale);
777bd1bbb509f9569fa18d6b4d33242679fd98bc9bWinson Chung        final float scale = (width + scaleDps) / width;
78a669d79d0dcf034651ce305a8cd334272bec3374Patrick Dubroy
79a669d79d0dcf034651ce305a8cd334272bec3374Patrick Dubroy        // Animate the view into the correct position
80a669d79d0dcf034651ce305a8cd334272bec3374Patrick Dubroy        mAnim = ValueAnimator.ofFloat(0.0f, 1.0f);
817bd1bbb509f9569fa18d6b4d33242679fd98bc9bWinson Chung        mAnim.setDuration(150);
82a669d79d0dcf034651ce305a8cd334272bec3374Patrick Dubroy        mAnim.addUpdateListener(new AnimatorUpdateListener() {
83a669d79d0dcf034651ce305a8cd334272bec3374Patrick Dubroy            @Override
84a669d79d0dcf034651ce305a8cd334272bec3374Patrick Dubroy            public void onAnimationUpdate(ValueAnimator animation) {
85a669d79d0dcf034651ce305a8cd334272bec3374Patrick Dubroy                final float value = (Float) animation.getAnimatedValue();
86a669d79d0dcf034651ce305a8cd334272bec3374Patrick Dubroy
87a669d79d0dcf034651ce305a8cd334272bec3374Patrick Dubroy                final int deltaX = (int) ((value * offsetX) - mOffsetX);
88a669d79d0dcf034651ce305a8cd334272bec3374Patrick Dubroy                final int deltaY = (int) ((value * offsetY) - mOffsetY);
89a669d79d0dcf034651ce305a8cd334272bec3374Patrick Dubroy
90a669d79d0dcf034651ce305a8cd334272bec3374Patrick Dubroy                mOffsetX += deltaX;
91a669d79d0dcf034651ce305a8cd334272bec3374Patrick Dubroy                mOffsetY += deltaY;
9272d598400da7cef9c7fc4f99bb1fcd7ff0710011Winson Chung                setScaleX(initialScale + (value * (scale - initialScale)));
9372d598400da7cef9c7fc4f99bb1fcd7ff0710011Winson Chung                setScaleY(initialScale + (value * (scale - initialScale)));
94867ca62c0e4b811d46734ff940d59c7a787525c8Winson Chung                if (sDragAlpha != 1f) {
95867ca62c0e4b811d46734ff940d59c7a787525c8Winson Chung                    setAlpha(sDragAlpha * value + (1f - value));
96867ca62c0e4b811d46734ff940d59c7a787525c8Winson Chung                }
97a669d79d0dcf034651ce305a8cd334272bec3374Patrick Dubroy
98a669d79d0dcf034651ce305a8cd334272bec3374Patrick Dubroy                if (getParent() == null) {
99a669d79d0dcf034651ce305a8cd334272bec3374Patrick Dubroy                    animation.cancel();
100a669d79d0dcf034651ce305a8cd334272bec3374Patrick Dubroy                } else {
1017bd1bbb509f9569fa18d6b4d33242679fd98bc9bWinson Chung                    setTranslationX(getTranslationX() + deltaX);
1027bd1bbb509f9569fa18d6b4d33242679fd98bc9bWinson Chung                    setTranslationY(getTranslationY() + deltaY);
103a669d79d0dcf034651ce305a8cd334272bec3374Patrick Dubroy                }
104a669d79d0dcf034651ce305a8cd334272bec3374Patrick Dubroy            }
105a669d79d0dcf034651ce305a8cd334272bec3374Patrick Dubroy        });
10600acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato
1077bd1bbb509f9569fa18d6b4d33242679fd98bc9bWinson Chung        mBitmap = Bitmap.createBitmap(bitmap, left, top, width, height);
108e3e27a854f3eca363d3c5ce353d19de475272d87Adam Cohen        setDragRegion(new Rect(0, 0, width, height));
10900acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato
11000acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato        // The point in our scaled bitmap that the touch events are located
111a669d79d0dcf034651ce305a8cd334272bec3374Patrick Dubroy        mRegistrationX = registrationX;
112a669d79d0dcf034651ce305a8cd334272bec3374Patrick Dubroy        mRegistrationY = registrationY;
11362bbb3c573fe902940431e4b957c0c4918358d36Patrick Dubroy
11462bbb3c573fe902940431e4b957c0c4918358d36Patrick Dubroy        // Force a measure, because Workspace uses getMeasuredHeight() before the layout pass
11562bbb3c573fe902940431e4b957c0c4918358d36Patrick Dubroy        int ms = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED);
11662bbb3c573fe902940431e4b957c0c4918358d36Patrick Dubroy        measure(ms, ms);
1176cfafb96c3b108fec90897c1a251229be9861ddbMichael Jurka        mPaint = new Paint(Paint.FILTER_BITMAP_FLAG);
11862bbb3c573fe902940431e4b957c0c4918358d36Patrick Dubroy    }
11962bbb3c573fe902940431e4b957c0c4918358d36Patrick Dubroy
12062bbb3c573fe902940431e4b957c0c4918358d36Patrick Dubroy    public float getOffsetY() {
12162bbb3c573fe902940431e4b957c0c4918358d36Patrick Dubroy        return mOffsetY;
12200acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato    }
12300acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato
124a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka    public int getDragRegionLeft() {
125e3e27a854f3eca363d3c5ce353d19de475272d87Adam Cohen        return mDragRegion.left;
126a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka    }
127a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka
128a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka    public int getDragRegionTop() {
129e3e27a854f3eca363d3c5ce353d19de475272d87Adam Cohen        return mDragRegion.top;
130a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka    }
131a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka
132a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka    public int getDragRegionWidth() {
133e3e27a854f3eca363d3c5ce353d19de475272d87Adam Cohen        return mDragRegion.width();
134a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka    }
135a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka
136a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka    public int getDragRegionHeight() {
137e3e27a854f3eca363d3c5ce353d19de475272d87Adam Cohen        return mDragRegion.height();
138e3e27a854f3eca363d3c5ce353d19de475272d87Adam Cohen    }
139e3e27a854f3eca363d3c5ce353d19de475272d87Adam Cohen
140b8c69f3c17a40adc2d85e8e996f754c383c293dcWinson Chung    public void setDragVisualizeOffset(Point p) {
141b8c69f3c17a40adc2d85e8e996f754c383c293dcWinson Chung        mDragVisualizeOffset = p;
142b8c69f3c17a40adc2d85e8e996f754c383c293dcWinson Chung    }
143b8c69f3c17a40adc2d85e8e996f754c383c293dcWinson Chung
144b8c69f3c17a40adc2d85e8e996f754c383c293dcWinson Chung    public Point getDragVisualizeOffset() {
145b8c69f3c17a40adc2d85e8e996f754c383c293dcWinson Chung        return mDragVisualizeOffset;
146b8c69f3c17a40adc2d85e8e996f754c383c293dcWinson Chung    }
147b8c69f3c17a40adc2d85e8e996f754c383c293dcWinson Chung
148e3e27a854f3eca363d3c5ce353d19de475272d87Adam Cohen    public void setDragRegion(Rect r) {
149e3e27a854f3eca363d3c5ce353d19de475272d87Adam Cohen        mDragRegion = r;
150e3e27a854f3eca363d3c5ce353d19de475272d87Adam Cohen    }
151e3e27a854f3eca363d3c5ce353d19de475272d87Adam Cohen
152e3e27a854f3eca363d3c5ce353d19de475272d87Adam Cohen    public Rect getDragRegion() {
153e3e27a854f3eca363d3c5ce353d19de475272d87Adam Cohen        return mDragRegion;
154a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka    }
155a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka
156043f2af567178b82b0b41f12d379e7dd12da2936Winson Chung    public float getInitialScale() {
157043f2af567178b82b0b41f12d379e7dd12da2936Winson Chung        return mInitialScale;
158043f2af567178b82b0b41f12d379e7dd12da2936Winson Chung    }
159043f2af567178b82b0b41f12d379e7dd12da2936Winson Chung
160043f2af567178b82b0b41f12d379e7dd12da2936Winson Chung    public void updateInitialScaleToCurrentScale() {
161043f2af567178b82b0b41f12d379e7dd12da2936Winson Chung        mInitialScale = getScaleX();
162043f2af567178b82b0b41f12d379e7dd12da2936Winson Chung    }
163043f2af567178b82b0b41f12d379e7dd12da2936Winson Chung
16400acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato    @Override
16500acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
166eebd92496e2fbfbd81ea871862a681929101ba06Joe Onorato        setMeasuredDimension(mBitmap.getWidth(), mBitmap.getHeight());
16700acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato    }
16800acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato
16900acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato    @Override
17000acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato    protected void onDraw(Canvas canvas) {
17100acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato        if (false) {
17200acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato            // for debugging
17300acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato            Paint p = new Paint();
17400acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato            p.setStyle(Paint.Style.FILL);
175eecf02da58adef5486bf0c9ff7127ea891f457a4Winson Chung            p.setColor(0x66ffffff);
17600acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato            canvas.drawRect(0, 0, getWidth(), getHeight(), p);
17700acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato        }
178a669d79d0dcf034651ce305a8cd334272bec3374Patrick Dubroy
179fc53cd22c9a78708c78c85946443f23ec8c59502Adam Cohen        mHasDrawn = true;
180ed66b2bac7447febe2e405b4ce725cae4f6b5988Adam Cohen        boolean crossFade = mCrossFadeProgress > 0 && mCrossFadeBitmap != null;
181ed66b2bac7447febe2e405b4ce725cae4f6b5988Adam Cohen        if (crossFade) {
182ed66b2bac7447febe2e405b4ce725cae4f6b5988Adam Cohen            int alpha = crossFade ? (int) (255 * (1 - mCrossFadeProgress)) : 255;
183ed66b2bac7447febe2e405b4ce725cae4f6b5988Adam Cohen            mPaint.setAlpha(alpha);
184ed66b2bac7447febe2e405b4ce725cae4f6b5988Adam Cohen        }
18500acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato        canvas.drawBitmap(mBitmap, 0.0f, 0.0f, mPaint);
186ed66b2bac7447febe2e405b4ce725cae4f6b5988Adam Cohen        if (crossFade) {
187ed66b2bac7447febe2e405b4ce725cae4f6b5988Adam Cohen            mPaint.setAlpha((int) (255 * mCrossFadeProgress));
188ed66b2bac7447febe2e405b4ce725cae4f6b5988Adam Cohen            canvas.save();
189ed66b2bac7447febe2e405b4ce725cae4f6b5988Adam Cohen            float sX = (mBitmap.getWidth() * 1.0f) / mCrossFadeBitmap.getWidth();
190ed66b2bac7447febe2e405b4ce725cae4f6b5988Adam Cohen            float sY = (mBitmap.getHeight() * 1.0f) / mCrossFadeBitmap.getHeight();
191ed66b2bac7447febe2e405b4ce725cae4f6b5988Adam Cohen            canvas.scale(sX, sY);
192ed66b2bac7447febe2e405b4ce725cae4f6b5988Adam Cohen            canvas.drawBitmap(mCrossFadeBitmap, 0.0f, 0.0f, mPaint);
193ed66b2bac7447febe2e405b4ce725cae4f6b5988Adam Cohen            canvas.restore();
194ed66b2bac7447febe2e405b4ce725cae4f6b5988Adam Cohen        }
195ed66b2bac7447febe2e405b4ce725cae4f6b5988Adam Cohen    }
196ed66b2bac7447febe2e405b4ce725cae4f6b5988Adam Cohen
197ed66b2bac7447febe2e405b4ce725cae4f6b5988Adam Cohen    public void setCrossFadeBitmap(Bitmap crossFadeBitmap) {
198ed66b2bac7447febe2e405b4ce725cae4f6b5988Adam Cohen        mCrossFadeBitmap = crossFadeBitmap;
199ed66b2bac7447febe2e405b4ce725cae4f6b5988Adam Cohen    }
200ed66b2bac7447febe2e405b4ce725cae4f6b5988Adam Cohen
201ed66b2bac7447febe2e405b4ce725cae4f6b5988Adam Cohen    public void crossFade(int duration) {
202ed66b2bac7447febe2e405b4ce725cae4f6b5988Adam Cohen        ValueAnimator va = ValueAnimator.ofFloat(0f, 1f);
203ed66b2bac7447febe2e405b4ce725cae4f6b5988Adam Cohen        va.setDuration(duration);
204ed66b2bac7447febe2e405b4ce725cae4f6b5988Adam Cohen        va.setInterpolator(new DecelerateInterpolator(1.5f));
205ed66b2bac7447febe2e405b4ce725cae4f6b5988Adam Cohen        va.addUpdateListener(new AnimatorUpdateListener() {
206ed66b2bac7447febe2e405b4ce725cae4f6b5988Adam Cohen            @Override
207ed66b2bac7447febe2e405b4ce725cae4f6b5988Adam Cohen            public void onAnimationUpdate(ValueAnimator animation) {
208ed66b2bac7447febe2e405b4ce725cae4f6b5988Adam Cohen                mCrossFadeProgress = animation.getAnimatedFraction();
209ed66b2bac7447febe2e405b4ce725cae4f6b5988Adam Cohen            }
210ed66b2bac7447febe2e405b4ce725cae4f6b5988Adam Cohen        });
211ed66b2bac7447febe2e405b4ce725cae4f6b5988Adam Cohen        va.start();
21200acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato    }
21300acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato
21461967cb17f8fa9ee01f93e9f25a1074559b54cf3Winson Chung    public void setColor(int color) {
2156cfafb96c3b108fec90897c1a251229be9861ddbMichael Jurka        if (mPaint == null) {
2166cfafb96c3b108fec90897c1a251229be9861ddbMichael Jurka            mPaint = new Paint(Paint.FILTER_BITMAP_FLAG);
2176cfafb96c3b108fec90897c1a251229be9861ddbMichael Jurka        }
21861967cb17f8fa9ee01f93e9f25a1074559b54cf3Winson Chung        if (color != 0) {
21961967cb17f8fa9ee01f93e9f25a1074559b54cf3Winson Chung            mPaint.setColorFilter(new PorterDuffColorFilter(color, PorterDuff.Mode.SRC_ATOP));
22061967cb17f8fa9ee01f93e9f25a1074559b54cf3Winson Chung        } else {
22161967cb17f8fa9ee01f93e9f25a1074559b54cf3Winson Chung            mPaint.setColorFilter(null);
22261967cb17f8fa9ee01f93e9f25a1074559b54cf3Winson Chung        }
22300acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato        invalidate();
22400acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato    }
22500acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato
226fc53cd22c9a78708c78c85946443f23ec8c59502Adam Cohen    public boolean hasDrawn() {
227fc53cd22c9a78708c78c85946443f23ec8c59502Adam Cohen        return mHasDrawn;
228fc53cd22c9a78708c78c85946443f23ec8c59502Adam Cohen    }
229fc53cd22c9a78708c78c85946443f23ec8c59502Adam Cohen
2303e8f811f31a2275e778244427271f77f4116c08bAdam Cohen    @Override
2313e8f811f31a2275e778244427271f77f4116c08bAdam Cohen    public void setAlpha(float alpha) {
2323e8f811f31a2275e778244427271f77f4116c08bAdam Cohen        super.setAlpha(alpha);
2333e8f811f31a2275e778244427271f77f4116c08bAdam Cohen        mPaint.setAlpha((int) (255 * alpha));
2343e8f811f31a2275e778244427271f77f4116c08bAdam Cohen        invalidate();
2353e8f811f31a2275e778244427271f77f4116c08bAdam Cohen    }
2363e8f811f31a2275e778244427271f77f4116c08bAdam Cohen
23700acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato    /**
23800acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato     * Create a window containing this view and show it.
23900acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato     *
24000acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato     * @param windowToken obtained from v.getWindowToken() from one of your views
2418dfcba4af7a7ece09e8c7d96053e54f3a383e905Adam Cohen     * @param touchX the x coordinate the user touched in DragLayer coordinates
2428dfcba4af7a7ece09e8c7d96053e54f3a383e905Adam Cohen     * @param touchY the y coordinate the user touched in DragLayer coordinates
24300acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato     */
2448dfcba4af7a7ece09e8c7d96053e54f3a383e905Adam Cohen    public void show(int touchX, int touchY) {
2458dfcba4af7a7ece09e8c7d96053e54f3a383e905Adam Cohen        mDragLayer.addView(this);
246043f2af567178b82b0b41f12d379e7dd12da2936Winson Chung
247043f2af567178b82b0b41f12d379e7dd12da2936Winson Chung        // Enable hw-layers on this view
248043f2af567178b82b0b41f12d379e7dd12da2936Winson Chung        setLayerType(View.LAYER_TYPE_HARDWARE, null);
249043f2af567178b82b0b41f12d379e7dd12da2936Winson Chung
250043f2af567178b82b0b41f12d379e7dd12da2936Winson Chung        // Start the pick-up animation
2518dfcba4af7a7ece09e8c7d96053e54f3a383e905Adam Cohen        DragLayer.LayoutParams lp = new DragLayer.LayoutParams(0, 0);
2528dfcba4af7a7ece09e8c7d96053e54f3a383e905Adam Cohen        lp.width = mBitmap.getWidth();
2538dfcba4af7a7ece09e8c7d96053e54f3a383e905Adam Cohen        lp.height = mBitmap.getHeight();
2548dfcba4af7a7ece09e8c7d96053e54f3a383e905Adam Cohen        lp.customPosition = true;
2558dfcba4af7a7ece09e8c7d96053e54f3a383e905Adam Cohen        setLayoutParams(lp);
2567bd1bbb509f9569fa18d6b4d33242679fd98bc9bWinson Chung        setTranslationX(touchX - mRegistrationX);
2577bd1bbb509f9569fa18d6b4d33242679fd98bc9bWinson Chung        setTranslationY(touchY - mRegistrationY);
258a669d79d0dcf034651ce305a8cd334272bec3374Patrick Dubroy        mAnim.start();
25900acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato    }
260716b51e030f9c6ed34af2b947760e46a280c65a6Adam Cohen
2617bd1bbb509f9569fa18d6b4d33242679fd98bc9bWinson Chung    public void cancelAnimation() {
2627bd1bbb509f9569fa18d6b4d33242679fd98bc9bWinson Chung        if (mAnim != null && mAnim.isRunning()) {
2637bd1bbb509f9569fa18d6b4d33242679fd98bc9bWinson Chung            mAnim.cancel();
2647bd1bbb509f9569fa18d6b4d33242679fd98bc9bWinson Chung        }
2657bd1bbb509f9569fa18d6b4d33242679fd98bc9bWinson Chung    }
2667bd1bbb509f9569fa18d6b4d33242679fd98bc9bWinson Chung
2677bd1bbb509f9569fa18d6b4d33242679fd98bc9bWinson Chung    public void resetLayoutParams() {
2687bd1bbb509f9569fa18d6b4d33242679fd98bc9bWinson Chung        mOffsetX = mOffsetY = 0;
2697bd1bbb509f9569fa18d6b4d33242679fd98bc9bWinson Chung        requestLayout();
2707bd1bbb509f9569fa18d6b4d33242679fd98bc9bWinson Chung    }
2717bd1bbb509f9569fa18d6b4d33242679fd98bc9bWinson Chung
27200acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato    /**
27300acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato     * Move the window containing this view.
27400acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato     *
2758dfcba4af7a7ece09e8c7d96053e54f3a383e905Adam Cohen     * @param touchX the x coordinate the user touched in DragLayer coordinates
2768dfcba4af7a7ece09e8c7d96053e54f3a383e905Adam Cohen     * @param touchY the y coordinate the user touched in DragLayer coordinates
27700acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato     */
27800acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato    void move(int touchX, int touchY) {
2797bd1bbb509f9569fa18d6b4d33242679fd98bc9bWinson Chung        setTranslationX(touchX - mRegistrationX + (int) mOffsetX);
2807bd1bbb509f9569fa18d6b4d33242679fd98bc9bWinson Chung        setTranslationY(touchY - mRegistrationY + (int) mOffsetY);
28100acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato    }
28200acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato
28300acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato    void remove() {
2847bd1bbb509f9569fa18d6b4d33242679fd98bc9bWinson Chung        if (getParent() != null) {
285043f2af567178b82b0b41f12d379e7dd12da2936Winson Chung            // Disable hw-layers on this view
286043f2af567178b82b0b41f12d379e7dd12da2936Winson Chung            setLayerType(View.LAYER_TYPE_NONE, null);
287043f2af567178b82b0b41f12d379e7dd12da2936Winson Chung
2887bd1bbb509f9569fa18d6b4d33242679fd98bc9bWinson Chung            mDragLayer.removeView(DragView.this);
2897bd1bbb509f9569fa18d6b4d33242679fd98bc9bWinson Chung        }
2906f13342ffd3f968de9ff86b988621cc91d94adffPatrick Dubroy    }
29100acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato}
29200acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato
293