【安卓进阶】动画

动画

  • 一. 帧动画
  • 二. 补间动画
  • 三. 属性动画

一. 帧动画

  • 定义
    逐帧动画(frame-by-frame animation), 是将一系列的图片按照特定的顺序依次播放来实现的

实现

  • 首先是需要一定的frame素材了
  • 将图片依次命名好, 然后放在res\drawable目录下
  • 创建.xml文件, 将动画文件依次放到<.../>标签中, 并设置持续时长
  • 在逻辑中通过findviewById的形式找到AnimationDrawable控件, 并调用对应的start()stop()方法, 来启动和停止动画
  • 对应的animation-list文件

<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.将不同的属性写在...标签中, 并定义好对应的持续时间
    4.在java逻辑中找到对应的控件, 通过AnimationUtils.loadAnimation()方法来获取Animation对象
    5.通过获取到的控件的startAnimation()方法来启动该动画对象
  • 动画布局文件
    创建文件目录res/anim, 新建一个Animation Resource File

透明度


<set xmlns:android="http://schemas.android.com/apk/res/android">
    <alpha
        android:duration="3000"
        android:fromAlpha="0"
        android:toAlpha="1" />
set>

旋转


<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>

缩放


<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>

移动


<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方法

你可能感兴趣的:(动画,android,java)