在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 = https://www.it610.com/article/(float) animation.getAnimatedValue();
Log.d("Test", "cuurent value is " + value);
}
});
【Android开发(android动画应用之objectAnimator(附实例))】和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();
}
}