引言
学习完上一篇Android 开发】补间动画(Tween animation)详解,我们最后来学习属性动画。
内容简概
一、概念及常用方法
二、实战案例
三、运行效果
具体内容
一、概念及常用方法
你可能会有这样的疑问:为什么要引入属性动画?属性动画是什么?
(一)ValueAnimation
看完文章相信你肯定对属性动画有了初步的了解,一般使用ValueAnimator实现动画
分为以下七个步骤:
使用步骤 |
---|
1. 调用ValueAnimation类中的ofInt、ofFloat等静态方法实例化ValueAnimator对象,并设置目标属性的属性名、初始值或结束值等值。 |
2. 调用addUpdateListener方法设置属性变化的监听器。 |
3. 创建自定义的Interpolator,调用setInterpolator设置自定义的Interpolator。 |
4. 创建自定义的TypeEvaluator,调用setEvaluator设置自定义的TypeEvaluator。 |
5. 在AnimatorUpdateListener 中的实现方法为目标对象的属性设置计算好的属性值。 |
6. 设置动画的持续时间、是否重复及重复次数等属性。 |
7. 设置目标对象并启动动画。 |
(二)ObjectAnimation
在大部分的开发工作中,都会使用ObjectAnimator而非ValueAnimator实现我们所需的动画效果。ObjectAnimator是ValueAnimator的子类,不仅继承了ValueAnimator的所有方法和特性,并且还封装很多实用的方法
,方便开发人员快速实现动画。同时,由于属性值会自动更新,使用ObjectAnimator实现动画不需要像ValueAnimator那样必须实现ValueAnimator.AnimatorUpdateListener 。
使用步骤 |
---|
1. 通过调用ofFloat()、ofInt()等方法创建ObjectAnimator对象,并设置目标对象、需要改变的目标属性名、初始值和结束值; |
2. 设置动画的持续时间、是否重复及重复次数等属性; |
3. 启动动画。 |
(三)属性
系统属性 |
---|
alpha |
scaleX |
scaleY |
translationX |
translationY |
自定义属性必须实现set get方法 |
二、实战案例
(一)ValueAnimation
它有两个子类,分别是TimeAnimator和ObjectAnimator,在此主要介绍它的子类ObjectAnimator。
ValueAnimation案例
(二)ObjectAnimator——实现透明度、旋转、平移、缩放动画
1. 准备一张图片或者直接在xml中设置有颜色的形状。
2. 首先配置布局文件,这次就不写Button控件了(懒)。
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<ImageView
android:id="@+id/v"
android:layout_width="200dp"
android:layout_height="200dp"
android:layout_centerInParent="true"
android:background="@drawable/homework"/>
</RelativeLayout>
3. MainActivity
通过改变调用的方法观察不同的动画。
public class MainActivity extends AppCompatActivity {
View v;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
v = findViewById(R.id.v);
}
// 透明度
public void test1(){
ObjectAnimator alphyAni = ObjectAnimator.ofFloat(v,"alpha",1,0);
alphyAni.setDuration(1000);
alphyAni.start();
}
// 旋转
public void test2(){
ObjectAnimator rotateAni = ObjectAnimator.ofFloat(v,"rotation",0,360);
rotateAni.setDuration(1000);
rotateAni.start();
}
public void test3(){
ObjectAnimator scaleAni = ObjectAnimator.ofFloat(v,"scaleX",1,2.1f,1,2.1f,1);
scaleAni.setDuration(1000);
scaleAni.start();
// ObjectAnimator scaleAni2 = ObjectAnimator.ofFloat(v,"scaleY",1,2.3f,1,2.3f,1);
// scaleAni2.setDuration(1000);
// scaleAni2.start();
// 同时动画
// AnimatorSet aSet = new AnimatorSet();
// aSet.playTogether(scaleAni,scaleAni2);
// aSet.play(scaleAni).after(scaleAni2);
// aSet.start();
}
// 平移
public void test4(){
ObjectAnimator transAnim = ObjectAnimator.ofFloat(v,"translationX",v.getTranslationX()+100);
transAnim.setDuration(1000);
transAnim.start();
}
@Override
public boolean onTouchEvent(MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_DOWN){
test3();
}
return true;
}
}
4. 我写的实战比较简单了,可以看下面的几篇拓展文章:
三、运行效果
-
旋转
-
平移
-
透明度
-
缩放
-
组合(先后)
-
组合(同时)