Animation动画使用注意事项

背景:类似购物车动画,点击某个控件,在这个控件的位置上生成一个控件,让其运动到某个位置;

注意事项:
- 运动的控件需要依附于一个动画层布局才能启动动画;

package com.onetoo.www.onetoo.utils;

import android.app.Activity;
import android.util.Log;
import android.util.TypedValue;
import android.view.View;
import android.view.ViewGroup;
import android.view.animation.AccelerateInterpolator;
import android.view.animation.Animation;
import android.view.animation.AnimationSet;
import android.view.animation.LinearInterpolator;
import android.view.animation.TranslateAnimation;
import android.widget.LinearLayout;

/**
 * Created by longShun on 2016/9/29 0029.
 */
public class AnimUtils {

    private static LinearLayout animLayout;

    /**
     * @param activity activity
     * @param view     运动的控件最好在动画完成后清除
     * @param start    动画开始的位置
     * @param end      动画结束的位置
     * @param listener 动画监听
     */
    public static void startArcAnim(Activity activity, View view, int[] start, int[] end, Animation.AnimationListener listener) {
        //获取动画层
        if (animLayout == null) {
            animLayout = getAnimLayout(activity);
        }
        //把运动控件加入到动画层
        addViewToLayout(activity, view, start, animLayout);
        //启动动画
        //1.先往左边走一点
//        int leftOffsetX = -200;
//        int leftOffsetY = -300;

//        TranslateAnimation translateAnimationX1 = new TranslateAnimation(0, leftOffsetX, 0, 0);
//        translateAnimationX1.setInterpolator(new LinearInterpolator());
//        translateAnimationX1.setRepeatCount(0);
//        translateAnimationX1.setDuration(400);
//
//        TranslateAnimation translateAnimationY1 = new TranslateAnimation(0, 0, 0, leftOffsetY);
//        translateAnimationY1.setInterpolator(new AccelerateInterpolator());
//        translateAnimationY1.setRepeatCount(0);
//        translateAnimationY1.setDuration(400);
//
//        int endOffsetX = end[0] - start[0] - leftOffsetX;//起始位置为控件所在位置
//        int endOffsetY = end[1] - start[1] - leftOffsetY;
        int endOffsetX = end[0] - start[0];
        int endOffsetY = end[1] - start[1];
        TranslateAnimation translateAnimationX = new TranslateAnimation(0, endOffsetX, 0, 0);
        translateAnimationX.setInterpolator(new AccelerateInterpolator());
        translateAnimationX.setRepeatCount(0);
//        translateAnimationX.setStartOffset(400);

        TranslateAnimation translateAnimationY = new TranslateAnimation(0, 0, 0, endOffsetY);
        translateAnimationY.setInterpolator(new LinearInterpolator());
        translateAnimationY.setRepeatCount(0);
//        translateAnimationY.setStartOffset(400);

        AnimationSet set = new AnimationSet(false);
        set.setFillAfter(false);
//        set.addAnimation(translateAnimationX1);
//        set.addAnimation(translateAnimationY1);
        set.addAnimation(translateAnimationX);
        set.addAnimation(translateAnimationY);
        set.setDuration(1000);
        set.setAnimationListener(listener);
        view.startAnimation(set);
    }

    private static void addViewToLayout(Activity activity, View view, int[] fromPoint, LinearLayout animLayout) {
        if (view != null && view.getParent() != null) {
            LinearLayout parent = (LinearLayout) view.getParent();
            parent.removeView(view);
            Log.d("addViewToLayout: ", "true ");
        }
        int viewSize = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,
                30, activity.getResources().getDisplayMetrics());//30dp转换为像素
//        LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT);
        LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(
                viewSize,
                viewSize);
        params.leftMargin = fromPoint[0];
        params.topMargin = fromPoint[1];
        Log.d("addViewToLayout: ", fromPoint[0] + ":" + fromPoint[1]);

        if (view != null) {
            view.setLayoutParams(params);
        }
        //不做判断会出问题:在上一个动画还没执行完,用户又点击添加一个控件执行动画,会出现控件浮在开始动画的位置,并且之后点击添加控件执行动画,没有动画效果。
        if (animLayout.getChildCount()>0){
            animLayout.removeAllViews();
        }
        animLayout.addView(view);
    }

    public static void removeAnimLayout(Activity activity) {
        ViewGroup rootView = (ViewGroup) activity.getWindow().getDecorView();
        rootView.removeView(animLayout);
        animLayout = null;
    }

    /**
     * 创建动画层
     */
    private static LinearLayout getAnimLayout(Activity activity) {
        ViewGroup rootView = (ViewGroup) activity.getWindow().getDecorView();
        LinearLayout animLayout = new LinearLayout(activity);
        LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(
                LinearLayout.LayoutParams.MATCH_PARENT,
                LinearLayout.LayoutParams.MATCH_PARENT);
        animLayout.setLayoutParams(lp);
        animLayout.setBackgroundResource(android.R.color.transparent);
        rootView.addView(animLayout);
        return animLayout;
    }
}

点击添加一个控件并执行动画

public void imageClick(View view) {
        if (view instanceof ImageView) {
            Log.d(TAG, "imageClick: endlocation="+endLocation[0]+":"+endLocation[1]);
            ImageView imageView = (ImageView) view;
            //变大动画
            imageView.setImageResource(R.drawable.icon_star_all);
            Animation animation = AnimationUtils.loadAnimation(getActivity(), R.anim.anim_scale_big);
            imageView.startAnimation(animation);
            //1.计算起点的位置
            int[] startLocation = new int[2];
            imageView.getLocationInWindow(startLocation);
            int startX = startLocation[0];
            int startY = startLocation[1];
            Log.d(TAG, "startX=" + startX + ";startY=" + startY);
            //2.获取终点的位置

            if (endLocation != null) {          
                int endX = this.endLocation[0];
                int endY = this.endLocation[1];
                Log.d(TAG, "endX=" + endX + ";endy=" + endY);
                //如果用户快速连续点击,会出现上面说的问题,暂时不知道为什么,哪位大神看出来了帮帮忙留个言吧,感激
                moveView = new ImageView(getActivity());
                moveView.setImageResource(R.drawable.icon_star_all);
                AnimUtils.startArcAnim(getActivity(), moveView, startLocation, endLocation, this);
            }
        }
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值