3

I have an custom view that was insert to windowManager for drag capabilities, and overrides the OnDraw() method. I'm trying to animate it with translate animation but the animation doesn't start (also the animationListener doesn't catch the animation), instead the view "Jumps" from the start point of the animation to it's end point.

This is the custom view:

public class DragView extends View {
@Override
protected void onAnimationEnd() {
    // TODO Auto-generated method stub
    super.onAnimationEnd();
}

@Override
protected void onAnimationStart() {
    // TODO Auto-generated method stub
    super.onAnimationStart();
}

// Number of pixels to add to the dragged item for scaling. Should be even
// for pixel alignment.
private static final int DRAG_SCALE = 0; // In Launcher, value is 40

public Bitmap mBitmap;
public Paint mPaint;
public int mRegistrationX;
public int mRegistrationY;
public Context context;

private float mAnimationScale = 1.0f;

private WindowManager.LayoutParams mLayoutParams;
private WindowManager mWindowManager;


public DragView(Context context, Bitmap bitmap, int registrationX, int registrationY, int left, int top, int width, int height,boolean animated) {
    super(context);

    if (animated)
        return;


    this.context = context;
    // mWindowManager = WindowManagerImpl.getDefault();
    mWindowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);

    Matrix scale = new Matrix();
    float scaleFactor = width;
    scaleFactor = (scaleFactor + DRAG_SCALE) / scaleFactor;
    scale.setScale(scaleFactor, scaleFactor);
    mBitmap = Bitmap.createBitmap(bitmap, left, top, width, height, scale, true);

    // The point in our scaled bitmap that the touch events are located
    mRegistrationX = registrationX + (DRAG_SCALE / 2);
    mRegistrationY = registrationY + (DRAG_SCALE / 2);
}

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    setMeasuredDimension(mBitmap.getWidth(), mBitmap.getHeight());
}


@Override
protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);
    float scale = mAnimationScale;
    if (scale < 0.999f) { // allow for some float error
        float width = mBitmap.getWidth();
        float offset = (width - (width * scale)) / 2;
        canvas.translate(offset, offset);
        canvas.scale(scale, scale);
    }
    canvas.drawBitmap(mBitmap, 0.0f, 0.0f, mPaint);
}

@Override
protected void onDetachedFromWindow() {
    super.onDetachedFromWindow();
    mBitmap.recycle();
}

public void setPaint(Paint paint) {
    mPaint = paint;
    invalidate();
}


public void show(IBinder windowToken, int touchX, int touchY) {
    final WindowManager.LayoutParams lp;
    int pixelFormat;

    pixelFormat = PixelFormat.TRANSLUCENT;

    lp = new WindowManager.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT, touchX - mRegistrationX,
            touchY - mRegistrationY, WindowManager.LayoutParams.TYPE_APPLICATION_SUB_PANEL, WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN
                    | WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS, pixelFormat);

    lp.gravity = Gravity.LEFT | Gravity.TOP;
    lp.token = windowToken;
    lp.setTitle("DragView");
    mLayoutParams = lp;


    ((FragmentActivity)context).runOnUiThread(new Runnable() {
        //@Override 
        public void run() {
            mWindowManager.addView(DragView.this, lp);
        }
    });

}


void move(int touchX, int touchY) {
    // This is what was done in the Launcher code.
    WindowManager.LayoutParams lp = mLayoutParams;
    lp.x = touchX - mRegistrationX;
    lp.y = touchY - mRegistrationY;
    mWindowManager.updateViewLayout(this, lp);
}

void remove() {
    mWindowManager.removeView(this);
}

This is how I start the animation:

TranslateAnimation translate = new TranslateAnimation
(0, outOfScreenX, 0,outOfScreenY);
                    translate.setDuration(300);
                    translate.setFillAfter(true);           
                    mDragView.clearAnimation();
                    mDragView.startAnimation(translate);
JasonMArcher
  • 14,195
  • 22
  • 56
  • 52
Nativ
  • 3,092
  • 6
  • 38
  • 69

1 Answers1

0

The "solution" to this problem is that WindowManager is a global device component(e.g the dragging of app icons uses it), and it doesn't supports animations at all.

Nativ
  • 3,092
  • 6
  • 38
  • 69
  • This isn't a solution... in fact it isn't even a complete sentence. The `WindowManager` supports animations... it just might take a little more work (have you tried using `WindowManager#updateWindowLayout()`?) – Alex Lockwood Jun 28 '13 at 17:04
  • I didn't solved this issue, I just didn't use the WindowManager. If you can provide useful information regarding this thread you are more then welcome. – Nativ Apr 22 '14 at 11:33