王学岗的属性动画上(六)——监听动画的执行

原创 2015年11月20日 22:27:27

布局文件只有一张图片,此处省略;
本篇文章是监听动画的执行。

package com.example.propertyOfGang;

import android.animation.Animator;
import android.animation.Animator.AnimatorListener;
import android.animation.ObjectAnimator;
import android.animation.PropertyValuesHolder;
import android.animation.TypeEvaluator;
import android.animation.ValueAnimator;
import android.animation.ValueAnimator.AnimatorUpdateListener;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.graphics.PointF;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ImageView;

/**
 * @author acer
 *第六个案例
  图片执行完抛物线效果后在执行缩放操作,注意缩放与抛物线不是同时执行
 */
@SuppressLint("NewApi")
// 新的API,支持的最低版本是11
public class MainActivity extends Activity implements OnClickListener {

    private ImageView iv_zhangxin;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        iv_zhangxin = (ImageView) findViewById(R.id.imageView1);
        iv_zhangxin.setOnClickListener(this);
        // 可以在这里查看有什么属性
        // iv_zhangxin.setRotationX(rotationX);
        // iv_zhangxin.setAlpha(alpha);
        // iv_zhangxin.setTranslationX(translationX);

    }

    @Override
    public void onClick(View v) {
        final int duration=3000;//t为三秒,代表总时间,总时间没必要改变
        //3)ValueAnimator的作用是用来计算属性的,同时监听动画的执行过程,让我们自己来实现具体功能。
        ValueAnimator valueAnimator=new ValueAnimator();
        valueAnimator.setDuration(duration);//时间
        //1)给估值器设置一个默认的中心点对象,当估值器运行的时候,它会把每一个坐标的点(x,y)估值到
        //PointF上。
        valueAnimator.setObjectValues(new PointF(0,0));
        //2)估值器返回的是当前的某个点,某个点的坐标,添加估值器就是为了计算每一个点的。
        //点的坐标要自己计算。自己计算抛物线的轨迹,自己计算每个点的(x,)坐标。
        //3)估值器:用来计算我们的view在屏幕中显示的位置(运动的轨迹:平移、缩放、抛物线等等)。
        valueAnimator.setEvaluator(new TypeEvaluator<PointF>() {
            //泛型,放数据对象,对象要有意义,对象可以使int,double,或者自己定义的类
            @Override
            public PointF evaluate(float fraction, PointF startValue,
                    PointF endValue) {
                //4.1)计算x
                //1>创建一个点,抛物线是由无数个点组成的,需要计算每个点的坐标
                PointF pointF=new PointF();
                //2>fraction表示百分比,代表当前执行到了什么程度。
                //百分比是怎么计算的呢?fraction=t/duration
                //3>t表示当前时间,当前时间是什么呢?比如我运行到一秒,运行到两秒
                //时间:t=fraction*duration
                //4>pointF.x表示距离
                //x=t*s()
                //5>速度我们自己定义,自己定义为s=100px/s; 
                float t=fraction*3;//计算当前时间,不能写成fraction*duration,因为duration在这里表示为3000秒
                pointF.x= 100*t ; //计算当前执行的距离
                //4.2)计算Y
                //1>  y=0.5*g*t^2(g为重力加速度)
                //重力加速度不够,增加十倍
                pointF.y=0.5f*98f*t*t;//0.5f不能写成1/2,因为1/2的结果为0
                return pointF;
            }
        });
        //执行动画效果
        valueAnimator.start();
        //使用估值器计算完抛物线轨迹,计算出每个点的轨迹后,添加位置的监听
        //让视图走起来,更新每个点,更新View的坐标
        valueAnimator.addUpdateListener(new AnimatorUpdateListener() {

            @Override
            public void onAnimationUpdate(ValueAnimator animation) {
                    PointF pointF=(PointF) animation.getAnimatedValue();
                    iv_zhangxin.setX(pointF.x);
                    iv_zhangxin.setY(pointF.y);

            }
        });
        //照片旋转,投篮游戏就是这么做成的。
        //旋转动画
             ObjectAnimator objectAnimator=ObjectAnimator.ofFloat(iv_zhangxin, "rotationY", 0.0f,360.f)
                     .setDuration(2000);
             objectAnimator.start();

             //1)执行缩放操作
             //1>添加动画的执行监听
             valueAnimator.addListener(new AnimatorListener() {
                //动画开始
                @Override
                public void onAnimationStart(Animator animation) {
                    // TODO Auto-generated method stub

                }
                //动画正在执行
                @Override
                public void onAnimationRepeat(Animator animation) {
                    // TODO Auto-generated method stub

                }
                //动画结束
                @Override
                public void onAnimationEnd(Animator animation) {
                    // TODO Auto-generated method stub
                    ObjectAnimator.ofFloat("iv_zhangxin", "scaleX", 0.0f,1.0f).setDuration(1000).start();
                }
                //动画取消
                @Override
                public void onAnimationCancel(Animator animation) {
                    // TODO Auto-generated method stub

                }
            });
    }

}

相关文章推荐

自定义控件三部曲之动画篇(四)——ValueAnimator基本使用

前言:不要让别人的无知断送了你的梦想,永远坚信你所坚信的。一、概述long long ago,我写过几篇有关Animation的文章,讲解了传统的alpha、scale、translate、rotat...

android 属性动画监听

android 属性动画结束监听 如果用的是AnimatorSet,那么只要其中一个没有结束都不会调用onAnimationEnd方法 自定义差值器如果return 0;那么表示不会改变 重复动画OO...

Android属性动画欣赏——ObjectAnimator与动画监听事件

本篇博客简单涉及了Android中的属性动画,并且实现了一个简单的“卫星菜单”。...

图片剪裁控件——ClipImageView

图片剪裁控件,轻松实现对图片的剪裁

Android 椭圆路径 长按暂停动画的实现

最近在做一个长按暂停的动画控件,实现的效果是这样,定义一个矩形椭圆动画效果的的按钮。效果如下:...

王学岗的属性动画上(二)——objectAnimator的非主流用法

布局文件只有一张图片,不再列举 package com.example.propertyOfGang;import android.animation.ObjectAnimator; import...

王学岗属性动画上(十一)——属性动画的综合应用

一,前言;嗨大家好,这次的动画内容是要把前几篇微博中用到的知识综合在一起,做出一个更有难度的效果。什么效果呢?先设置两个布局,一个隐藏,一个显示; 布局(类似于前几篇文章中的iv_zhangx...

王学岗csdn实现闪屏界面———策略模式+属性动画

欢迎(闪屏界面) 布局

王学岗属性动画上(四)------ValueAnimator的应用

package com.example.propertyOfGang;import android.animation.ObjectAnimator; import android.animatio...

王学岗的属性动画上(五)------抛物线效果的实现

布局文件只有一张图片啦 package com.example.propertyOfGang;import android.animation.ObjectAnimator; import and...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:王学岗的属性动画上(六)——监听动画的执行
举报原因:
原因补充:

(最多只允许输入30个字)