Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Translate and Scale animation in parallel

I want to move some view from any position to center of screen and scale in parallel. If that's too complicated, translate and scale sequentially is also acceptable. But neither I could achieve. I think it's the problem with the pivot point. But sorry I found no solution. Please help. Maybe it's easy to those who develop games, about which I did nothing.

Below is my code:

private void moveViewToScreenCenter( final View view ){
    DisplayMetrics dm = new DisplayMetrics();
    getWindowManager().getDefaultDisplay().getMetrics( dm );
    int statusBarOffset = dm.heightPixels - rootLayout.getMeasuredHeight();

    int originalPos[] = new int[2];
    view.getLocationOnScreen( originalPos );

    int xDelta = (dm.widthPixels - view.getMeasuredWidth())/2 - originalPos[0];
    int yDelta = (dm.heightPixels - view.getMeasuredHeight())/2 + statusBarOffset - originalPos[1];

    AnimationSet animSet = new AnimationSet(true);
    animSet.setFillAfter(true);
    animSet.setDuration(1000);
    animSet.setInterpolator(new BounceInterpolator());
    TranslateAnimation translate = new TranslateAnimation( 0, xDelta , 0, yDelta);
    animSet.addAnimation(translate);
    ScaleAnimation scale = new ScaleAnimation(1f, 2f, 1f, 2f, ScaleAnimation.RELATIVE_TO_PARENT, .5f, ScaleAnimation.RELATIVE_TO_PARENT, .5f);
    animSet.addAnimation(scale);
    view.startAnimation(animSet);
}

Update: code above can handle imageview from top left region, those from bottom right region go diagonally through the screen and disappear.

like image 494
user1105115 Avatar asked Dec 02 '13 03:12

user1105115


2 Answers

After quite a few hopeless trials, I made it, which is too astonishing.

Below is the code, it can be used to move any view in a layout to the center of that layout:

private void moveViewToScreenCenter( final View view ){
    DisplayMetrics dm = new DisplayMetrics();
    getWindowManager().getDefaultDisplay().getMetrics( dm );

    int originalPos[] = new int[2];
    view.getLocationOnScreen( originalPos );

    int xDelta = (dm.widthPixels - view.getMeasuredWidth() - originalPos[0])/2;
    int yDelta = (dm.heightPixels - view.getMeasuredHeight() - originalPos[1])/2;

    AnimationSet animSet = new AnimationSet(true);
    animSet.setFillAfter(true);
    animSet.setDuration(1000);
    animSet.setInterpolator(new BounceInterpolator());
    TranslateAnimation translate = new TranslateAnimation( 0, xDelta , 0, yDelta);
    animSet.addAnimation(translate);
    ScaleAnimation scale = new ScaleAnimation(1f, 2f, 1f, 2f, ScaleAnimation.RELATIVE_TO_PARENT, .5f, ScaleAnimation.RELATIVE_TO_PARENT, .5f);
    animSet.addAnimation(scale);
    view.startAnimation(animSet);
}
like image 150
user1105115 Avatar answered Oct 15 '22 17:10

user1105115


The core idea is:

AnimationSet animationSet = new AnimationSet(true);

animationSet.addAnimation(
  new TranslateAnimation(0f, 64f, 0f, 32f),
  new ScaleAnimation(1f, 0f, 1f, 0f, ScaleAnimation.RELATIVE_TO_PARENT, 0f, ScaleAnimation.RELATIVE_TO_PARENT, 0f););

myView.startAnimation(
  animationSet);
like image 41
Zon Avatar answered Oct 15 '22 17:10

Zon