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); } } }
相关文章推荐
- Unity3d的Animation使用注意事项
- activity动画主题使用注意事项
- 使用Irrlicht引擎播放动画注意事项
- Android使用动画的注意事项
- 使用动画的注意事项
- Android开发中动画使用的注意事项
- 使用WPF动画编程的几点注意事项[转]
- UGUI中带参数事件的使用,itween动画注意事项以及切换场景
- 安卓手机开机动画bootanimation.zip文件制作以及注意事项
- Animation动画使用注意点
- 【Unity3d】Animator和Animation组件使用注意事项
- 使用AnimatorOverrideController动态更换animationclip注意事项
- 【Unity3d】Animator和Animation组件使用注意事项
- Android 动画使用注意事项
- 使用WPF动画编程的几点注意事项
- 在Linux/Unix中使用错误保留符需注意的事项(2006-02-17)
- _com_util::ConvertStringToBSTR 使用时的注意事项
- ruby中字符串的转码 使用方法以及注意事项
- C++构造函数中使用new时应注意的事项!
- 在asp.net 2.0中使用CuteEditor 5.0的一个注意事项