最近在做一个类似于购物的动画。先上最终的效果的Demo。
从图中可以看出,是可以在一个动画还没有结束的时候开始第二个动画,即多个动画会依次执行。自己做的动画并不多,所以就说的详细一点(如果有说错的的还望告诉一下啊,哈哈)
1.一个View只能在自身的父布局中移动。最开始,将这个效果放在ListView中的时候,发现根本不移动,当时移动的是ListView的某个Item中的一个TextView,并且我也没有单独的new一个图层来执行动画。
2.怎么才能让View的动画会多个依次的去执行。最开始,做的时候是在每次执行动画之前创建一个View,然后在每次监听动画结束的时候去remove这个View,然后出现的结果是每当界面出现两个View的时候就会crash。那什么会让动画依次执行呢?先进先出,队列,最后用的是Handler。
3.多种动画同时存在的时候,比如ScaleAnimation和TranslateAnimation,加在AnimationSet中的时候会发现计算的位置不正确。这个是因为ScaleAnimation以后位置会出现一些变化。两种解决方案。
(1) AnimationSet将ScaleAnimation放在第一个。
(2)new Animation的时候设置他的type,Animation.RELATIVE_TO_SELF。
动画的类。
public void startBuyAnim(final View view)
{
int start_location[] = new int[2];
view.getLocationInWindow(start_location);
ImageView startView = new ImageView(context);
startView.setBackgroundColor(Color.RED);
startView.setLayoutParams(new LayoutParams(context.getResources().getDimensionPixelSize(R.dimen.red_point_size),
context.getResources().getDimensionPixelSize(R.dimen.red_point_size)));
Item item = new Item();
item.view = startView;
viewHolder.add(item);
animLayout.addView(startView);
// 目的位子
int endX = MainActivity.END_LOCATION[0];
int endY = MainActivity.END_LOCATION[1];
TranslateAnimation translateAnimationX = new TranslateAnimation(start_location[0], endX, 0.0f, 0.0f);
translateAnimationX.setInterpolator(new LinearInterpolator());
translateAnimationX.setRepeatCount(0);
translateAnimationX.setFillAfter(true);
TranslateAnimation translateAnimationY = new TranslateAnimation(0.0f, 0.0f, start_location[1], endY);
translateAnimationY.setInterpolator(new Interpolator()
{
@Override
public float getInterpolation(float input)
{
return ((1.5f * (input - 0.16666667f)) * (input - 0.16666667f)) - 0.041666668f;
}
});
translateAnimationY.setRepeatCount(0);
translateAnimationX.setFillAfter(true);
// ScaleAnimation scaleAnimation = new ScaleAnimation(1, 0.05f, 1,
// 0.05f, Animation.RELATIVE_TO_SELF, 0,
// Animation.RELATIVE_TO_SELF, 0);
// scaleAnimation.setRepeatCount(0);
// scaleAnimation.setFillAfter(true);
AnimationSet set = new AnimationSet(false);
set.setFillAfter(false);
// set.addAnimation(scaleAnimation);
set.addAnimation(translateAnimationX);
set.addAnimation(translateAnimationY);
set.setDuration(600);
startView.startAnimation(set);
set.setAnimationListener(new AnimationListener()
{
@Override
public void onAnimationStart(Animation animation)
{
}
@Override
public void onAnimationRepeat(Animation animation)
{
}
@Override
public void onAnimationEnd(Animation animation)
{
AnimUtil.this.handler.post(new Runnable()
{
@Override
public void run()
{
AnimUtil.this.removeView();
}
});
}
});
}
private List<Item> viewHolder;
private class Item
{
public View view;
private Item()
{
}
}
private void removeView()
{
if (this.viewHolder != null && this.viewHolder.size() > 0)
{
Item item0 = this.viewHolder.get(0);
item0.view.setVisibility(View.GONE);
this.viewHolder.remove(item0);
this.animLayout.removeView(item0.view);
}
}
}
下载链接:http://download.csdn.net/detail/a38017032/9424067