Android补间动画
程序员文章站
2022-03-18 13:35:49
...
这篇文章简要介绍一些Android动画中的补间动画。补间动画有四种:旋转、透明度改变、伸缩变化、位移。具体的使用就是:在res文件夹下,新建一个anim文件夹。这个文件夹是放动画xml文件的文件夹。如何Java代码中通过 例如AnimationUtils.loadAnimation(this,R.anim.anim_alpha) 方式引入动画。还有一种用法就是直接在Java代码中通过animation的API来实例化动画。下面上代码加解析。
anim_alpha.xml
<?xml version="1.0" encoding="utf-8"?>
<!--nterpolator 控制动画的变化速度 有以下可供选择的实现类
LinearInterpolator:动画以均匀的速度改变
AccelerateInterpolator:在动画开始的地方改变速度较慢,然后开始加速
AccelerateDecelerateInterpolator:在动画开始、结束的地方改变速度较慢,中间时加速
CycleInterpolator:动画循环播放特定次数,变化速度按正弦曲线改变: Math.sin(2 * mCycles * Math.PI * input)
DecelerateInterpolator:在动画开始的地方改变速度较快,然后开始减速
AnticipateInterpolator:反向,先向相反方向改变一段再加速播放
AnticipateOvershootInterpolator:开始的时候向后然后向前甩一定值后返回最后的值
BounceInterpolator: 跳跃,快到目的值时值会跳跃,如目的值100,后面的值可能依次为85,77,70,80,90,100
OvershottInterpolator:回弹,最后超出目的值然后缓慢改变到目的值
这些类在Android已提供,xml文件中,在Interpolator加‘-’如@android:anim/overshoot_interpolator
fromAlpha 起始透明度(0-1:完全透明-不透明)
toAlpha 结束透明度
duration 持续时间
-->
<alpha xmlns:android="http://schemas.android.com/apk/res/android"
android:interpolator="@android:anim/overshoot_interpolator"
android:fromAlpha="1.0"
android:toAlpha="0.5"
android:duration="2000"
/>
anim_rotate.xml
<?xml version="1.0" encoding="utf-8"?>
<!--
fromDegrees 起始角度 toDegrees结束角度。结束角度如果为负值则逆时针旋转。
android:pivotX 缩放点的xy坐标。0%为X轴左边(Y轴上边),100%为X轴右边边(Y轴下边),
也可以是不在控件上的点(坐标不在0%-100%)。
坐标不是百分数时,单位为dp,参考物是控件的左边(X轴)、上边(Y轴),正方向为右(X轴)和下(Y轴)
android:repeatCount 旋转次数 0表示一次,1表示两次,类推。
android:repeatMode restart表示重复旋转,repeatCount大于0是有效。reverse表示偶数次反向旋转
-->
<rotate xmlns:android="http://schemas.android.com/apk/res/android"
android:interpolator="@android:anim/overshoot_interpolator"
android:fromDegrees="0"
android:toDegrees="360"
android:pivotX="-100"
android:pivotY="-100"
android:repeatCount="1"
android:repeatMode="reverse"
android:duration="2000"
/>
anim_scale.xml
<?xml version="1.0" encoding="utf-8"?>
<!--
android:fromXScale 沿着X轴缩放的起始比例
android:pivotX 缩放点的xy坐标。0%为X轴左边(Y轴上边),100%为X轴右边边(Y轴下边),
android:toXScale 缩放结束比例
-->
<scale xmlns:android="http://schemas.android.com/apk/res/android"
android:interpolator="@android:anim/overshoot_interpolator"
android:fromXScale="0.5"
android:fromYScale="0.5"
android:pivotX="0%"
android:pivotY="0%"
android:toXScale="1.5"
android:toYScale="1.5"
android:duration="2000"
/>
anim_translate.xml
<?xml version="1.0" encoding="utf-8"?>
<!--它属性的参照物是控件本身(X轴为控件坐标,Y轴位控件上边)
正数表示控件右边(下边),参数如果是非百分数则是dp为单位,如果是百分数则是以自身长宽为单位。
android:fromXDelta X轴起始位置
android:toYDeltaY轴结束位置
android:fromXDelta="1"距控件左边1dp正方向的位置开始移动
android:toXDelta="100%" 移动到与控件距离为整个控件长度的地方
android:toXDelta="100%p" 移动到与控件距离为整个父View长度的地方
-->
<translate xmlns:android="http://schemas.android.com/apk/res/android"
android:interpolator="@android:anim/overshoot_interpolator"
android:fromXDelta="10"
android:fromYDelta="0"
android:toXDelta="100%"
android:toYDelta="0"
android:duration="2000"
/>
主活动:
public class MainActivity extends AppCompatActivity implements View.OnClickListener{
Button rotate;
Button alpha;
Button scale;
Button translate;
TextView textView;
Animation animation;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initview();
}
public void initview(){
rotate= (Button) findViewById(R.id.button1);
alpha= (Button) findViewById(R.id.button2);
scale= (Button) findViewById(R.id.button3);
translate= (Button) findViewById(R.id.button4);
textView= (TextView) findViewById(R.id.textview);
rotate.setOnClickListener(this);
alpha.setOnClickListener(this);
scale.setOnClickListener(this);
translate.setOnClickListener(this);
}
public void animatonlisten(){
//动画的监听
animation.setAnimationListener(new Animation.AnimationListener() {
@Override
public void onAnimationStart(Animation animation) {
//动画开始时调用
}
@Override
public void onAnimationEnd(Animation animation) {
Toast.makeText(MainActivity.this,"动画结束",Toast.LENGTH_SHORT).show();
}
@Override
public void onAnimationRepeat(Animation animation) {
//动画重复执行时调用
}
});
}
@Override
public void onClick(View v) {
switch (v.getId()){
case R.id.button1:
//javacode方式
animation=new RotateAnimation(0,360,-100,-100);
animation.setDuration(2000);
animation.setFillAfter(true);
//xml方式
//animation= AnimationUtils.loadAnimation(this,R.anim.anim_rotate);
textView.startAnimation(animation);
animatonlisten();
break;
case R.id.button2:
//javacode方式
animation=new AlphaAnimation((float) 1.0,(float) 0.5);
animation.setDuration(2000);
//xml方式
//animation= AnimationUtils.loadAnimation(this,R.anim.anim_alpha);
textView.startAnimation(animation);
animatonlisten();
break;
case R.id.button3:
//javacode
animation=new ScaleAnimation((float) 0.5,(float) 1.5,(float) 0.5,(float) 1.5);
animation.setDuration(2000);
//xml方式
//animation= AnimationUtils.loadAnimation(this,R.anim.anim_scale);
textView.startAnimation(animation);
animatonlisten();
break;
case R.id.button4:
//javacode
animation=new TranslateAnimation(0,100,0,100);
animation.setDuration(2000);
//xml方式
//animation= AnimationUtils.loadAnimation(this,R.anim.anim_translate);
textView.startAnimation(animation);
animatonlisten();
break;
}
}
}
上述代码应用了xml和Javacode方式来使用补间动画,然后还实现了动画的监听。运行之后你会发现一个问题,执行动画效果的控件,在执行完动画效果后又回到了原来的位置。那么如何让它停在动画结束的位置呢?只需要一行代码:animation.setFillAfter(true)给animation设置这个属性后,就可以了。
但是补间动画有一个最大的缺陷,执行动画的控件只是表层执行了动画或者说就是绘制了动画而已,其在布局中实际的位置并没有变。例如:我将一个按钮从底部移动到顶部,然后我点击顶部的按钮不会触发按钮的事件,而点击底部按钮本来的位置会触发点击事件。那么如何让控件也跟着移动呢?这就要用到属性动画了。
关于补间动画的更多知识,请查阅文档 http://www.android-doc.com/reference/android/view/animation/Animation.html
推荐阅读
-
使用tween.js实现缓动补间动画算法
-
一看就喜欢的loading动画效果Android分析实现
-
Android实现卡片翻转动画
-
Android属性动画Property Animation系列一之ObjectAnimator_html/css_WEB-ITnose
-
Android Parcelable序列化自定义类集合在Activity间传递
-
Android自定义view绘制圆环占比动画
-
Android逐帧动画实现代码
-
Android动画之渐变动画(Tween Animation)详解 (渐变、缩放、位移、旋转)
-
Android动画之补间动画(Tween Animation)实例详解
-
Android动画之逐帧动画(Frame Animation)实例详解