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切换时,切换的动画效果,实际上运用功能包含六个文件

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




    
    





    
    
    
    



    
    
    



    
    



    
    





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

 

 

 

 

你可能感兴趣的:(Android)