Android基础:动画三:属性动画

其他:
Android应用开发之所有动画使用详解

先回顾动画的创建方式

动画创建方式获取Animation对象的方式例子
帧动画drawable animation代码创建getBackground()AnimationDrawable animation = (AnimationDrawable) imageView.getBackground();
xml不需要获取android:background=”@drawable/animation_main”
补间动画View Animation代码创建new …RotateAnimation animation = new RotateAnimation(1, 10);
xml创建AnimationUtils.loadAnimation(…)Animation animation = AnimationUtils.loadAnimation(context, R.anim.anim_translate)
属性动画Property Animator代码创建ObjectAnimator.ofFloat(…)ObjectAnimator oa1 = ObjectAnimator.ofFloat(iv, “scaleX”, 1, 3, 1, 3,5, -2)
xml创建AnimatorInflater.loadAnimator(…)ObjectAnimator oa = (ObjectAnimator) AnimatorInflater.loadAnimator(context, R.animator.alpha)

简介

属性动画ObjectAnimator是一种值动画,ObjectAnimator继承自Animator,而不是Animation,所以吧不能采用view.startAnimation(objectAnimator)
这里写图片描述

创建方式

属性动画的执行类是ObjectAnimator,是通过静态方法获取的。
这里写图片描述

ofFloat(Object target, String propertyName, float... values) 
ofInt(Object target, String propertyName, int... values) 
动画创建方式获取Animation对象的方式例子
属性动画Property Animator代码创建ObjectAnimator.ofFloat(…)ObjectAnimator oa1 = ObjectAnimator.ofFloat(iv, “scaleX”, 1, 3, 1, 3,5, -2)
xml创建AnimatorInflater.loadAnimator(…)ObjectAnimator oa = (ObjectAnimator) AnimatorInflater.loadAnimator(context, R.animator.alpha)

效果图

这里写图片描述

代码方式创建属性动画

propertyName:ranslationX scaleX Alpha rotation都有对应的代码设置方式

iv.setTranslationX(80);
iv.setScaleX(2);
iv.setAlpha(0.5f);
iv.setRotationX(180);

也有xml

android:translationX="100"
android:scaleX="2"
android:alpha="0.5"
android:rotationX="180"

Translation

ranslationX: 沿X轴移动

ObjectAnimator oa1 = ObjectAnimator.ofFloat(iv, "TranslationX", 0, 50,20, 0, 90);
oa1.setDuration(1000);
oa1.start();

scale

scaleX:X轴(宽度)缩放,Y轴(高度)不变 -2表示先缩放到0(消失),然后到2倍大小

ObjectAnimator oa1 = ObjectAnimator.ofFloat(iv, "scaleX", 1, 3, 1, 3,5, -2);
oa1.setDuration(5000);
oa1.start();

Alpha

透明度变化

ObjectAnimator oa1 = ObjectAnimator.ofFloat(iv, "Alpha", 1.0f, 0.5f, 0,1.0f);
oa1.setDuration(5000);
oa1.start();

rotation

rotationX:X轴旋转

ObjectAnimator oa1 = ObjectAnimator.ofFloat(iv, "rotationX", 100, 200,300, 300, 0);
oa1.setDuration(1000);
oa1.start();

效果图

这里写图片描述

2种创建方式

Interpolator有2种创建方式,一种用xml创建,一种用java创建。

OvershootInterpolator overshoot = new OvershootInterpolator(1.0f);
OvershootInterpolator interpolator = (OvershootInterpolator) AnimationUtils.loadInterpolator(MainActivity.this, android.R.interpolator.overshoot);

不强制转化,用Interpolator也可以
Interpolator interpolator =AnimationUtils.loadInterpolator(MainActivity.this, android.R.interpolator.overshoot);

注意:Interpolator是包android.view.animation

import android.view.animation.Interpolator;

xml创建

private boolean flag = true;
Interpolator interpolator = AnimationUtils.loadInterpolator(MainActivity.this, android.R.interpolator.bounce);

Path path1 = new Path();
path1.moveTo(1.0f, 1.0f);
path1.lineTo(0.2f, 0.2f);

ObjectAnimator objectAnimator = ObjectAnimator.ofFloat(view, View.SCALE_X, View.SCALE_Y, path);
objectAnimator.setDuration(2000);
objectAnimator.setInterpolator(interpolator);
objectAnimator.start();

TranslationXscaleX都是常量

常量
View.TRANSLATION_XtranslationX
View.TRANSLATION_YtranslationY
View.TRANSLATION_Z
View.SCALE_XtranslationZ
View.SCALE_YscaleX
View.ALPHAscaleY
View.ROTATIONalpha
View.ROTATION_XrotationX
View.ROTATION_YrotationY

动画合集

AnimatorSet set = new AnimatorSet();

ObjectAnimator oa1 = ObjectAnimator.ofFloat(iv, "scaleX", 1, 3, 1, 3,5, -2);
ObjectAnimator oa2 = ObjectAnimator.ofFloat(iv, "scaleX", 1, 3, 1, 3,5, -2);
ObjectAnimator oa3 = ObjectAnimator.ofFloat(iv, "Alpha", 1.0f, 0.5f, 0,1.0f);
ObjectAnimator oa4 = ObjectAnimator.ofFloat(iv, "rotationX", 100, 200,300, 300, 0);

set.setTarget(iv);
set.setDuration(1000);

// set.playSequentially(oa1,oa2,oa3,oa4);//一次执行动画
set.playTogether(oa1, oa2, oa3, oa4);// 一起执行动画
set.start();

xml方式创建属性动画

先创建xml,才可以开启动画。
注意:需要在res目录下创建animator文件夹,而不是anim
这里写图片描述

scale

propertyName,不能是propertyXName

<?xml version="1.0" encoding="utf-8"?>
<animator xmlns:android="http://schemas.android.com/apk/res/android" >
    <objectAnimator
        android:duration="1500"
        android:propertyName="translationX"
        android:valueFrom="10"
        android:valueTo="80" >
    </objectAnimator>
</animator>

scale

<?xml version="1.0" encoding="utf-8"?>
<objectAnimator xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="2000"
    android:propertyName="scaleX"
    android:valueFrom="1"
    android:valueTo="0.2" >
</objectAnimator>

Alpha

<?xml version="1.0" encoding="utf-8"?>
<objectAnimator xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="2000"
    android:propertyName="alpha" 
    android:valueFrom="0.1"
    android:valueTo="1">
</objectAnimator>

rotation

<?xml version="1.0" encoding="utf-8"?>
<objectAnimator xmlns:android="http://schemas.android.com/apk/res/android" 
    android:duration="2000"
    android:propertyName="rotationX"
    android:valueFrom="0"
    android:valueTo="360">
</objectAnimator>

开启属性动画

ObjectAnimator oa = (ObjectAnimator) AnimatorInflater.loadAnimator(context, R.animator.scale);
oa.setTarget(iv);
oa.start();

开启属性动画集合

xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android" >

    <objectAnimator
        android:duration="1500"
        android:propertyName="translationX"
        android:valueFrom="10"
        android:valueTo="80" />
    <objectAnimator
        android:duration="2000"
        android:propertyName="scaleX"
        android:valueFrom="1"
        android:valueTo="0.2" />
    <objectAnimator
        android:duration="2000"
        android:propertyName="rotationX"
        android:valueFrom="0"
        android:valueTo="360" />
    <objectAnimator
        android:duration="2000"
        android:propertyName="scaleX"
        android:valueFrom="0.5"
        android:valueTo="1" />

</set>

开启属性动画集合

AnimatorSet set = (AnimatorSet) AnimatorInflater.loadAnimator(context, R.animator.set);
set.setTarget(iv);
set.start();

补间动画和属性动画的区别?

补间动画不会改变view的坐标,
属性动画会改变view的坐标。

源码

PropertyAnimatorDemo

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值