实现方式一:
xml编写平移动画
base_anim_translation.xml
代码加载执行动画:
Animation animation = AnimationUtils.loadAnimation(this,R.anim.base_anim_translation);
button.startAnimation(animation);
实现方式二:
TranslateAnimation translateAnimation = new TranslateAnimation(0,200,0,200);
translateAnimation.setDuration(500);//设置执行时间
translateAnimation.setFillAfter(true);
button.startAnimation(translateAnimation);
实现方式一:
xml编写旋转动画
base_anim_rotation.xml
代码加载执行动画:
Animation animation = AnimationUtils.loadAnimation(this,R.anim.base_anim_rotation);
button.startAnimation(animation);
实现方式二:
RotateAnimation rotateAnimation = new RotateAnimation(0,90,Animation.RELATIVE_TO_SELF,0.5f,Animation.RELATIVE_TO_SELF,0.5f);
rotateAnimation.setDuration(500);
rotateAnimation.setFillAfter(true);
button.startAnimation(rotateAnimation);
实现方式一:
xml编写缩放动画
base_anim_scale.xml
代码加载执行动画:
Animation animation = AnimationUtils.loadAnimation(this,R.anim.base_anim_scale);
button.startAnimation(animation);
实现方式二:
RotateAnimation rotateAnimation = new RotateAnimation(0,90,Animation.RELATIVE_TO_SELF,0.5f,Animation.RELATIVE_TO_SELF,0.5f);
rotateAnimation.setDuration(500);
rotateAnimation.setFillAfter(true);
button.startAnimation(rotateAnimation);
实现方式一:
xml编写透明度动画
base_anim_alpha.xml
代码加载执行动画:
Animation animation = AnimationUtils.loadAnimation(this,R.anim.base_anim_alpha);
button.startAnimation(animation);
实现方式二:
AlphaAnimation alphaAnimation = new AlphaAnimation(1f,0.2f);
alphaAnimation.setDuration(500);
alphaAnimation.setFillAfter(true);
button.startAnimation(alphaAnimation);
实现方式一:
xml编写帧动画
anim_list.xml
布局:
获取背景实现动画:
AnimationDrawable drawable = (AnimationDrawable) iv.getBackground();
if(drawable.isRunning()){
drawable.stop();
}else {
drawable.start();
}
实现方式二:
代码实现方式:
AnimationDrawable animationDrawable = new AnimationDrawable() ;
int[] ids = {R.drawable.anim_1,R.drawable.anim_2,R.drawable.anim_3,R.drawable.anim_4};
//通过循环将每一帧添加到AnimationDrawable中
for(int i = 0 ; i < ids.length ; i ++){
Drawable frame = getResources().getDrawable(ids[i]);
animationDrawable.addFrame(frame,200);
}
animationDrawable.setOneShot(false);
iv.setBackground(animationDrawable);
animationDrawable.start();
###ObjectAnimator
实现方式一:
button.animate().translationX(200).setDuration(500).translationY(200).start();
实现方式二:
ObjectAnimator animator = ObjectAnimator.ofFloat(button,"translationX",200);
animator.setDuration(500);
animator.start();
ObjectAnimator animator = ObjectAnimator.ofFloat(button,"rotation",90);
animator.setDuration(500);
animator.start();
ObjectAnimator animator = ObjectAnimator.ofFloat(button,"scaleX",2);
animator.setDuration(500);
animator.start();
ObjectAnimator animator = ObjectAnimator.ofFloat(button,"alpha",0.2f);
animator.setDuration(500);
animator.start();
PropertyValuesHolder holder1 = PropertyValuesHolder.ofFloat("translationX",200);
PropertyValuesHolder holder2 = PropertyValuesHolder.ofFloat("translationY",200);
ObjectAnimator animator = ObjectAnimator.ofPropertyValuesHolder(button, holder1, holder2);
animator.setDuration(500);
animator.start();
Keyframe frame1 = Keyframe.ofFloat(0,0);
Keyframe frame2 = Keyframe.ofFloat(0.5f,200);
Keyframe frame3 = Keyframe.ofFloat(1,100);
//将关键帧应用到属性上
PropertyValuesHolder holder = PropertyValuesHolder.ofKeyframe("translationX", frame1, frame2, frame3);
ObjectAnimator animator = ObjectAnimator.ofPropertyValuesHolder(button, holder);
animator.setDuration(500);
animator.start();
1、系统自带的补间器
Interpolator | 资源ID | 功能 |
---|---|---|
AccelerateDecelerateInterpolator | @android:anim/accelerate_decelerate_interpolator | 先加速再减速 |
AccelerateInterpolator | @android:anim/accelerate_interpolator | 加速 |
AnticipateInterpolator | @android:anim/anticipate_interpolator | 先后退一小步然后加速前进 |
AnticipateOvershootInterpolator | @android:anim/anticipate_overshoot_interpolator | 先后退一小步再加速前进,超出终点一小步再回到终点 |
BounceInterpolator | @android:anim/bounce_interpolator | 最后阶段弹球效果 |
CycleInterpolator | @android:anim/cycle_interpolator | 周期运行 |
DecelerateInterpolator | @android:anim/decelerate_interpolator | 减速 |
LinearInterpolator | @android:anim/linear_interpolator | 匀速 |
OvershootInterpolator | @android:anim/overshoot_interpolator | 快速到达终点并超出一小步然后回到终点 |
2、平移动画补间器示例
ObjectAnimator animator = ObjectAnimator.ofFloat(button,"translationX", 100,400);
animator.setDuration(500);
//先后退一小步再加速前进,超出终点一小步再回到终点
animator.setInterpolator(new AnticipateOvershootInterpolator());
animator.start();
3、自定义补间器
采用上面创建的ObjectAnimator
animator.setInterpolator(new TimeInterpolator() {
@Override
public float getInterpolation(float input) {
//input 百分比(范围 0 - 1 ) 0.1 0.3 0. 5 只与时间有关
//上面我们定义动画执行时间是500 如果过了200 input=0.4
// 与自己设定的值无关 只与时间有关
Log.i("ObjeceAnimator","interpolation result :"+(1 - input));
return 1 - input;// 1 ---- 0 我们可以根据input自定义返回值
}
});
Evaluator是计算规则,系统提供了一些默认的计算规则(FloatEvaluator IntEvaluator)
自定义计算规则
animator.setEvaluator(new TypeEvaluator() {
@Override
public Float evaluate(float fraction, Float startValue, Float endValue) {
//在这个方法里,我们可以任意的自定义计算规则
float result = startValue + (endValue - startValue) * fraction ;
Log.i("ObjeceAnimator","evaluator fraction:"+fraction+",result:"+result);
return result ;
}
});
animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator valueAnimator) {
float fraction = valueAnimator.getAnimatedFraction();
float value = (float) valueAnimator.getAnimatedValue();
Log.i("ObjeceAnimator","update fraction:"+fraction+",value:"+value);
}
});
Interpolation 中的getInterpolation方法的返回值 负责计算百分比 只和时间有关
Evaluator 中的evaluate方法根据百分比和开始结束值计算value
UpdateListener中的fraction和value都是上面计算的结果
ValueAnimator是动画基础,可以在此基础上完成想要的任何动画
ValueAnimator只提供变化量,并不真正的作用于view上
ValueAnimator根据补间器Interpolator(差值器)时间产生百分比
ValueAnimator根据Evaluator的计算规则和第2步中的百分比,计算value值
ValueAnimator中的UpdateListener监听获取百分比和value
ValueAnimator animator = ValueAnimator.ofFloat(100,200);
animator.setDuration(500);
animator.start();
animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
float fraction = animation.getAnimatedFraction();
float value = (float) animation.getAnimatedValue();
//在这里设置动画属性
button.setTranslationX(value);
Log.i("ObjectAnimator","fraction:"+fraction+",value:"+value);
}
});
Evaluator作用:提供计算规则
强调:无论什么类型都需要计算规则Evaluator
ofFloat:系统默认提供FloatEvaluator
ofInt:系统默认提供IntEvaluator
ofObject:系统不知道使用的具体类型,同时又需要计算规则,这时就需要我们自己提供计算规则
ValueAnimator animator = ValueAnimator.ofObject(new CharEvaluator(),new Character('a'),new Character('z'));
animator.setDuration(10000);
animator.start();
animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
char value = (char) animation.getAnimatedValue();
button.setText("测试"+value);
}
});
AnimatorSet animatorSet = new AnimatorSet() ;
ObjectAnimator animator1 = ObjectAnimator.ofFloat(testBtn,"translationX",200);
ObjectAnimator animator2 = ObjectAnimator.ofFloat(testBtn,"translationY",200);
animatorSet.play(animator1);
//依次执行动画
animatorSet.playSequentially(animator1,animator2);
//同时执行动画
//animatorSet.playTogether(animator1,animator2);
animatorSet.setDuration(500);
animatorSet.start();
1、 SVG Path指令
M = moveto(M X,Y) :将画笔移动到指定的坐标位置
L = lineto(L X,Y) :画直线到指定的坐标位置
H = horizontal lineto(H X):画水平线到指定的X坐标位置
V = vertical lineto(V Y):画垂直线到指定的Y坐标位置
C = curveto(C X1,Y1,X2,Y2,ENDX,ENDY):三次贝赛曲线
S = smooth curveto(S X2,Y2,ENDX,ENDY)
Q = quadratic Belzier curve(Q X,Y,ENDX,ENDY):二次贝赛曲线
T = smooth quadratic Belzier curveto(T ENDX,ENDY):映射
A = elliptical Arc(A RX,RY,XROTATION,FLAG1,FLAG2,X,Y):弧线
Z = closepath():关闭路径
2、 SVG动画示例
1、 定义VectorDrawable
drawable文件夹下定义search_bar.xml
2、定义animated-vector
animated-vector相当于一个桥梁,将动画与VectorDrawable连接在一起
drawable文件夹下定义search_to_bar.xml
drawable文件夹下定义bar_to_search.xml
3、定义动画
animator文件加下定义anim_bar_fill.xml和anim_bar_none.xml、anim_search_fill.xml、anim_search_none.xml
anim_bar_fill.xml
anim_bar_none.xml
anim_search_fill.xml
anim_search_none.xml
4、动画使用
public class SvgActivity extends AppCompatActivity {
private ImageView search ;
private Boolean flag = false ;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_svg);
search = (ImageView) findViewById(R.id.search);
final AnimatedVectorDrawable barToSearch = (AnimatedVectorDrawable) getResources().getDrawable(R.drawable.bar_to_search);
final AnimatedVectorDrawable searchToBar = (AnimatedVectorDrawable) getResources().getDrawable(R.drawable.search_to_bar);
search.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(flag) {
search.setImageDrawable(barToSearch);
barToSearch.start();
flag = false ;
}else {
search.setImageDrawable(searchToBar);
searchToBar.start();
flag = true ;
}
}
});
}
}
Lottie使用同一个JSON动画文件,可在不同平台实现相同的效果。
GitHub地址