Android开发:android动画应用之objectAnimator(附实例)

在android学习中,我们需要掌握动画的知识,这样可以为我们的应用添加足够华丽灵动的操作体验,接下来我通过实例讲解ObjectAnimator实现动画效果,ObjectAnimator是ValueAnimator的子类。其功能更加强大了,可以对一个对象的属性进行动画操作。在Activity中用java代码如下使用:

 ObjectAnimator animator = ObjectAnimator.ofFloat(textView,"alpha",1f,0f,1f);
                animator.setDuration(4000);
                animator.start();

可以看到,我们调用了ofFloat()方法来去创建一个ObjectAnimator的实例。这里第一个参数要求传入一个object对象,我们想要对哪个对象进行动画操作就传入相应的对象,这里传入了一个textview。第二个参数是想要对该对象的哪个属性进行动画操作(alpha、scale、translate、rotate等等),由于我们想要改变TextView的透明度,因此这里传入"alpha"。后面的参数就是不固定长度了,想要完成什么样的动画就传入什么值,这里传入的值就表示将TextView从常规变换成全透明,再从全透明变换成常规。之后调用setDuration()方法来设置动画的时长,然后调用start()方法启动动画。

具体想知道android是如何对相关属性进行更改的,我们可以为animator设置监听器,监控查看其中的变化。

animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
                    @Override
                    public void onAnimationUpdate(ValueAnimator animation) {
                        float value = (float) animation.getAnimatedValue();
                        Log.d("Test", "cuurent value is " + value);
                    }
                });

和Animation动画一样,属性动画也可以同时进行多个动画,用AnimatorSet来实现

 float x1 = textView.getTranslationX();
                ObjectAnimator animator = ObjectAnimator.ofFloat(textView,"alpha",1f,0f,1f);
                ObjectAnimator animator11 = ObjectAnimator.ofFloat(textView,"rotation",0f,360f);
                ObjectAnimator animator22 = ObjectAnimator.ofFloat(textView,"translationX",x1,x1+200f);
                AnimatorSet animatorSet = new AnimatorSet();
                animatorSet.play(animator11).with(animator).with(animator22);
 
                animatorSet.setDuration(4000);
                animatorSet.addListener(new AnimatorListenerAdapter() {
                    @Override
                    public void onAnimationEnd(Animator animation) {
                        super.onAnimationEnd(animation);
                    }
 
                });
                animatorSet.start();

以上是在java代码中进行实现的,其实一般情况下,我们是通过XML资源文件进行设置的,接下来,我通过实例并以注释的方式进行讲解,展示如何在XML资源文件中使用ObjectAnimator。

新建一个项目实现使用Fragment切换时,切换的动画效果,实际上运用功能包含六个文件

首先我们需要先写出动画文件。

<!--animator/card_flip_left_out.xml-->
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <objectAnimator
        android:valueFrom="0"
        android:valueTo="180"
        android:propertyName="rotationY"
        android:interpolator="@android:interpolator/accelerate_decelerate"
        android:duration="@integer/card_flip_time_full"/>
    <objectAnimator
        android:valueFrom="1.0"
        android:valueTo="0.0"
        android:propertyName="alpha"
        android:startOffset="1"
        android:duration="1000"/>
</set>

<!--
        interpolator:指定一个动画的插入器,用来控制动画的速度变化
        alpha:为属性名称,动画起始时透明度
                      0.0表示完全透明
                      1.0表示完全不透明
                      以上值取0.0-1.0之间的float数据类型的数字
        startOffset:偏移量
        rotationY:围绕Y轴旋转
        duration:持续时间 -->
<!--animator/card_flip_left_in.xml-->
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <objectAnimator
        android:valueFrom="1.0"
        android:valueTo="0.0"
        android:propertyName="alpha"
        android:duration="0"/>
    <!--需要在进入时,将透明度变为全透明-->
    <objectAnimator
        android:valueFrom="-180"
        android:valueTo="0"
        android:propertyName="rotationY"
        android:interpolator="@android:interpolator/accelerate_decelerate"
        android:duration="@integer/card_flip_time_full"/>
    <objectAnimator
        android:valueFrom="0.0"
        android:valueTo="1.0"
        android:propertyName="alpha"
        android:startOffset="@integer/card_flip_time_half"
        android:duration="1"/>
</set>
<!--animator/card_flip_right_in.xml-->
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <objectAnimator
        android:valueFrom="1,0"
        android:valueTo="0.0"
        android:propertyName="alpha"
        android:duration="0"/>
    <objectAnimator
        android:valueFrom="180"
        android:valueTo="0"
        android:propertyName="rotationY"
        android:interpolator="@android:interpolator/accelerate_decelerate"
        android:duration="@integer/card_flip_time_full"/>
    <objectAnimator
        android:valueFrom="0.0"
        android:valueTo="1.0"
        android:propertyName="alpha"
        android:startOffset="@integer/card_flip_time_half"
        android:duration="1"/>
</set>
<!--animator/card_flip_right_out.xml-->
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <objectAnimator
        android:valueFrom="0"
        android:valueTo="-180"
        android:propertyName="rotationY"
        android:interpolator="@android:interpolator/accelerate_decelerate"
        android:duration="@integer/card_flip_time_full"/>
    <objectAnimator
        android:valueFrom="1.0"
        android:valueTo="0.0"
        android:propertyName="alpha"
        android:startOffset="@integer/card_flip_time_half"
        android:duration="1"/>
</set>
<!--layout/fragment_card_back.xml-->
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#a6c"
    android:padding="16dp"
    android:layout_gravity="bottom">
    <TextView
        android:id="@+id/text1"
        style="?android:textAppearanceLarge"
        android:textStyle="bold"
        android:textColor="#fff"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="@string/card_back_title"/>
    <TextView
        style="?android:textAppearanceSmall"
        android:textAllCaps="true"
        android:textColor="#80ffffff"
        android:textStyle="bold"
        android:lineSpacingMultiplier="1.2"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="@string/card_back_description"/>

</LinearLayout>
<!--layout/fragment_card_front.xml-->
<?xml version="1.0" encoding="utf-8"?>
<ImageView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:src="@drawable/ic_launcher_background"
    android:scaleType="centerCrop"
    android:contentDescription="@string/description_image_1">

</ImageView>

CardFlipActivity.java,在其中做几样事情,

  • 将Fragment转换设置我们刚做的自定义动画

  • 用新Fragment替换当前显示的Fragment,并且应用之前创建的动画到该事件中。

  • 添加之前显示的Fragment到Fragment的回退栈(back stack)中,所以当用户按下 Back 键时,Card会翻转回来。

package com.example.power.mytest;

import android.app.Activity;
import android.app.Fragment;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;

/**
 * Created by Power on 2018/10/23.
 */

public class CardFlipActivity extends Activity {
    private boolean mShowingBack = false;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.cardflip_activity);
        Button button = (Button)findViewById(R.id.button_change);

        if(savedInstanceState == null){
            getFragmentManager()
                    .beginTransaction()
                    .add(R.id.content_card, new CardFrontFragment())
                    .commit();
        }
    }

    public static class CardFrontFragment extends Fragment{
        @Nullable
        @Override
        public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, Bundle savedInstanceState) {
            return inflater.inflate(R.layout.fragment_card_front, container, false);
        }
    }

    public static class CardBackFragment extends Fragment{
        @Nullable
        @Override
        public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, Bundle savedInstanceState) {
            return inflater.inflate(R.layout.fragment_card_back, container, false);
        }
    }

    private void flipCard(){
        if(mShowingBack){
            getFragmentManager().popBackStack();
            return;
        }

        mShowingBack = true;

        getFragmentManager()
                .beginTransaction()
                .setCustomAnimations(R.animator.card_flip_left_in, R.animator.card_flip_left_out,
                        R.animator.card_flip_right_in, R.animator.card_flip_right_out)
                .replace(R.id.content_card, new CardBackFragment())
                .addToBackStack(null)
                .commit();
    }

    public void chage(View view){
        flipCard();
    }
}

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值