android属性动画

一、发展

Android 3.0以前,只有补间动画和逐帧动画,合称视图动画

Android 3.0后添加了"属性动画"

补间动画和逐帧动画缺点:

  1. 作用对象局限于View
  2. 没有改变View的属性,只是改变了视觉效果
  3. 动画效果单一,只能平移,缩放,旋转,和改变透明度

属性动画改进了上面的缺点:

能作用于所有Java对象,可实现多种动画效果,不局限于以上四种

引入了作用领域,

二、工作原理

三、使用

ValueAnimator

ValueAnimator animator=ValueAnimator.ofInt(0,100);
animator.setDuration(1000);
animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
    @Override
    public void onAnimationUpdate(ValueAnimator animation) {
        Log.d("jay","value="+animation.getAnimatedValue());
    }
});
animator.start();

过程为调用ValueAnimator的ofInt()方法就可以创建一个ValueAnimator对象,ofInt方法传入的参数代表将值从0平滑过度到100,setDuration()方法是设置动画运行时长,addUpdateListener()方法可以监听动画运行过程,start()方法启动动画

ObjectAnimator

TextView textView=findViewById(R.id.tv);
Button btn=findViewById(R.id.btn);
final ObjectAnimator animator=ObjectAnimator.ofFloat(textView,"alpha",1f,0f,1f);
animator.setDuration(10000);

btn.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        animator.start();
    }
});

实现了点击按钮textView消失又重现的动画

ofFloat的参数分别为View对象、动画效果,开始状态,中间状态,结束状态

第二个参数可以是alpha(改变透明度)、rotation(旋转)、translationX(水平移动)、scaleY(垂直缩放),还有其他的各种值

原理是通过属性名找到View的set、get方法进行操作,比如View中存在

public void setAlpha(float value);
public float getAlpha();

则可以改变alpha。

所以我们可以设置任何值,只要在View中创建这个属性的set和get方法

组合动画

实现组合动画功能主要需要借助AnimatorSet这个类,这个类提供了一个play()方法,如果我们向这个方法中传入一个Animator对象(ValueAnimator或ObjectAnimator)将会返回一个AnimatorSet.Builder的实例,AnimatorSet.Builder中包括以下四个方法:

  • after(Animator anim) 将现有动画插入到传入的动画之后执行
  • after(long delay) 将现有动画延迟指定毫秒后执行
  • before(Animator anim) 将现有动画插入到传入的动画之前执行
  • with(Animator anim) 将现有动画和传入的动画同时执行
ObjectAnimator moveIn = ObjectAnimator.ofFloat(textview, "translationX", -500f, 0f);
ObjectAnimator rotate = ObjectAnimator.ofFloat(textview, "rotation", 0f, 360f);
ObjectAnimator fadeInOut = ObjectAnimator.ofFloat(textview, "alpha", 1f, 0f, 1f);
AnimatorSet animSet = new AnimatorSet();
animSet.play(rotate).with(fadeInOut).after(moveIn);
animSet.setDuration(5000);
animSet.start();

Animator监听器

anim.addListener(new AnimatorListener() {
	@Override
	public void onAnimationStart(Animator animation) {
	}
 
	@Override
	public void onAnimationRepeat(Animator animation) {
	}
 
	@Override
	public void onAnimationEnd(Animator animation) {
	}
 
	@Override
	public void onAnimationCancel(Animator animation) {
	}
});

我们需要实现接口中的四个方法,onAnimationStart()方法会在动画开始的时候调用,onAnimationRepeat()方法会在动画重复执行的时候调用,onAnimationEnd()方法会在动画结束的时候调用,onAnimationCancel()方法会在动画被取消的时候调用。

不监听全部事件

使用适配器AnimatorListenerAdapter类,已经帮我们自动实现了所有方法,我们只要重写需要的方法即可

anim.addListener(new AnimatorListenerAdapter() {
	@Override
	public void onAnimationEnd(Animator animation) {
	}
});

使用XML编写动画

单个动画

<objectAnimator xmlns:android="http://schemas.android.com/apk/res/android"
    android:valueFrom="1"
    android:valueTo="0"
    android:valueType="floatType"
    android:propertyName="alpha"/>

组合动画

<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:ordering="sequentially" >
 
    <objectAnimator
        android:duration="2000"
        android:propertyName="translationX"
        android:valueFrom="-500"
        android:valueTo="0"
        android:valueType="floatType" >
    </objectAnimator>
 
    <set android:ordering="together" >
        <objectAnimator
            android:duration="3000"
            android:propertyName="rotation"
            android:valueFrom="0"
            android:valueTo="360"
            android:valueType="floatType" >
        </objectAnimator>
 
        <set android:ordering="sequentially" >
            <objectAnimator
                android:duration="1500"
                android:propertyName="alpha"
                android:valueFrom="1"
                android:valueTo="0"
                android:valueType="floatType" >
            </objectAnimator>
            <objectAnimator
                android:duration="1500"
                android:propertyName="alpha"
                android:valueFrom="0"
                android:valueTo="1"
                android:valueType="floatType" >
            </objectAnimator>
        </set>
    </set>
 
</set>

启动动画

Animator animator = AnimatorInflater.loadAnimator(context, R.animator.anim_file);
animator.setTarget(view);
animator.start();

参考链接:

http://blog.csdn.net/guolin_blog/article/details/43536355

https://blog.csdn.net/carson_ho/article/details/72909894

posted @ 2020-11-04 11:47  小老弟呀  阅读(101)  评论(0编辑  收藏  举报