一. 帧动画
- 定义
逐帧动画(frame-by-frame animation), 是将一系列的图片按照特定的顺序依次播放来实现的
实现
- 首先是需要一定的frame素材了
- 将图片依次命名好, 然后放在
res\drawable
目录下- 创建.xml文件, 将动画文件依次放到
<animation-list><.../>
的<item ... />
标签中, 并设置持续时长- 在逻辑中通过
findviewById
的形式找到AnimationDrawable
控件, 并调用对应的start()
或stop()
方法, 来启动和停止动画
- 对应的
animation-list
文件
<?xml version="1.0" encoding="utf-8"?>
<animation-list xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/num801" android:duration="32"/>
<item android:drawable="@drawable/num802" android:duration="32"/>
<item android:drawable="@drawable/num803" android:duration="32"/>
......
<item ....../>
</animation-list>
- 布局文件
<ImageView
android:id="@+id/iv_num_frame"
android:layout_width="100dp"
android:layout_height="180dp"
android:background="@drawable/num_frame"
android:layout_marginBottom="30dp"/>
<Button
android:id="@+id/btn_star"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="15dp"
android:text="Start-Stop"
android:textSize="20dp"
android:textAllCaps="false"/>
- 主要逻辑
ImageView numFrame = findViewById(R.id.iv_num_frame);
AnimationDrawable anim = (AnimationDrawable) numFrame.getBackground();
Button btn = findViewById(R.id.btn_star);
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
anim.start();
}
});
二. 补间动画
- 定义
给动画设置起始值与结束值, 并设置对应的持续时间, Android自动将动画补全实现的技术 - 属性
透明度:alpha
旋转:rotate
缩放:scale
平移:translate
- 实现方法
1.在res
包下创建anim
包, 创建animation resource file
2.创建对应的.xml文件用于定义动画的各种属性
3.将不同的属性写在<set>...</set>
标签中, 并定义好对应的持续时间
4.在java逻辑中找到对应的控件, 通过AnimationUtils.loadAnimation()
方法来获取Animation
对象
5.通过获取到的控件的startAnimation()
方法来启动该动画对象 - 动画布局文件
创建文件目录res/anim
, 新建一个Animation Resource File
透明度
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<alpha
android:duration="3000"
android:fromAlpha="0"
android:toAlpha="1" />
</set>
旋转
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<rotate android:fromDegrees="0"
android:toDegrees="360"
android:pivotX="50%"
android:pivotY="50%" 旋转中心
android:duration="3000"/>
</set>
缩放
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<scale
android:duration="3000"
android:fromXScale="1"
android:fromYScale="1"
android:pivotX="50%"
android:pivotY="50%"
android:toXScale="0"
android:toYScale="0" />
</set>
移动
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate
android:duration="3000"
android:fromXDelta="0"
android:fromYDelta="0"
android:toXDelta="1200" />
</set>
- 动画使用逻辑
找到对应的控件, 直接调用startAnimation()
方法即可
ImageView tweetedImage = findViewById(R.id.iv_tweeted);
Button btnAlpha = findViewById(R.id.btn_alpha);
btnAlpha.setOnClickListener(view -> {
tweetedImage.startAnimation(R.anim.anim_alpha);
});
三. 属性动画
- ValueAnimator用于值改变的属性动画
使用方法:
1.创建ValueAnimator对象, 利用提供的接口进行所需属性值的设定
2.可以结合addUpdateListener()
来对动画执行期间的值进行一些操作
3.调用对应对象的.start()
方法来启动该条动画
具体逻辑
//寻找对应控件
TextView textValueAnimator = findViewById(R.id.tv_value_animator);
Button btnValueAnimator = findViewById(R.id.btn_value_animator);
//定义变化范围, 获取监听
ValueAnimator valueAnimator = ValueAnimator.ofFloat(0f, 10f);
valueAnimator.setDuration(5000);
valueAnimator.addUpdateListener(valueAnimator1 -> {
float animatedValue = (float) valueAnimator1.getAnimatedValue();
textValueAnimator.setText(String.valueOf(animatedValue));
});
//点击事件启动属性动画
btnValueAnimator.setOnClickListener(view -> valueAnimator.start());
- ObjectAnimator可以直接针对对象的属性动画
使用方法:
1.获取对象的实例, 通过接口定义作用对象, 属性性质, 属性变化范围
2.设置持续时间
3.调用对应的.start()
方法来启动该属性动画
4.该属性动画, 同样可以通过addListener()
设置对应的监听器, 当然通过适配器可以简化代码
具体实现
TextView textValueAnimator = findViewById(R.id.tv_value_animator);
ObjectAnimator objectAnimator = ObjectAnimator.ofFloat(textValueAnimator,"alpha",0f, 1f);
objectAnimator.setDuration(1000);
Button btnObjectAnimator = findViewById(R.id.btn_object_animator);
btnObjectAnimator.setOnClickListener(v -> {
objectAnimator.start();
});
objectAnimator.addListener(new Animator.AnimatorListener() {
@Override
public void onAnimationStart(Animator animation) {//动画开始}
@Override
public void onAnimationEnd(Animator animation) {//动画结束}
@Override
public void onAnimationCancel(Animator animation) {//动画取消}
@Override
public void onAnimationRepeat(Animator animation) {//动画重复执行}
});
objectAnimator.addListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationStart(Animator animation) {
super.onAnimationStart(animation);
//适配器只用实现需要的监听就可以, 简化了代码量
}
});
补充: 对象的不同属性性质, 可以在对应的类中查看有无相应的get/set
方法