安卓动画之补间动画

醉酒当歌 提交于 2020-02-26 12:20:47

补间动画

1.作用对象

安卓视图控件(view)

2.效果

1.平移动画:对应TranslateAnimation类
2.缩放动画:对应ScaleAnimation类
3.旋转动画:对应RotateAnimation类
4.透明度动画:对应AlphaAnimation类

3.具体使用

使用方式

首先介绍在xml文件中设置动画效果的公有属性

android:duration = "3000"  动画持续时间(ms)
android:startOffset = "0"  动画延迟开始时间(ms)
android:fillBefore = "true"  动画播放完后,视图是否会停留在动画开始的状态,默认为true
android:fillAfter = "false"  动画播放完后,视图是否会停留在动画结束的状态,优先于fillBefore值,默认为false
android:fillEnabled = "true"  是否应用fillBefore值,对fillAfter值无影响,默认为true
android:repeatMode = "restart"   选择重复播放动画模式,restart代表正序重放,reverse代表倒序回放,默认为restart
android:repeatCount = "1"  重放次数(所以动画的播放次数=重放次数+1),为infinite时无限重复

以上是在xml文件中设置动画的共有属性,其中第一个必须设置,否则不会出现动画效果,其他都是可选的

xml文件中设置:

在res/anim文件目录下创建xml文件,即为动画效果的文件,如果没有anim文件夹,则需要自行创建一个目录。,接着在创建的xml文件中使用共有属性以及自身的特有属性

代码中动态设置:

在创建动画对象时,设置自身的特有属性,想使用共有属性时,在上面的属性前加上“set”即可,例如translateAnimation.setDuration(3000);便是设置了android:duration = "3000"

使用介绍
1.1平移动画(xml)

特有属性

android:fromXDelta = "0"  起始x位置
android:toXDelta = "800"  结束x位置
android:fromYDelta = "0"  起始y位置
android:toYDelta = "800"  结束y位置

示例
xml文件

<?xml version="1.0" encoding="utf-8"?>
<!--采用translate标签表示平移动画-->
<!--前面部分是共有属性,后四个是平移动画特有属性-->
<translate xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration = "3000"
    android:startOffset = "0"
    android:fillBefore = "true"
    android:fillAfter = "false"
    android:fillEnabled = "true"
    android:repeatMode = "restart"
    android:repeatCount = "0"

    android:fromXDelta = "0"
    android:toXDelta = "800"
    android:fromYDelta = "0"
    android:toYDelta = "800"
    />

Activity

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
       //创建需要设置动画的视图
        Button button = findViewById(R.id.translate);
        //创建动画对象,并传入设置的动画效果xml文件
        Animation translateAnimation = AnimationUtils.loadAnimation(this, R.anim.view_animation);
        //播放动画
        button.startAnimation(translateAnimation);
        setContentView(R.layout.activity_main);
    }
1.2平移动画(代码动态设置)
@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main2);
        //创建需要设置动画的视图
        Button translateButton = findViewById(R.id.translate);
        //创建平移动画的对象:平移动画对应的Animation子类为TranslateAnimation
        Animation translateAnimation = new TranslateAnimation(0, 500, 0, 500);
        //anim中固定属性值前加“set”,设置共有属性
        translateAnimation.setDuration(3000);
        //播放动画
        translateButton.startAnimation(translateAnimation);
    }
2.1缩放动画(xml)

特有属性

    android:fromXScale="0.5"  表示动画在水平方向X的起始缩放倍数
    android:toXScale="1.5"  表示动画在水平方向X的结束缩放倍数
    android:fromYScale="0.5" 表示动画在水平方向Y的起始缩放倍数
    android:toYScale="1.5"  表示动画在水平方向Y的结束缩放倍数
    android:pivotX="30%"
    android:pivotY="30%"
    />
<!--0.0表示收缩到没有;1.0表示正常无伸缩;大于1.0表示放大-->
<!--pivot可取值为数字,百分比,或者百分比p
设置数字时,轴点为View的左上角的原点在x和y方向加上设置数字dp的值的点。
设置为百分比时,轴点为View的左上角的原点在x和y方向分别加上自身xy乘设置百分比的点。
设置为百分比p时,轴点为View的左上角的原点在x和y方向分别加上父控件xy乘设置百分比的点。
-->

示例
xml文件

<?xml version="1.0" encoding="utf-8"?>
<!--采用scale标签表示缩放动画-->
<!--前面部分是共有属性,后六个是平移动画特有属性-->
<scale xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration = "3000"
    android:startOffset = "0"
    android:fillBefore = "true"
    android:fillAfter = "false"
    android:fillEnabled = "true"
    android:repeatMode = "restart"
    android:repeatCount = "0"
    android:interpolator = "@android:anim/overshoot_interpolator"

    android:fromXScale="0.5"
    android:toXScale="1.5"
    android:fromYScale="0.5"
    android:toYScale="1.5"
    android:pivotX="30%"
    android:pivotY="30%"
    />

Activity

Button scaleButton = findViewById(R.id.scale);
Animation scaleAnimation = AnimationUtils.loadAnimation(this, R.anim.scale_animation);
scaleButton.startAnimation(scaleAnimation);
2.2缩放动画(代码动态设置)
Button scaleButton = findViewById(R.id.scale);
//参数:起始x缩放倍数,结束x缩放倍数,起始y缩放倍数,结束y缩放倍数,轴点x坐标,轴点y坐标
//缩放倍数等于1,正常;小于1,缩放;大于1,放大;
//Animation.RELATIVE_TO_SELF对应xml文件中pivot的百分比
//Animation.ABSOLUTE对应xml文件中pivot的数字
//Animation.RELATIVE_TO_PARENT对应xml文件中pivot的百分比p
Animation scaleAnimation = new ScaleAnimation(0.5f, 1.5f, 0.5f, 1.5f,
        Animation.RELATIVE_TO_SELF, 0.3f, Animation.RELATIVE_TO_SELF, 0.3f);
scaleAnimation.setDuration(3000);
scaleButton.startAnimation(scaleAnimation);
3.1旋转动画(xml)

特有属性

    android:fromDegrees="0"  动画开始时,视图的旋转角度(正数顺时针;负数逆时针)
    android:toDegrees="360"  动画结束时,视图的旋转角度(正数顺时针;负数逆时针)
    android:pivotX="50%"  旋转轴点的x坐标
    android:pivotY="50%"  旋转轴点的y坐标
    />
<!-- pivot可取值为数字,百分比,或者百分比p
    设置数字时,轴点为View的左上角的原点在x和y方向加上设置数字dp的值的点。
    设置为百分比时,轴点为View的左上角的原点在x和y方向分别加上自身xy乘设置百分比的点。
    设置为百分比p时,轴点为View的左上角的原点在x和y方向分别加上父控件xy乘设置百分比的点。
-->

示例
xml文件

<?xml version="1.0" encoding="utf-8"?>
<!--采用rotate标签表示旋转动画-->
<!--前面部分是共有属性,后四个是平移动画特有属性-->
<rotate xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration = "3000"
    android:startOffset = "0"
    android:fillBefore = "true"
    android:fillAfter = "false"
    android:fillEnabled = "true"
    android:repeatMode = "restart"
    android:repeatCount = "0"

    android:fromDegrees="0"
    android:toDegrees="360"
    android:pivotX="50%"
    android:pivotY="50%"
    />

Activity

Button rotateButton = findViewById(R.id.rotate);
Animation rotateAnimation = AnimationUtils.loadAnimation(this, R.anim.rotate_animation);
rotateButton.startAnimation(rotateAnimation);
3.2旋转动画(代码动态设置)
 Button rotateButton = findViewById(R.id.rotate);
        //参数:起始角度,结束角度,轴点的x坐标,轴点的y坐标
        //Animation.RELATIVE_TO_SELF对应xml文件中pivot的百分比
        //Animation.ABSOLUTE对应xml文件中pivot的数字
        //Animation.RELATIVE_TO_PARENT对应xml文件中pivot的百分比p
        Animation rotateAnimation = new RotateAnimation(0, 360,
                Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
        rotateAnimation.setDuration(3000);
        rotateButton.startAnimation(rotateAnimation);
4.1透明度动画(xml)

特有属性

android:fromAlpha="1.0"  动画开始时视图的透明度(取值范围-1~1)
android:toAlpha="0.0"  toAlpha:动画结束时视图的透明度(取值范围-1~1

示例
xml文件

<?xml version="1.0" encoding="utf-8"?>
<!--采用alpha标签表示透明度动画-->
<!--前面部分是共有属性,后两个是平移动画特有属性-->
<alpha xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration = "3000"
    android:startOffset = "0"
    android:fillBefore = "true"
    android:fillAfter = "false"
    android:fillEnabled = "true"
    android:repeatMode = "restart"
    android:repeatCount = "0"

    android:fromAlpha="1.0"
    android:toAlpha="0.0"
    />

Activity

Button alphaButton = findViewById(R.id.alpha);
Animation alphaAnimation = AnimationUtils.loadAnimation(this, R.anim.alpha_animation);
alphaButton.startAnimation(alphaAnimation);
4.2透明度动画(代码动态设置)
Button alphaButton = findViewById(R.id.alpha);
        //参数:起始和结束的透明度。取值范围-1~1
        Animation alphaAnimation = new AlphaAnimation(1,0);
        alphaAnimation.setDuration(3000);
        alphaButton.startAnimation(alphaAnimation);
5.1组合动画(xml)

示例
xml文件

<?xml version="1.0" encoding="utf-8"?>
<!--采用set标签表示组合动画-->
<!--前面部分是共有属性,后一个是平移动画特有属性-->
<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration = "3000"
    android:startOffset = "0"
    android:fillBefore = "true"
    android:fillAfter = "false"
    android:fillEnabled = "true"
    android:repeatMode = "restart"
    android:repeatCount = "0"

    android:shareInterpolator="true">

    <rotate
        android:duration="1000"
        android:fromDegrees="0"
        android:toDegrees="360"
        android:pivotX="50%"
        android:pivotY="50%"
        android:repeatMode="restart"
        android:repeatCount="infinite" />

    <translate
        android:duration="10000"
        android:startOffset = "1000"
        android:fromXDelta="-50%p"
        android:fromYDelta="0"
        android:toXDelta="50%p"
        android:toYDelta="0" />

    <alpha
        android:startOffset="7000"
        android:duration="3000"
        android:fromAlpha="1.0"
        android:toAlpha="0.0" />

    <scale
        android:startOffset="4000"
        android:duration="1000"
        android:fromXScale="1.0"
        android:fromYScale="1.0"
        android:pivotX="50%"
        android:pivotY="50%"
        android:toXScale="0.5"
        android:toYScale="0.5" />
</set>

<!--shareInterpolator表示组合动画是否和集合共享一个插值器,如果集合不指定插值器,那么子动画需要单独设置
组合动画播放时是全部动画同时开始,若想不同的动画在不同时间开始,需分别设定延迟时间-->

Activity

Button animationButton = findViewById(R.id.animation);
        Animation animation = AnimationUtils.loadAnimation(this, R.anim.animation);
        animationButton.startAnimation(animation);
5.2组合动画(代码动态设置)
//创建视图对象
        Button animationButton = findViewById(R.id.animation);
        //创建动画对象
        AnimationSet animation = new AnimationSet(true);
        //设置组合属性
        animation.setRepeatMode(Animation.RESTART);
        animation.setRepeatCount(1);//由于旋转动画设置了无限循环,所以该语句循环一次,无效
        //设置子动画:平移动画
        Animation translate = new TranslateAnimation(TranslateAnimation.RELATIVE_TO_PARENT,-0.5f,
                TranslateAnimation.RELATIVE_TO_PARENT,0.5f,
                TranslateAnimation.RELATIVE_TO_SELF,0
                ,TranslateAnimation.RELATIVE_TO_SELF,0);
        translate.setDuration(10000);
        //设置子动画:缩放动画
        Animation scale1 = new ScaleAnimation(1,0.5f,1,0.5f,Animation.RELATIVE_TO_SELF,0.5f,Animation.RELATIVE_TO_SELF,0.5f);
        scale1.setDuration(1000);
        scale1.setStartOffset(4000);
        //设置子动画:旋转动画
        Animation rotate = new RotateAnimation(0,360,Animation.RELATIVE_TO_SELF,0.5f,Animation.RELATIVE_TO_SELF,0.5f);
        rotate.setDuration(1000);
        rotate.setRepeatMode(Animation.RESTART);
        rotate.setRepeatCount(Animation.INFINITE);//表示无限循环
        //设置子动画:透明度动画
        Animation alpha = new AlphaAnimation(1,0);
        alpha.setDuration(3000);
        alpha.setStartOffset(7000);
        //将子动画添加到组合动画
        animation.addAnimation(translate);
        animation.addAnimation(scale1);
        animation.addAnimation(rotate);
        animation.addAnimation(alpha);
        animationButton.startAnimation(animation);

4.应用场景

在activity进行启动,跳转,退出时使用
Intent intent = new Intent(MainActivity.this, Main2Activity.class);
startActivity(intent);
//参数:enterAnim,exitAnim
// enterAnim:从Activity a跳转到Activity b,进入b时的动画效果资源ID
// exitAnim:从Activity a跳转到Activity b,离开a时的动画效果资源Id
overridePendingTransition(R.anim.translate_animation, R.anim.rotate_animation);
//系统自带的enterAnim,exitAnim资源ID为android.R.anim.xxx
//overridePendingTransition(android.R.anim.fade_in, android.R.anim.fade_out);//淡入淡出
//overridePendingTransition(android.R.anim.slide_in_left, android.R.anim.slide_out_right);//从左向右
//overridePendingTransition()必须要在startActivity(intent)后被调用才能生效
Fragment切换时使用
FragmentTransaction fragmentTransaction = mFragmentManager.beginTransaction();
//setTransition(int transit)进行设置系统动画
fragmentTransaction.setTransition(int transit)// transit参数说明
// 1. FragmentTransaction.TRANSIT_NONE:无动画
// 2. FragmentTransaction.TRANSIT_FRAGMENT_OPEN:标准的打开动画效果
// 3. FragmentTransaction.TRANSIT_FRAGMENT_CLOSE:标准的关闭动画效果

//etCustomAnimations进行设置自定义动画
//fragmentTransaction.setCustomAnimations(R.anim.translate_animation,R.anim.rotate_animation);

以上内容皆为参考Carson_Ho大神的博客,自己看着博客进行操作过一遍,目前我也是在学习,有错误或看不懂的,请参看大神原文,附上大神原文链接

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!