前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Android--属性动画基础

Android--属性动画基础

作者头像
aruba
发布2020-07-03 11:22:32
4920
发布2020-07-03 11:22:32
举报
文章被收录于专栏:android技术android技术
安卓中动画分成两类
一种是传统动画,如:补间动画,帧动画,其本质是canvas的矩阵变换
另一种是属性动画,由谷歌从Android3.0以后推出
传统动画仅仅是视觉效果,并不会实际改变view的属性,比如:平移动画不会改变view的原来坐标,如果需要点击view还是要点击原来的位置。而属性动画不同,它是真正的改变view的属性(成员变量)。
我们使用属性动画,需要掌握5个类
  1. ObjectAnimator
  2. ValueAnimator
  3. PropertyValueHolder
  4. TypeEvaluator
  5. Interpolator
首先,我们创建一个ImageView,使用默认的安卓启动图标
代码语言:javascript
复制
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <ImageView
        android:id="@+id/iv"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@mipmap/ic_launcher"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        android:onClick="startAnimation"
        app:layout_constraintTop_toTopOf="parent" />

</android.support.constraint.ConstraintLayout>
下面是属性动画ObjectAnimator的基础用法
代码语言:javascript
复制
    public void startAnimation(View view) {
        ImageView iv = (ImageView) view;

        //注意第二个参数,只要view里面有setXXX()方法就可以通过反射达到变化的目的
        ObjectAnimator objectAnimator = ObjectAnimator.ofFloat(iv, "translationX", 0f, 100f);
        objectAnimator.setDuration(500);
        objectAnimator.start();
    }

ObjectAnimator.gif

如果想要多个动画同时执行
方法1.设置动画监听,同步操作其他的属性
代码语言:javascript
复制
    public void startAnimation(View view) {
        final ImageView iv = (ImageView) view;

        //iv显然没有setXiaoming的方法,内部做了异常处理
        ObjectAnimator objectAnimator = ObjectAnimator.ofFloat(iv, "xiaoming", 0f, 100f);
        objectAnimator.setDuration(500);
        objectAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
            @Override
            public void onAnimationUpdate(ValueAnimator animation) {
                // 监听动画回调
                //animation.getAnimatedFraction();//动画执行的百分比 0~1 //API 12+
                float value = (float) animation.getAnimatedValue();//得到0f~100f当中的这个时间点对应的值
                iv.setScaleX(0.5f+value/200);
                iv.setScaleY(0.5f+value/200);
                //iv.setTranslationX(value);
            }
        });
        objectAnimator.start();
    }
方法2.使用ValueAnimator,如果只需要监听值变化就用ValueAnimator
代码语言:javascript
复制
    public void startAnimation(View view) {
        final ImageView iv = (ImageView) view;

        ValueAnimator animator = ValueAnimator.ofFloat(0f, 200f);
        animator.setDuration(200);
        animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {

            @Override
            public void onAnimationUpdate(ValueAnimator animation) {
                float value = (float) animation.getAnimatedValue();//得到0f~100f当中的这个时间点对应的值
                iv.setScaleX(0.5f + value / 200);
                iv.setScaleY(0.5f + value / 200);
            }
        });
        animator.start();
    }
方法3.使用PropertyValuesHolder
代码语言:javascript
复制
    public void startAnimation(View view) {
        final ImageView iv = (ImageView) view;

        PropertyValuesHolder holder1 = PropertyValuesHolder.ofFloat("alpha", 1f, 0.5f);
        PropertyValuesHolder holder2 = PropertyValuesHolder.ofFloat("scaleX", 1f, 0.5f);
        PropertyValuesHolder holder3 = PropertyValuesHolder.ofFloat("scaleY", 1f, 0.5f);
        ObjectAnimator animator = ObjectAnimator.ofPropertyValuesHolder(iv, holder1, holder2, holder3);
        animator.setDuration(200);
        animator.start();
    }
方法4.动画集合AnimatorSet
代码语言:javascript
复制
    public void startAnimation(View view) {
        final ImageView iv = (ImageView) view;

        ObjectAnimator animator1 = ObjectAnimator.ofFloat(iv, "translationX", 0f, 100f);
        ObjectAnimator animator2 = ObjectAnimator.ofFloat(iv, "alpha", 0f, 1f);
//      animator2.setStartDelay(startDelay)//设置延迟执行
        ObjectAnimator animator3 = ObjectAnimator.ofFloat(iv, "scaleX", 0f, 2f);
        AnimatorSet animatorSet = new AnimatorSet();
        animatorSet.setDuration(500);
//      animatorSet.play(animator3).with(animator2).after(animator1);//animator1在前面
//      animatorSet.play(animator3).with(animator2).before(animator1);//animator1在后面
//      animatorSet.playTogether(animator1,animator2,animator3);//同时执行
        animatorSet.playSequentially(animator1, animator2, animator3);//按顺序执行
        animatorSet.start();
    }
如果我们要实现一个自由落体抛物线动画,可以使用估值器TypeEvaluator
代码语言:javascript
复制
    public void startAnimation(View view) {
        final ImageView iv = (ImageView) view;

        ObjectAnimator objectAnimator = new ObjectAnimator();
        objectAnimator.setDuration(2000);
        objectAnimator.setObjectValues(new PointF(0, 0));
        final PointF pointF = new PointF();
        objectAnimator.setEvaluator(new TypeEvaluator() {
            @Override
            public Object evaluate(float fraction, Object startValue, Object endValue) {
                //估值计算方法---可以在执行的过程当中干预改变属性的值---做效果:用自己的算法来控制
                //不断地去计算修改坐标
                //x匀速运动 x=v*t 
                pointF.x = 400f * (fraction);
                //加速度 y=vt=1/2*g*t*t
                pointF.y = (float) (10f * 0.5f * 9.8f * Math.pow(fraction * 5, 2));
                return pointF;
            }
        });
        objectAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
            @Override
            public void onAnimationUpdate(ValueAnimator animation) {
                PointF pointF1 = (PointF) animation.getAnimatedValue();
                iv.setX(pointF1.x);
                iv.setY(pointF1.y);
            }
        });
        objectAnimator.start();
    }
动画执行过程,我们想要控制它的执行速度,可以使用插值器(加速器)Interpolater,下面介绍了几种常用的插值器
代码语言:javascript
复制
    public void startAnimation(View view) {
        final ImageView iv = (ImageView) view;

        ObjectAnimator oa = ObjectAnimator.ofFloat(iv, "translationY", 0f,1000f);
        oa.setDuration(800);
        oa.setInterpolator(new AccelerateDecelerateInterpolator());

        oa.start();
    }
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 安卓中动画分成两类
  • 一种是传统动画,如:补间动画,帧动画,其本质是canvas的矩阵变换
  • 另一种是属性动画,由谷歌从Android3.0以后推出
  • 传统动画仅仅是视觉效果,并不会实际改变view的属性,比如:平移动画不会改变view的原来坐标,如果需要点击view还是要点击原来的位置。而属性动画不同,它是真正的改变view的属性(成员变量)。
  • 我们使用属性动画,需要掌握5个类
  • 首先,我们创建一个ImageView,使用默认的安卓启动图标
  • 下面是属性动画ObjectAnimator的基础用法
  • 如果想要多个动画同时执行
  • 方法1.设置动画监听,同步操作其他的属性
  • 方法2.使用ValueAnimator,如果只需要监听值变化就用ValueAnimator
  • 方法3.使用PropertyValuesHolder
  • 方法4.动画集合AnimatorSet
  • 如果我们要实现一个自由落体抛物线动画,可以使用估值器TypeEvaluator
  • 动画执行过程,我们想要控制它的执行速度,可以使用插值器(加速器)Interpolater,下面介绍了几种常用的插值器
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档