Android属性动画

一、ObjectAnimation
定义:ObjectAnimation是在动画执行的过程中通过不断更改设置View的属性值来实现动画的效果,所以要保证对应的属性之一定要有getter和setter方法,否则不会有动画效果。
Translate动画:

//小球从右边窗口移动到左边窗口在回到原点
    private void translate(){
        ObjectAnimator objectAnimator=ObjectAnimator.ofFloat(ball,"translationX", ScreenUtil.getSreenWidth(this)/2,0,-ScreenUtil.getSreenWidth(this)/2,0);
        objectAnimator.setDuration(2000);//设置动画执行时间为1000毫秒
        objectAnimator.setInterpolator(new LinearInterpolator());//设置动画匀速执行
        objectAnimator.start();
    }

这里写图片描述

注意:动画设置的属性值以小球中点为为原点。X轴上右边为正,左边为负;Y轴上上边为负,下边为正。
Scale动画:

//将小球缩小到1/2,再放大到2倍,再还原
    private void scale(){
        //通过PropertyValueHolder方式
        PropertyValuesHolder scaleX=PropertyValuesHolder.ofFloat("scaleX",1.0f,0.5f,2.0f,1.0f);
        PropertyValuesHolder scaleY=PropertyValuesHolder.ofFloat("scaleY",1.0f,0.5f,2.0f,1.0f);
        ObjectAnimator.ofPropertyValuesHolder(ball,scaleX,scaleY).setDuration(2000).start();
        //通过AnimatorSet方式
//        ObjectAnimator scaleX=ObjectAnimator.ofFloat(ball,"scaleX",1.0f,0.5f,2.0f,1.0f);
//        ObjectAnimator scaleY=ObjectAnimator.ofFloat(ball,"scaleY",1.0f,0.6f,2.0f,1.0f);
//        AnimatorSet animatorSet=new AnimatorSet();
//        animatorSet.setDuration(2000);
//        animatorSet.setInterpolator(new LinearInterpolator());
//        animatorSet.playTogether(scaleX,scaleY);
//        animatorSet.start();
    }

这里写图片描述
Alpha动画:

//使球先淡出在淡入
    private void alpha(){
        ObjectAnimator objectAnimator=ObjectAnimator.ofFloat(ball,"alpha",1.0f,0.0f,1.0f);
        objectAnimator.setDuration(2000);
        objectAnimator.setInterpolator(new LinearInterpolator());
        objectAnimator.start();
    }

这里写图片描述
Rotate动画:

//使小球翻转一周
    private void rotateX(){
        ObjectAnimator objectAnimator=ObjectAnimator.ofFloat(ball,"rotationX",0.0f,360f);
        objectAnimator.setDuration(3000);
        objectAnimator.setInterpolator(new LinearInterpolator());
        objectAnimator.start();
    }

这里写图片描述
二、ValueAnimator
定义:ValueAnimator通过监听动画改变的值,手动设置View的属性产生动画效果。

//ValueAnimator动画
    private void valueAnimator(){
        ValueAnimator valueAnimator=ValueAnimator.ofFloat(0,ScreenUtil.getSreenWidth(this)/2);
        valueAnimator.setDuration(2000);
        valueAnimator.setInterpolator(new LinearInterpolator());
        valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
            @Override
            public void onAnimationUpdate(ValueAnimator valueAnimator) {
                float value= (float) valueAnimator.getAnimatedValue();
                ball.setTranslationX(value);
                ball.setTranslationY(value);
            }
        });
        valueAnimator.start();
    }

这里写图片描述
三、自定义TypeEvaluator
通过自定义实体类记录动画变化的值,然后在监听里获得动画变化的值,改变View的属性。
自定义实体类:

package com.gyg.animation;

/**
 * Created by gyg on 2017/3/5.
 */

public class AnimatorEntity {

    private float x;
    private float y;

    public AnimatorEntity() {
    }

    public AnimatorEntity(float x, float y) {
        this.x = x;
        this.y = y;
    }

    public float getX() {
        return x;
    }

    public void setX(float x) {
        this.x = x;
    }

    public float getY() {
        return y;
    }

    public void setY(float y) {
        this.y = y;
    }

}
//自定义TypeEvaluator
    private void customEvaluator(){
        ValueAnimator valueAnimator=new ValueAnimator();
        valueAnimator.setDuration(2000);
        valueAnimator.setInterpolator(new LinearInterpolator());
        valueAnimator.setObjectValues(new AnimatorEntity(0,0));
        valueAnimator.setEvaluator(new TypeEvaluator<AnimatorEntity>() {
            @Override
            public AnimatorEntity evaluate(float fraction, AnimatorEntity animatorEntity, AnimatorEntity t1) {
                AnimatorEntity entity=new AnimatorEntity();
                entity.setX(200 * fraction * 3);
                entity.setY(0.5f * 200 * (fraction * 3) * (fraction * 3));
                return entity;
            }
        });
        valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
            @Override
            public void onAnimationUpdate(ValueAnimator valueAnimator) {
                AnimatorEntity entity= (AnimatorEntity) valueAnimator.getAnimatedValue();
                ball.setX(entity.getX());
                ball.setY(entity.getY());
            }
        });
        valueAnimator.start();
    }

这里写图片描述

四、给动画设置监听

//给动画设置监听
    private void AnimatorListener(){
        ObjectAnimator objectAnimator=ObjectAnimator.ofFloat(ball,"translationX", ScreenUtil.getSreenWidth(this)/2,0,-ScreenUtil.getSreenWidth(this)/2,0);
        objectAnimator.setDuration(2000);//设置动画执行时间为1000毫秒
        objectAnimator.setInterpolator(new LinearInterpolator());//设置动画匀速执行
        objectAnimator.addListener(new Animator.AnimatorListener() {
            @Override
            public void onAnimationStart(Animator animator) {//动画开始时执行
                Toast.makeText(MainActivity.this,"onAnimationStart",Toast.LENGTH_SHORT);
            }

            @Override
            public void onAnimationEnd(Animator animator) {//动画结束时执行
                Toast.makeText(MainActivity.this,"onAnimationEnd",Toast.LENGTH_SHORT);
            }

            @Override
            public void onAnimationCancel(Animator animator) {//动画取消时执行
                Toast.makeText(MainActivity.this,"onAnimationV",Toast.LENGTH_SHORT);
            }

            @Override
            public void onAnimationRepeat(Animator animator) {//动画重复时执行
                Toast.makeText(MainActivity.this,"onAnimationRepeat",Toast.LENGTH_SHORT);
            }
        });
        objectAnimator.start();
    }

还有一种简单的适配器AnimatorListenerAdapter,可以根据需要重写里面的方法。比如我只想监听动画开始和结束:

//给动画设置监听
    private void AnimatorListenerSimple(){
        ObjectAnimator objectAnimator=ObjectAnimator.ofFloat(ball,"translationX", ScreenUtil.getSreenWidth(this)/2,0,-ScreenUtil.getSreenWidth(this)/2,0);
        objectAnimator.setDuration(2000);//设置动画执行时间为1000毫秒
        objectAnimator.setInterpolator(new LinearInterpolator());//设置动画匀速执行
        objectAnimator.addListener(new AnimatorListenerAdapter() {

            @Override
            public void onAnimationStart(Animator animator) {//动画开始时执行
                Toast.makeText(MainActivity.this,"onAnimationStart",Toast.LENGTH_SHORT);
            }

            @Override
            public void onAnimationEnd(Animator animator) {//动画结束时执行
                Toast.makeText(MainActivity.this,"onAnimationEnd",Toast.LENGTH_SHORT);
            }
        });
        objectAnimator.start();
    }

五、Xml方式设置动画

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:ordering="together"
    ><!--togerther表示一起执行 sequentially表示按照先后顺序依次执行-->

    <!--x轴方向缩小0.5倍-->
    <objectAnimator
        android:duration="1000"
        android:propertyName="scaleX"
        android:valueFrom="1"
        android:valueTo="0.5" >
    </objectAnimator>

    <!--y轴方向缩小0.5倍-->
    <objectAnimator
        android:duration="1000"
        android:propertyName="scaleY"
        android:valueFrom="1"
        android:valueTo="0.5" >
    </objectAnimator>
</set>
//xml方式定义动画
    private void AnimationXml(){
        Animator animator= AnimatorInflater.loadAnimator(this,R.animator.anim_scale);
        animator.setInterpolator(new LinearInterpolator());
        animator.setDuration(1000);
        animator.setTarget(image);
        image.setPivotX(0);
        image.setPivotY(0);
        image.invalidate();//通过设置pivotX,pivotY使image以左上角为中心缩放
        animator.start();
    }

这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值