您的位置:首页 > 其它

Animation动画使用注意事项

2016-09-29 22:20 246 查看
背景:类似购物车动画,点击某个控件,在这个控件的位置上生成一个控件,让其运动到某个位置;

注意事项:

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

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);
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  动画