Android属性动画

来源:互联网 发布:机器人的编程语言 编辑:程序博客网 时间:2024/06/17 18:05

一、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();    }

这里写图片描述

0 0
原创粉丝点击