本来想先放实现效果,后来手机实在捉急,只能后续再补啦。
一 实现透明效果:
//属性动画变透明
private void alphaAnim(){
//不透明--->透明--->不透明 2s钟时间平均分配
ObjectAnimator objectAnimator=ObjectAnimator.ofFloat(imageView,"alpha",1f,0f,1f);
//从不透明变成透明
// ObjectAnimator objectAnimator=ObjectAnimator.ofFloat(imageView,"alpha",1f,0f);
//只执行一次动画时,可以省略1f
// ObjectAnimator objectAnimator=ObjectAnimator.ofFloat(imageView,"alpha",0f);
objectAnimator.setDuration(2000); //设置动画时间为2000ms
objectAnimator.start();
}
1f为完全不透明 0f为完全透明
二:实现旋转效果
//属性动画 旋转
private void rotationAnim(){
//0-->360 顺时针 360-->0 逆时针
//下个度数大于上个度数,顺时针旋转;下个度数小于上个度数,逆时针旋转。
ObjectAnimator objectAnimator=ObjectAnimator.ofFloat(imageView,"rotation",0f,360,0);
objectAnimator.setDuration(5000);
objectAnimator.start();
}
三 实现平移效果:
//平移
private void translationAnim(){
// translationX 沿着x轴移动 上个数大于下个数,左移。反之右移
// ObjectAnimator objectAnimator=ObjectAnimator.ofFloat(imageView,"translationX",0f,-300f,0f); //左移-->右移
// translationX 沿着x轴移动 上个数大于下个数,上移。反之下移
ObjectAnimator objectAnimator=ObjectAnimator.ofFloat(imageView,"translationY",0f,300f,0f); //下移-->上移
objectAnimator.setDuration(5000);
objectAnimator.start();
}
四 实现缩放效果
//缩放
private void scaleAnim(){
ObjectAnimator objectAnimator=ObjectAnimator.ofFloat(imageView,"scaleX",1f,2f,1f); //沿着x轴放大两倍再返回
ObjectAnimator objectAnimator1=ObjectAnimator.ofFloat(imageView,"scaleY",1f,2f,1f); //沿着Y轴放大两倍再返回
objectAnimator.setDuration(5000);
objectAnimator1.setDuration(5000);
objectAnimator.start();
objectAnimator1.start();
}
五 组合动画
以上都是基本动画,如果只有基本动画,显然是不够的,所以还有个类AnimatorSet,专门来组合这些动画。
AnimatorSet:这个类提供了一个play()方法,调用后将会返回一个AnimatorSet.Builder的实例,AnimatorSet.Builder中包括以下四个方法:
after(Animator anim) :将现有动画插入到传入的动画之后执行
after(long delay) :将现有动画延迟指定毫秒后执行
before(Animator anim): 将现有动画插入到传入的动画之前执行
with(Animator anim) :将现有动画和传入的动画同时执行
//组合动画
private void setAnim(){
//沿x轴放大
ObjectAnimator scaleXAnimator = ObjectAnimator.ofFloat(imageView, "scaleX", 1f, 2f, 1f);
//沿y轴放大
ObjectAnimator scaleYAnimator = ObjectAnimator.ofFloat(imageView, "scaleY", 1f, 2f, 1f);
//移动
ObjectAnimator translationXAnimator = ObjectAnimator.ofFloat(imageView, "translationX", 0f, 200f, 0f);
//透明动画
ObjectAnimator alphaAnimator = ObjectAnimator.ofFloat(imageView, "alpha", 1f, 0f, 1f);
AnimatorSet animatorSet=new AnimatorSet();
//同时沿X,Y轴放大,且改变透明度,然后移动
//在3s内,沿x、y轴同时放大,然后缩小,在缩放的同时还要改变透明度。然后再完成3s的左右移动。
animatorSet.play(scaleXAnimator).with(scaleYAnimator).with(alphaAnimator).before(translationXAnimator);
//每个动画都设置成3s,也可以分别设置
animatorSet.setDuration(3000);
animatorSet.start();
}
六 在xml中实现动画效果
1.透明:
<?xml version="1.0" encoding="utf-8"?>
<objectAnimator xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="2000"
android:propertyName="alpha"
android:repeatCount="-1"
android:repeatMode="reverse"
android:valueFrom="0.5"
android:valueTo="1"
android:valueType="floatType">
<!--
android:duration:动画持续时间;
android:propertyName:动画类型;
android:repeatCount:重复次数,-1为一直重复;
android:repeatMode:重复模式:reverse(从结束的位置继续), restart(从新开始);
android:valueFrom:起始值;
android:valueTo:结束值。
android:valueType:值类型
-->
</objectAnimator>
在布局中的实现:
//alpha.xml对应的代码实现
private void alphaXml(){
Animator animator= AnimatorInflater.loadAnimator(this,R.animator.alpha);
animator.setTarget(imageView);
animator.start();
}
2.旋转
<objectAnimator xmlns:android="http://schemas.android.com/apk/res/android"
android:valueFrom="0"
android:valueTo="360"
android:duration="2000"
android:propertyName="rotation"
android:valueType="floatType"/>
3.移动
<objectAnimator xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="2000"
android:propertyName="translationX"
android:repeatCount="-1"
android:repeatMode="reverse"
android:valueFrom="0"
android:valueTo="200"
android:valueType="floatType"/>
4.缩放:
<objectAnimator xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="2000"
android:propertyName="scaleX"
android:valueFrom="1"
android:valueTo="1.5"
android:valueType="floatType" />
5.组合:
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:ordering="sequentially">
<set>
<objectAnimator
android:duration="4000"
android:propertyName="rotation"
android:repeatMode="reverse"
android:valueFrom="0"
android:valueTo="360" />
<set android:ordering="sequentially">
<objectAnimator
android:duration="2000"
android:propertyName="translationX"
android:repeatMode="reverse"
android:valueFrom="0"
android:valueTo="200" />
<objectAnimator
android:duration="2000"
android:propertyName="translationX"
android:repeatMode="reverse"
android:valueFrom="200"
android:valueTo="0" />
</set>
</set>
<set >
<objectAnimator
android:duration="4000"
android:propertyName="rotation"
android:repeatMode="reverse"
android:valueFrom="0"
android:valueTo="360" />
<set android:ordering="sequentially">
<objectAnimator
android:duration="2000"
android:propertyName="translationX"
android:repeatMode="reverse"
android:valueFrom="0"
android:valueTo="-200" />
<objectAnimator
android:duration="2000"
android:propertyName="translationX"
android:repeatMode="reverse"
android:valueFrom="-200"
android:valueTo="0" />
</set>
</set>
</set>
这里需要说下set中的属性android:ordering:规定了这个set中的动画的执行顺序,包括:
together(默认):set中的动画同时执行
sequentially:set中的动画按顺序执行
好啦,属性动画的需求,这些基本就满足啦,嘿嘿。
参考博客:https://www.jianshu.com/p/d23f58f4368d