ObjectAnimator动画

两个文本动画:

public class TwoTextActivity extends Activity {
    
    private ObjectAnimator mPeekAnimator;
    
    private MoveRunner mPeekRunner = null;
    
    private Handler mHandler = new Handler();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.two_text_activity_main);
        
        startAnimation();
    }

    private void startAnimation() {
       TextView view = (TextView) findViewById(R.id.text);
       TextView view2 = (TextView) findViewById(R.id.text2);        
        mPeekRunner =
                new MoveRunner(view, view2,
                        36, false);
        this.mHandler.postDelayed(this.mPeekRunner, 1000L);
    }
    

    
    class MoveRunner implements Runnable {
        private final View mCurrent;

        private final View mNext;

        private final boolean mWillBeHidden;

        private final float mXBy;

        MoveRunner(View currentView, View nextView, float xBy, boolean willBeHiden) {
            this.mCurrent = currentView;
            this.mNext = nextView;
            this.mXBy = xBy;
            this.mWillBeHidden = willBeHiden;
        }

        public void run() {
            runPeekAnimator(this.mCurrent, this.mNext, this.mXBy, this.mWillBeHidden);
        }
    }
    
    private void runPeekAnimator(View view, View paramView2, float paramFloat, boolean paramBoolean) {
        if (shouldRunPeekAnimator()) {
            float f = view.getX();
            float[] arrayOfFloat = new float[2];
            arrayOfFloat[0] = f;
            arrayOfFloat[1] = (f + paramFloat);
            mPeekAnimator = ObjectAnimator.ofFloat(view, "x", arrayOfFloat);
            mPeekAnimator.setDuration(200L);
            mPeekAnimator.addListener(new PeekAnimatorListener(view, paramView2, paramFloat, this.mHandler,
                    paramBoolean));
            mPeekAnimator.start();
        //    this.mFragment.vibrate(200L);
        } else {
        //    this.mFragment.stopVibrating();
        }
    }
    
    class PeekAnimatorListener extends SimpleAnimatorListener {
        private final View mCurrent;

        private final Handler mHandler;

        private final View mNext;

        private final boolean mWillEndHidden;

        private final float mXBy;

        public PeekAnimatorListener(View currentView, View nextView, float xBy, Handler handler,
                boolean hiden) {
            this.mCurrent = currentView;
            this.mNext = nextView;
            this.mXBy = xBy;
            this.mHandler = handler;
            this.mWillEndHidden = hiden;
        }

        public void onAnimationEnd(Animator animator) {
            int delay = 0;
            if (shouldRunPeekAnimator()) {
                Log.d("TwoTextActivity", "mWillEndHidden:" + mWillEndHidden);
                if (!this.mWillEndHidden) {
                    delay = 100;
                    this.mHandler.postDelayed(new MoveRunner(this.mCurrent, this.mNext, -this.mXBy,
                            true), delay);
                } else {
                    delay = 400;
                    this.mHandler.postDelayed(new MoveRunner(this.mNext, this.mCurrent, this.mXBy,
                            false), delay);
                }
            }

        }
    }
    
    private boolean shouldRunPeekAnimator() {
        return true;
    }

}

一个文本动画:

public class OneTextActivity extends Activity {
    
    private ObjectAnimator mPeekAnimator;
    
    private MoveRunner mPeekRunner = null;
    
    private Handler mHandler = new Handler();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.one_text_activity_main);
        
        startAnimation();
    }

    private void startAnimation() {
       TextView view = (TextView) findViewById(R.id.text);
//       TextView view2 = (TextView) findViewById(R.id.text2);        
        mPeekRunner =
                new MoveRunner(view, /*view2,*/
                        36, false);
        this.mHandler.postDelayed(this.mPeekRunner, 1000L);
    }
    

    
    class MoveRunner implements Runnable {
        private final View mCurrent;

   //     private final View mNext;

        private final boolean mWillBeHidden;

        private final float mXBy;

        MoveRunner(View currentView, /*View nextView,*/ float xBy, boolean willBeHiden) {
            this.mCurrent = currentView;
    //        this.mNext = nextView;
            this.mXBy = xBy;
            this.mWillBeHidden = willBeHiden;
        }

        public void run() {
            runPeekAnimator(this.mCurrent, /*this.mNext,*/ this.mXBy, this.mWillBeHidden);
        }
    }
    
    private void runPeekAnimator(View view, /*View paramView2,*/ float paramFloat, boolean paramBoolean) {
        if (shouldRunPeekAnimator()) {
            float f = view.getX();
            float[] arrayOfFloat = new float[2];
            arrayOfFloat[0] = f;
            arrayOfFloat[1] = (f + paramFloat);
            mPeekAnimator = ObjectAnimator.ofFloat(view, "x", arrayOfFloat);
            mPeekAnimator.setDuration(200L);
            mPeekAnimator.addListener(new PeekAnimatorListener(view, /*paramView2,*/ paramFloat, this.mHandler,
                    paramBoolean));
            mPeekAnimator.start();
        //    this.mFragment.vibrate(200L);
        } else {
        //    this.mFragment.stopVibrating();
        }
    }
    
    class PeekAnimatorListener extends SimpleAnimatorListener {
        private final View mCurrent;

        private final Handler mHandler;

//        private final View mNext;

        private boolean mWillEndHidden;

        private final float mXBy;

        public PeekAnimatorListener(View currentView, /*View nextView,*/ float xBy, Handler handler,
                boolean hiden) {
            this.mCurrent = currentView;
//            this.mNext = nextView;
            this.mXBy = xBy;
            this.mHandler = handler;
            this.mWillEndHidden = hiden;
        }

        public void onAnimationEnd(Animator animator) {
            int delay = 0;
            if (shouldRunPeekAnimator()) {
                Log.d("OneTextActivity", "mWillEndHidden:" + mWillEndHidden);
                if (!this.mWillEndHidden) {
                    delay = 100;
                    this.mHandler.postDelayed(new MoveRunner(this.mCurrent, /*this.mNext,*/ -this.mXBy,
                            true), delay);
                } else {
                    delay = 400;
               //     this.mHandler.postDelayed(new MoveRunner(/*this.mNext,*/ this.mCurrent, this.mXBy,
               //             false), delay);
                    this.mHandler.postDelayed(new MoveRunner(this.mCurrent, /*this.mNext,*/ -this.mXBy,
                            false), delay);
                }
            }

        }
    }
    
    private boolean shouldRunPeekAnimator() {
        return true;
    }

}
时间: 2024-10-10 21:54:08

ObjectAnimator动画的相关文章

Android - 交换控件位置:基于LayoutParams的瞬间交换与基于ObjectAnimator动画效果交换

现需要交换两个控件(本文中是两个RelativeLayout),找到了两个方法: 1.使用LayoutParams改变两个layout的属性,即其相对关系(below等),实现位置的交换,但是并没有交换的动画效果,是"瞬间"交换. 2.使用animation交换控件位置,实现了我需要的动画效果. 如下图,交换layoutOne 与layoutTwo . 一.首先介绍使用LayoutParams的方法. <span style="font-size:18px;"

android——ObjectAnimator动画(一)

直接贴上集中用法 package com.example.test; import com.example.test.views.CircleView; import android.animation.Animator; import android.animation.AnimatorSet; import android.animation.Keyframe; import android.animation.ObjectAnimator; import android.animation

Android属性动画之ObjectAnimator控制

Android为我们提供了大量的动画效果,如何通过这些动画来达到我们需要的效果呢?今天就为大家总结一下ObjectAnimator动画控制事件. 该项目的的布局文件只有两个控件:ImageView和Button,在这里就不在赘述了,下面我们来看一下activity的实现: public class TwoActivity extends Activity{ private Button button;private ImageView imageView; @Override protected

自定义View时,用到Paint Canvas的一些温故,PropertyAnimation中的ObjectAnimator(动画三,“大大姐”的旋转跳跃)

转载请注明出处:王亟亟的大牛之路 上一篇讲了一些比较基础的view Animation 这篇会选PropertyAnimation的部分功能来讲一下,因为它的子类还是蛮多的,希望分的篇幅多点,然后可以讲细点 先上一下跑的效果(gif吃动画,见谅,大家可以自己run下) 这篇主要会讲以下几部分 - ObjectAnimator - AnimatorSet - PropertyValuesHolder 以及与之相关的一些知识点 Property Animation相对于我们昨天的View Anima

android动画---ObjectAnimator基本使用

一.使用objectAnimator实现下图的效果(不会做gif图) 点击前: 点击后 方法介绍: public static ObjectAnimator ofFloat(Object target, String propertyName, float... values) 第一个参数用于指定这个动画要操作的是哪个控件 第二个参数用于指定这个动画要操作这个控件的哪个属性 第三个参数是可变长参数,这个就跟ValueAnimator中的可变长参数的意义一样了,就是指这个属性值是从哪变到哪. ac

android属性动画

一.概述 android动画总共分为三种逐帧动画.补间动画.属性动画. 逐帧动画:主要就是将几张图片放在一起播放形成动画. 补间动画:补间动画还是比较局限的,能实现view的旋转.横竖拉伸.横竖平移.透明度等简单的变化. 由于android速度发展之快,原有的两种动画已经不能满足我们的需求,所以android在3.0版本推出了一个高大上的动画效果,属性动画. 二.相关API: ValueAnimator:属性动画的执行类,主要负责计算各个帧所对应的属性的值,可以处理动画的更新事件,它可以定义属性

Android动画--属性动画Property Animation

简介 属性动画包含: ObjectAnimator 动画的执行类 ValueAnimator 动画的执行类 AnimatorSet 用于控制一组动画的执行:线性,一起,每个动画的先后执行等. AnimatorInflater 用户加载属性动画的xml文件 ObjectAnimator 单一属性动画 缩放X轴:ScaleX ObjectAnimator().ofFloat(imageView,"ScaleY",1.0f,0.0f).setDuration(3000).start(); 缩

Android 动画系列

Android种最常用的动画: ~1~Tween动画,就是对场景里的对象不断的进行图像变化来产生动画效果(旋转.平移.放缩和渐变) Tweene Animations 主要类: Animation   动画 AlphaAnimation 渐变透明度 RotateAnimation 画面旋转 ScaleAnimation 渐变尺寸缩放 TranslateAnimation 位置移动 AnimationSet  动画集 以自定义View为例,该View很简单,画面上只有一个图片. 现在我们要对整个V

ObjectAnimator之PropertyValuesHolder与Keyframe----实现电话响铃震动和小球自由抛体效果

首先需要实现的俩种效果图 1.实现电话响铃震动效果 2.小球自由抛体效果 一.PropertyValuesHolder 1.概述 PropertyValuesHolder这个类的意义就是,它其中保存了动画过程中所需要操作的属性和对应的值.我们通过ofFloat(Object target, String propertyName, float- values)构造的动画,ofFloat()的内部实现其实就是将传进来的参数封装成PropertyValuesHolder实例来保存动画状态.在封装成P