objectAnimation与ValueAnimation的使用

在给控件做动画的时候,我一直都是使用animation的基本动画来给控件界面添加动画,能简单肯定不会用复杂的,我记得在我刚开始的时候要做一个效果,就是要按钮移动然后结束以后固定到结束的点,我记得当时的我是通过给动画添加监听器来判断动画结束的时候,然后让动态设置控件的位置,但是随着对android接触的越来越多,我渐渐的觉得自己当时的方法是相当的笨。

                 下来就说下objectAnimation跟 ValueAnimation吧:

objectAnimation:

这个子类ValueAnimator支持动画的目标对象上的属性。这类带参数的构造函数定义的目标对象动画以及属性的名称,将动画。然后确定适当的设置/获取函数内部和动画将调用这些函数作为必要的动画属性。

         也就是这个动画可以修改view的属性,还能固定他的显示位置,那么就很简单了

ValueAnimation

这个类提供了一个简单的计时引擎运行动画动画计算值和设置在目标对象。
有一个所有动画使用的定时脉冲。它运行在一个自定义处理程序以确保属性更改在UI线程上发生。
默认情况下,ValueAnimator使用非线性插值,通过AccelerateDecelerateInterpolator类,它加速,减慢的动画。这种行为可以改变callingsetInterpolator(TimeInterpolator)。

 
   这个是说动画的所有属性都可以让我们控制,使用更加灵活。

其实学习这个是我在想要画一个抛物线的时候,当我画完了以后我就想抛物线的动画挺好看,然后就研究了下,总结了四种抛物线的动画实现。

 
      (1)

 

public static  int mCount;
    /**
     * 整个抛物线
     * @param imageView
     */
    public static void startAnimation(final View view) {
    	mCount = 300;
        Keyframe[] keyframes = new Keyframe[mCount];
        final float keyStep = 1f / (float) mCount;
        float key = keyStep;
        for (int i = 0; i < mCount; ++i) {
            keyframes[i] = Keyframe.ofFloat(key, i+ 1);
            key += keyStep;
        }  

        PropertyValuesHolder pvhX = PropertyValuesHolder.ofKeyframe("translationX", keyframes);
        key = keyStep;
        for (int i = 0; i < mCount; ++i) {
            keyframes[i] = Keyframe.ofFloat(key, -getY(i + 1));
            key += keyStep;
        }  

        PropertyValuesHolder pvhY = PropertyValuesHolder.ofKeyframe("translationY", keyframes);
        ObjectAnimator yxBouncer = ObjectAnimator.ofPropertyValuesHolder(view, pvhY, pvhX).setDuration(3000);
        yxBouncer.setInterpolator(new BounceInterpolator());
        yxBouncer.start();
    }  
 <pre name="code" class="java">   public static final float a = -1f / 75f;  

    /**
     * 这里是根据三个坐标点{(0,0),(300,0),(150,300)}计算出来的抛物线方程
     *
     * @param x
     * @return
     */
    public static  float getY(float x) {
    	if (x>300) {
			x= 300;
		}
        return a * x * x + 4 * x;
    }  


         (2)

 

 /**
     * 半个抛物线,从上向下
     * @param imageView
     */
    public static void starthalfAnimation(final View view) {
    	mCount = 150 ;
        Keyframe[] keyframes = new Keyframe[mCount];
        final float keyStep = 1f / (float) mCount;
        float key = keyStep;
        for (int i = 0; i < mCount; ++i) {
            keyframes[i] = Keyframe.ofFloat(key, i+ 150);
            key += keyStep;
        }  

        PropertyValuesHolder pvhX = PropertyValuesHolder.ofKeyframe("translationX", keyframes);
        key = keyStep;
        for (int i = 0; i < mCount; ++i) {
            keyframes[i] = Keyframe.ofFloat(key, -getY(i + 150));
            key += keyStep;
        }  

        PropertyValuesHolder pvhY = PropertyValuesHolder.ofKeyframe("translationY", keyframes);
        ObjectAnimator yxBouncer = ObjectAnimator.ofPropertyValuesHolder(view, pvhY, pvhX).setDuration(3000);
        yxBouncer.setInterpolator(new BounceInterpolator());
        yxBouncer.start();
    }  

   (3)

//也是抛物线
    public static void parabolaAnimation(View view){
    	PropertyValuesHolder holderY = PropertyValuesHolder.ofFloat("translationY", 0.0f,180f);
    	PropertyValuesHolder holderX = PropertyValuesHolder.ofFloat("translationX", 0.0f,180f);
    	ObjectAnimator.ofPropertyValuesHolder(view,holderX,holderY).setDuration(2000).start();
    }
    

      (4) 

public static void ParabolaValueAnimation(final View view){
    	ValueAnimator valueAnimator = new ValueAnimator();
    	valueAnimator.addListener(new AnimatorListener() {

			@Override
			public void onAnimationStart(Animator animation) {

			}

			@Override
			public void onAnimationRepeat(Animator animation) {

			}

			@Override
			public void onAnimationEnd(Animator animation) {
				/*ViewGroup group = (ViewGroup) view.getParent();
				if (group != null) {
					group.removeView(view);
				}*/
			}

			@Override
			public void onAnimationCancel(Animator animation) {

			}
		});
    	valueAnimator.setDuration(3000);
    	valueAnimator.setObjectValues(new PointF(0, 0));
    	valueAnimator.setInterpolator(new BounceInterpolator());
    	valueAnimator.setEvaluator(new TypeEvaluator<PointF>() {
    		/**
    		 *
    		 * @param fraction  从0。0 -  1.0
    		 * @param startValue
    		 * @param endValue
    		 * @return
    		 */
			@Override
			public PointF evaluate(float fraction, PointF startValue,
					PointF endValue) {
				PointF pointF= new PointF();
				Log.e("point", fraction+"");
				pointF.x = 200 * fraction * 3/2;
				pointF.y = 0.5f * 200 * (fraction * 3) * (fraction * 3)/2;
				return pointF;
			}
		});

    	valueAnimator.start();
    	valueAnimator.addUpdateListener(new AnimatorUpdateListener() {

			@Override
			public void onAnimationUpdate(ValueAnimator animation) {
				PointF pointF = (PointF)animation.getAnimatedValue();
				view.setTranslationX(pointF.x);
				view.setTranslationY(pointF.y);
			}
		});
    }

  我实验了多种动画,可以看看。

Demo:http://download.csdn.net/detail/u012808234/9095419

时间: 2024-12-30 20:19:21

objectAnimation与ValueAnimation的使用的相关文章

ontouchevent-在onTouchEvent()时间里面加了一个scale 缩放动画效果,效果和预期不同

问题描述 在onTouchEvent()时间里面加了一个scale 缩放动画效果,效果和预期不同 //设置动画属性 animation = new ScaleAnimation(1.0f, 0.5f, 1.0f, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f,Animation.RELATIVE_TO_SELF, 0.5f); animation.setDuration(500);// 设置动画持续时间 animation.setRepeatCount(1);//

Android实现评论栏随Recyclerview滑动左右移动_Android

最近在玩一个叫"约会吧"的应用,也是在看直播app,默认下载安装的,安装点进去看这个应用做的不错,就留下来了.然后看他们动态详情页底部有一个效果:Recyclerview滑动到的评论列表的时候,底部点赞那栏会往左滑动,出现一个输入评论的栏:然后下拉到底部的时候输入评论栏会往右滑动,出现点赞栏.详细细节直接来看效果图吧. 其实这种效果现在在应用中还是很常见的,有上拉,toolbar.底部view隐藏,下拉显示,或者像现在约会吧这样左右滑动的效果.而且网上资料现在也有很多,有通过Objec

Android知识点总结

里边有些没有写,慢慢整理中!!! Android知识总结: Activity: 用来跟用户来进行交互的界面,使用过程中要注意的就是他的生命周期, onCreate的时候只是加载布局文件,进行控件的初始化,这个时候用户还看不到界面,只有在onStart以后,用户才能看的到界面,但是还不能跟界面进行交互.也就是这一步界面的初始化都已经完成,当onResume执行以后,界面可以接收用户的交互,点击,触摸等手势操作. OnPause, onStop的调用是在当界面从新边的不可见的时候调用,(点home键

属性动画基础之ValueAnimator

概述 属性动画是谷歌在android3.0(API level 11)时候给我们带来了属性动画,真正意义上带来了"动画",以前的帧动画也就4中效果的组合(旋转.淡入淡出.放大缩小.平移),而且只是表面的动画,最经典的比如,把一个button按钮移动到另一个位置,然后去点击,一点反应都没有,但是点击原来空白位置仍然有点击事件触发前一篇博客就提到这个问题(传动动画).而属性动画彻彻底底解决这个问题.属性动画分为valueAnimator和ObjectAnimator两大类,这里简单总结下v

WPF案例(-)模拟Windows7 Win+Tab切换

原文:WPF案例(-)模拟Windows7 Win+Tab切换     一个使用Wpf模拟Windows7 Win+Tab页面切换的小程序,使用快捷键Ctrl+Down或Ctrl+Up在示例程序各个页面元素之间滑动导航,在本例中,使用Viewport2DVisual3D宿主二维控件,在这里为方便示例,二维控件仅简单的使用了一个Image,以下是界面缩略图,有兴趣的朋友可以下载源码       在建立本示例中的三维场景时,使用了Viewport3D,PerspectiveCamera,Ambien

Activity切换动画--模糊、水波纹、折叠效果 ...

Enhance Activity switch animation. source code : https://github.com/dkmeteor/ActivityAnimationLib 这是2个Activity切换动画,提供了单独的一套接口,可以实现基于Canvas . Martrix .或 Bitmap级的动画效果   目前提供(右上角menu切换): water folder blur skew close split 6种动画效果. split是基于ObjectAnimation

Android 用属性动画自定义view的渐变背景

自定义view渐变背景,同时监听手势自动生成小圆球.   宿主Activity如下:   package com.edaixi.tempbak; import java.util.ArrayList; import android.animation.Animator; import android.animation.AnimatorListenerAdapter; import android.animation.AnimatorSet; import android.animation.A

Android实现评论栏随Recyclerview滑动左右移动

最近在玩一个叫"约会吧"的应用,也是在看直播app,默认下载安装的,安装点进去看这个应用做的不错,就留下来了.然后看他们动态详情页底部有一个效果:Recyclerview滑动到的评论列表的时候,底部点赞那栏会往左滑动,出现一个输入评论的栏:然后下拉到底部的时候输入评论栏会往右滑动,出现点赞栏.详细细节直接来看效果图吧. 其实这种效果现在在应用中还是很常见的,有上拉,toolbar.底部view隐藏,下拉显示,或者像现在约会吧这样左右滑动的效果.而且网上资料现在也有很多,有通过Objec