【达内课程】Android中的动画(下)

帧动画

帧动画:多张图片在很短的时间内连续播放达到的动画效果。

我们来实现以下效果:
在这里插入图片描述

在 drawable 下新建一个 fragme.xml 文件

<?xml version="1.0" encoding="utf-8"?>
<animation-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@mipmap/wifi0" android:duration="200"/>
    <item android:drawable="@mipmap/wifi1" android:duration="200"/>
    <item android:drawable="@mipmap/wifi2" android:duration="200"/>
    <item android:drawable="@mipmap/wifi3" android:duration="200"/>
    <item android:drawable="@mipmap/wifi4" android:duration="200"/>
    <item android:drawable="@mipmap/wifi5" android:duration="200"/>
</animation-list>

图片素材:
在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述
主布局 activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center"
    android:orientation="vertical">

    <Button
        android:id="@+id/btn"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="动起来" />

    <TextView
        android:id="@+id/tv"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:background="@drawable/frame" />
</LinearLayout>

MainActivity.java

public class MainActivity extends Activity implements View.OnClickListener{
    private Button button;
    private TextView tv;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        button = findViewById(R.id.btn);
        tv = findViewById(R.id.tv);
        button.setOnClickListener(this);

    }

    @Override
    public void onClick(View view) {
        //使用配置文件定义帧动画的执行序列
        //加载配置文件,执行帧动画
        AnimationDrawable animationDrawable = (AnimationDrawable) tv.getBackground();
        animationDrawable.start();
    }
}

只执行一次需要增加代码:

 animationDrawable.setOneShot(true);

在这里插入图片描述

动态添加帧

AnimationDrawable animationDrawable = (AnimationDrawable) tv.getBackground();
animationDrawable.addFrame(getResources().getDrawable(R.mipmap.wifi5),200);
animationDrawable.addFrame(getResources().getDrawable(R.mipmap.wifi4),200);
animationDrawable.addFrame(getResources().getDrawable(R.mipmap.wifi3),200);
animationDrawable.addFrame(getResources().getDrawable(R.mipmap.wifi2),200);
animationDrawable.addFrame(getResources().getDrawable(R.mipmap.wifi1),200);
animationDrawable.addFrame(getResources().getDrawable(R.mipmap.wifi0),200);
animationDrawable.start();

在这里插入图片描述
纯代码添加帧动画

如果事先不给 TextView 添加 background,现在用纯代码添加

AnimationDrawable animationDrawable = new AnimationDrawable();
animationDrawable.addFrame(getResources().getDrawable(R.mipmap.wifi5),200);
animationDrawable.addFrame(getResources().getDrawable(R.mipmap.wifi4),200);
animationDrawable.addFrame(getResources().getDrawable(R.mipmap.wifi3),200);
animationDrawable.addFrame(getResources().getDrawable(R.mipmap.wifi2),200);
animationDrawable.addFrame(getResources().getDrawable(R.mipmap.wifi1),200);
animationDrawable.addFrame(getResources().getDrawable(R.mipmap.wifi0),200);
tv.setBackground(animationDrawable);
animationDrawable.start();

在这里插入图片描述

动态添加补间动画

在这里插入图片描述

TranslateAnimation animation = new TranslateAnimation(0,0,0,150);
animation.setDuration(1000);
view.startAnimation(animation);

在这里插入图片描述
还有一点需要说明,我们把刚才的动画改为执行完动画后停到结束的位置:

        TranslateAnimation animation = new TranslateAnimation(0,0,0,150);
        animation.setDuration(1000);
        animation.setFillAfter(true);
        view.startAnimation(animation);

补间动画只是在视觉上的一个动画展示,控件的属性并没有变化
例如这个 Button,起始坐标是(0,0),经过这个平移动画,属性依旧是(0,0),只是视觉上移动到了(0,150)
如果我们再点击 Button 原来的位置,它还会再执行一遍动画
在这里插入图片描述

属性动画

Android 中如果某个控件执行了属性动画,即是在具体时间内,属性从起始值到目标值进行编号的过程。

我们可以借助 ObjectAnimator完成属性动画的执行。

1、实现渐变效果
在这里插入图片描述
代码:

ObjectAnimator animator = ObjectAnimator.ofFloat(img,"alpha",1,0);
animator.setDuration(1000);
animator.start();

2、重复执行
在这里插入图片描述
代码:

		ObjectAnimator animator = ObjectAnimator.ofFloat(img, "alpha", 1, 0);
        animator.setDuration(1000);
        //常见属性设置
        //设置循环次数,设置为INFINITE表示无限循环
        animator.setRepeatCount(3);
        //设置循环模式
        //value取值有RESTART,REVERSE,
        animator.setRepeatMode(ObjectAnimator.RESTART);
        animator.start();

其中 alph 是属性,小写,程序会自动大写首字母,并且执行setAlph方法

3、摇摆效果
在这里插入图片描述
代码:

		ObjectAnimator animator = ObjectAnimator.ofFloat(img, "x", 0, 100);
        animator.setDuration(1000);
        animator.setRepeatCount(ObjectAnimator.INFINITE);
        animator.setRepeatMode(ObjectAnimator.REVERSE);
        animator.start();

4、伸缩效果
![在这里插入图片描述](https://img-blog.csdnimg.cn/e30c7b784dbd4381ba2d3186b871ae82.gif =25=x)

        ObjectAnimator animator = ObjectAnimator.ofFloat(img, "abc", 1, 0);
        animator.setDuration(1000);
        animator.setRepeatCount(ObjectAnimator.INFINITE);
        animator.setRepeatMode(ObjectAnimator.REVERSE);
        //给ObjectAnimator设置属性更新
        //每时每刻改view的属性
        animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener(){
            @Override
            public void onAnimationUpdate(ValueAnimator valueAnimator) {
                //获取更新时,ObjectAnimator计算出来的参数值
               Float value = (Float) valueAnimator.getAnimatedValue();
               img.setScaleX(value);
               img.setScaleY(value);
            }
        });
        animator.start();

6、插值器
其实默认情况下动画是由慢变快再变慢的过程,让动画匀速变化可以增加代码

	......
        //匀速变化
        animator.setInterpolator(new LinearInterpolator());
        animator.start();

在这里插入图片描述
弹簧插值器

ObjectAnimator animator = ObjectAnimator.ofFloat(view,"x",0,300);
animator.setDuration(3000);
animator.setInterpolator(new BounceInterpolator());
animator.start();

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值