Android--Tweened Animations介绍

xiaoxiao2021-02-27  415

1、简介

Animations是一个实现android UI界面动画效果的API,Animations提供了一系列的动画效果,可以进行旋转、缩放、淡入淡出等,这些效果可以应用在绝大多数的控件中。

Animations从总体上可以分为两大类:

Tweened Animations(渐变动画):该类Animations提供了旋转、移动、伸展和淡出等效果。Alpha——淡入淡出,Scale——缩放效果,Rotate——旋转,Translate——移动效果。Frame-by-frame Animations(画面转换动画) :这一类Animations可以创建一个Drawable序列,这些Drawable可以按照指定的时间间歇一个一个的显示。

至于 LayoutAnimation(布局动画) 和 Property Animation(属性动画)就不在这里提啦。

2、TweenedAnimations

使用TweenedAnimations的步骤:

创建一个AnimationSet对象(Animation子类)增加需要创建相应的Animation对象更据项目的需求,为Animation对象设置相应的数据将Animatin对象添加到AnimationSet对象当中使用控件对象开始执行AnimationSet

可根据需求是否使用 AnimationSet,若只有一种动画,直接使用Animation对象去执行也可以。

在XML文件中定义动画:

在res目录中新建anim文件夹在anim目录中新建一个my_anim.xml(注意文件名小写)在 my_anim.xml 加入代码 <?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android" > <alpha /> <scale /> <translate /> <rotate /> </set>

这就是各种动画标签,当然,alpha这些同样可以做根节点。

Tweened Animations的分类:

动画使用的类Xml标签动画的效果AlphaAnimation<alpha/>渐变透明度动画效果ScaleAnimation<scale/>渐变尺寸缩放动画效果RotateAnimation<rotate/>画面旋转动画效果TranslateAnimation<translate/>画面位置移动动画效果

Tween Animations的通用方法:

  1、setDuration(long durationMills) 设置动画持续时间(单位:毫秒)   2、setFillAfter(Boolean fillAfter) 如果fillAfter的值为true,则动画执行后,控件将停留在执行结束的状态   3、setFillBefore(Boolean fillBefore) 如果fillBefore的值为true,则动画执行后,控件将回到动画执行之前的状态   4、setInterpolator(Interpolator i) 动画插入器(加速、减速插入器),大家可以看我的博客Android动画–Interpolator的介绍 。      5、setStartOffSet(long startOffSet) 设置动画执行之前的等待时间    6、setRepeatCount(int repeatCount) 设置动画重复执行的次数    7、setRepeatMode(int repeatMode) 设置顺序重复或倒序重复

1、AlphaAnimation

控制对象alpha水平的动画。这个动画可以通过改变alpha属性,达到渐进渐出的效果。

1、构造方法:

AlphaAnimation(float fromAlpha, float toAlpha) AlphaAnimation anim = new AlphaAnimation(0.0f, 1.0f); //从0.01f到1.0f渐变。0.0是完全透明,1.0完全不透明。

2、设置动画持续时间:

anim.setDuration(3000);

3、为控件绑定动画效果:

imageView.setAnimation(anim);

4、开始动画:

anim.start();

如果要从 xml 文件中将动画效果添加到View上也只需要一行代码:

imageView.startAnimation(AnimationUtils.loadAnimation(this, R.anim.my_anim));

如果需要重用这个动画,也可以将其抽离出来。以下代码将AlphaAnimation抽离后的代码可以如下:

AlphaAnimation animation = (AlphaAnimation) AnimationUtils.loadAnimation(this, R.anim.my_anim); imageView.startAnimation(animation);

想要了解 xml alpha标签的各个属性,可以看我的博客Android–各种标签介绍,里面有对 alpha 介绍,这里就不提啦。

在代码中使用 Animation 可以很方便的调试、运行,但是代码的可重用性差,重复代码多。同样可以在xml文件中配置 Animation,这样做可维护性变高了,只不过不容易进行调试。

2、ScaleAnimation

该动画是为用作控制对象缩放比例,达到渐变尺寸缩放动画效果。

构造方法:

ScaleAnimation(float fromX, float toX, float fromY, float toY,); //fromX,toX 分别是起始和结束时x坐标上的伸缩尺寸。 //fromY,toY 分别是起始和结束时y坐标上的伸缩尺寸。 ScaleAnimation(float fromX, float toX, float fromY, float toY, float pivotX, float pivotY) //pivotX,pivotY分别是伸缩动画相对于 x,y 坐标开始的位置。 ScaleAnimation(float fromX, float toX, float fromY, float toY, int pivotXType, float pivotXValue, int pivotYType, float pivotYValue) //pivotXType 动画在X轴相对于物件位置类型(可以取值为ABSOLUTE、RELATIVE_TO_SELF、RELATIVE_TO_PARENT) //pivotXValue 动画相对于物件的X坐标的开始位置 //pivotYType 动画在Y轴相对于物件位置类型 //pivotYValue 动画相对于物件的Y坐标的开始位置 ScaleAnimation animation =new ScaleAnimation(0, 1, 0, 1, Animation.RELATIVE_TO_PARENT, 0.5f, Animation.RELATIVE_TO_PARENT, 0.5f); imageView.setAnimation(animation); animation.setDuration(3000); animation.start();

之所以会移动就是因为 pivotXtype 这样的属性啦,我们设置的是Animation.RELATIVE_TO_PARENT并且值为0.5f,就会以父控件的中心去进行缩放动画啦,而这个中心不是指这个页面的中心,而是从这个view以下剩余的空间的中心,它会从这个点移动到原来的位置。

如果设置成Animation.RELATIVE_TO_SELF:

ScaleAnimation animation1 = new ScaleAnimation(0, 1, 0, 1, Animation.RELATIVE_TO_SELF, 0.0f, Animation.RELATIVE_TO_SELF, 0.5f);

就会与使用pivotX,pivotY类似的效果。

3、RotateAnimation

该动画是为用作控制旋转,达到画面旋转动画效果。

构造方法:

RotateAnimation(float fromDegrees, float toDegrees) //fromDegrees:旋转的开始角度。 //toDegrees:旋转的结束角度。 RotateAnimation(float fromDegrees, float toDegrees, float pivotX, float pivotY) //pivotX,pivotY:旋转的中心点相对于开始x,y坐标的位置 RotateAnimation (float fromDegrees, float toDegrees, int pivotXType, float pivotXValue, int pivotYType, float pivotYValue) //pivotXType:X轴的伸缩模式,可以取值为ABSOLUTE、RELATIVE_TO_SELF、RELATIVE_TO_PARENT。 //pivotXValue:X坐标的伸缩值。 //pivotYType:Y轴的伸缩模式 //pivotYValue:Y坐标的伸缩值。 RotateAnimation animation = new RotateAnimation(0f,360f, Animation.RELATIVE_TO_SELF, 0.5f,Animation.RELATIVE_TO_SELF,0.5f); animation.setDuration(3000); imageView.setAnimation(animation); animation.start();

4、TranslateAnimation

该动画是为用作控制位置移动,达到画面位置移动动画效果。

构造方法:

TranslateAnimation(float fromXDelta, float toXDelta, float fromYDelta, float toYDelta) //fromXDelta 动画开始的点离当前View X坐标上的差值 //toXDelta 动画结束的点离当前View X坐标上的差值 //fromYDelta 动画开始的点离当前View Y坐标上的差值 //toYDelta 动画开始的点离当前View Y坐标上的差值 TranslateAnimation(int fromXType, float fromXValue, int toXType, float toXValue, int fromYType, float fromYValue, int toYType, float toYValue) //fromXType 动画开始时在X轴相对于物件位置类型(可以取值为ABSOLUTE、RELATIVE_TO_SELF、RELATIVE_TO_PARENT) //fromXValue 动画开始时相对于物件的X坐标的开始位置 //toXType 动画结束时在X轴相对于物件位置类型 //toXValue 动画结束时相对于物件的X坐标的开始位置 //fromYType 动画开始时在Y轴相对于物件位置类型 //fromYValue 动画开始时相对于物件的Y坐标的开始位置 //toYType 动画结束时在Y轴相对于物件位置类型 //toYValue 动画结束时相对于物件的Y坐标的开始位置 TranslateAnimation animation = new TranslateAnimation(0, 100, 0, 300); animation.setDuration(1000); animation.setRepeatCount(2); animation.setRepeatMode(Animation.REVERSE); imageView.setAnimation(animation); animation.start();

5、动画监听

AnimationListener就是 Animation的监听接口。

final RotateAnimation animation1 = new RotateAnimation(0f,360f, 50.0f, 50.0f); animation1.setDuration(3000); final TranslateAnimation animation2 = (TranslateAnimation) AnimationUtils.loadAnimation(this, R.anim.traslate); imageView.startAnimation(animation1); animation1.setAnimationListener(new Animation.AnimationListener() { @Override public void onAnimationStart(Animation animation) { } @Override public void onAnimationEnd(Animation animation) { imageView.startAnimation(animation2); } @Override public void onAnimationRepeat(Animation animation) { } });

AnimationListener 会让我们重写三个方法,分别是开始的时候调用,完成的时候调用,重复的时候调用。

translate 是我写得一个 anim Xml,代码如下:

<?xml version="1.0" encoding="utf-8"?> <translate xmlns:android="http://schemas.android.com/apk/res/android" android:duration="2000" android:fromXDelta="-100%" android:fromYDelta="0" android:toXDelta="100%p" android:toYDelta="0" />

6、AnimationSet

上面四种动画就是 Tweened Animations 的主要动画,但在开发的时候,我们并不是只单独的使用它们中的某一种,我们也会把它们组合起来使用,这时候有两种方法,第一种就是上面所用的 AnimationListener,在一个动画结束后去开始另一个,不过这种方式不能将几种动画的效果叠加在一起。第二种就是使用动画集 AnimationSet 啦。

构造方法:

AnimationSet(boolean shareInterpolator) //true表示使用Animation的interpolator,false则是使用自己的,默认为LinearInterpolator。

要想实现和 AnimationListener 一样的效果,只要为第二个动画设置startOffset,值为前一个动画播放的时间即可。

AnimationSet as = new AnimationSet(true); RotateAnimation animation1 = new RotateAnimation(0f,360f, 50.0f, 50.0f); animation1.setDuration(3000); ranslateAnimation animation2 = (TranslateAnimation) AnimationUtils.loadAnimation(this, R.anim.traslate); animation2.setStartOffset(3000); as.addAnimation(animation1); as.addAnimation(animation2); imageView.startAnimation(as);

但因为是动画开始播放的间隔,所以开始前设置的如起始点的位置是会被后面的动画所覆盖的。

AnimationSet as = new AnimationSet(true); RotateAnimation animation1 = new RotateAnimation(0f,360f, 50.0f, 50.0f); animation1.setRepeatCount(1); animation1.setDuration(3000); ScaleAnimation animation2 = new ScaleAnimation(1,3,1,3); animation2.setDuration(3000); ScaleAnimation animation3 = new ScaleAnimation(1f,1/3f,1f,1/3f); animation3.setDuration(3000); animation3.setStartOffset(3000); as.addAnimation(animation1); as.addAnimation(animation2); as.addAnimation(animation3); imageView.startAnimation(as);

7、Activity切换动画

Activity的切换动画指的是从一个activity跳转到另外一个activity时的动画。

它包括两个部分:

Activity退出时的动画;Activity进入时的动画;

overridePendingTransition 就是提供给我们实现这个动画的函数。

overridePendingTransition(int enterAnim, int exitAnim) //enterAnim 定义Activity进入屏幕时的动画 //exitAnim 定义Activity退出屏幕时的动画

关于overridePendingTransition这个函数,它必须紧挨着startActivity()或者finish()函数之后调用。

这里写一个例子,先写好进入和退出的两个动画:

<!-- res/anim/zoom_in.xml--> <?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android" android:interpolator="@android:anim/decelerate_interpolator" > <scale android:duration="1000" android:fromXScale="0.1" android:fromYScale="0.1" android:pivotX="50%" android:pivotY="50%" android:toXScale="1.0" android:toYScale="1.0" /> <alpha android:duration="1000" android:fromAlpha="0" android:toAlpha="1.0" /> </set> <!-- res/anim/zoom_out.xml--> <?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android" android:interpolator="@android:anim/decelerate_interpolator" android:zAdjustment="top"> <scale android:duration="500" android:fromXScale="1.0" android:fromYScale="1.0" android:pivotX="50%p" android:pivotY="50%p" android:toXScale="0.1" android:toYScale="0.1" /> <alpha android:duration="500" android:fromAlpha="1.0" android:toAlpha="0" /> </set>

这两个都是很简单的组合动画,就是Activity在退出的时候会整个缩小并变透明,在进入的时候会放大并变得不透明。

public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Button button = (Button) findViewById(R.id.button); button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(MainActivity.this, MainActivity2.class); startActivity(intent); overridePendingTransition(R.anim.zoom_in, R.anim.zoom_out); } }); } }

而第二个Activity只有一张图片充当背景。

3、FrameAnimations 

Frame动画,即事先播放先做好的图像,跟放胶片电影类似,开发步骤: (1)把准备好的图片放进项目res/ drawable下。 (2)在项目的res目录下创建文件夹anim,然后在anim文件夹下面定义动画XML文件,文件名称可以自定义。当然也可以采用编码方式定义动画效果(使用AnimationDrawable类)。 (3)为View控件绑定动画效果。调用代表动画的AnimationDrawable的start()方法开始动画。

这里也只是介绍下步骤,因为在我的博客Android–Drawable标签介绍和Android–各种Drawable介绍已经有很详细的介绍啦,有兴趣的可以去看。

结束语:本文仅用来学习记录,参考查阅。

转载请注明原文地址: https://www.6miu.com/read-815.html

最新回复(0)