animation of android (3)

视图动画,只有view可以使用。

在android3.0以后,属性动画。

ValueAnimation 可以记录属性变化的过程,所以他的对象是任何object。

所以ValueAnimation 的真正目的就是对object的某个值做一系列根据setInterpolator的值变化函数。

而ValueAnimation 有AnimatorUpdateListener的回调,以每个10ms的间隔,反馈随着时间的变化值。

具体代码如下:

package com.joyfulmath.animatatorsamples;

import android.animation.ValueAnimator;
import android.animation.ValueAnimator.AnimatorUpdateListener;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.Paint.Align;
import android.graphics.Paint.FontMetrics;
import android.util.AttributeSet;
import android.util.Log;
import android.view.View;
import android.view.animation.BounceInterpolator;

public class ValueAnimationView extends View {

    private static final String TAG = "ValueAnimationView";
    private Context mContext = null;
    private Paint mPaint = null;
    private float mX = 0;
    float topY = 0;
    private ValueAnimator mValueAnimator = null;
    public ValueAnimationView(Context context) {
        this(context, null);
    }

    public ValueAnimationView(Context context, AttributeSet attrs) {
        this(context, attrs, 0);
    }

    public ValueAnimationView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        Log.d(TAG, "ValueAnimationView");
        mContext = context;
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        Log.d(TAG, "onDraw:mX\t"+mX);
        canvas.drawColor(0xffffff00);
        canvas.save();
        canvas.translate(0, 0);
        canvas.drawText(TAG, mX, mX-topY, mPaint);
        canvas.restore();
    }

    @Override
    protected void onAttachedToWindow() {
        super.onAttachedToWindow();
        Log.d(TAG, "onAttachedToWindow");
        mPaint = new Paint();
        mPaint.setTextSize(18);
        mPaint.setTextAlign(Align.LEFT);
        mPaint.setColor(0xffff0000);
        mPaint.setAntiAlias(true);
        FontMetrics fontMetrics = mPaint.getFontMetrics();
        topY = fontMetrics.top;
        float ascentY = fontMetrics.ascent;
        float descentY = fontMetrics.descent;
        float bottomY = fontMetrics.bottom;
        Log.d(TAG, "onAttachedToWindow fontMetrics  topY:" + topY
                + "\t ascentY:" + ascentY + "\t descentY:" + descentY
                + "\t bottomY:" + bottomY);
    }

    @Override
    protected void onDetachedFromWindow() {
        super.onDetachedFromWindow();
    }

    public void createAnimator()
    {
        if(mValueAnimator == null)
        {
            mValueAnimator = ValueAnimator.ofFloat(0.0f, 50.0f);
            mValueAnimator.setDuration(1000);
            mValueAnimator.setInterpolator(new BounceInterpolator());
            mValueAnimator.addUpdateListener(new AnimatorUpdateListener() {

                @Override
                public void onAnimationUpdate(ValueAnimator animation) {
                    mX = (Float) animation.getAnimatedValue();
                    invalidate();
                }
            });
        }

    }

    public void startValueAmimator()
    {
        Log.d(TAG, "startValueAmimator");
        createAnimator();
        mValueAnimator.start();
    }
}

上面的代码,是自定义view,实现动画的一个基础。

关键就是每次OnDraw的时候,获取objcet动画的属性。

而触发条件就是:

            mValueAnimator.addUpdateListener(new AnimatorUpdateListener() {

                @Override
                public void onAnimationUpdate(ValueAnimator animation) {
                    mX = (Float) animation.getAnimatedValue();
                    invalidate();//触发onDraw
                }
            });
        }

所以valueObjcet的关键就是会在动画过程中改变object的属性,以此来决定如何通过这个变化来实现动画。

时间: 2024-11-03 03:41:05

animation of android (3)的相关文章

animation of android (2)

android Interpolator 首先是android系统提供的变换方式: 这些方式将转载一篇文章: 转: http://www.cnblogs.com/mengdd/p/3346003.html Android中的Interpolator Android中的Interpolator Interpolator用于动画中的时间插值,其作用就是把0到1的浮点值变化映射到另一个浮点值变化. 本文列出Android API提供的Interpolator的若干种实现,列出源码,并且用一个程序绘制出

Android(java)学习笔记207:开源项目使用之gif view

1. 由于android没有自带的gif动画,我在Android(java)学习笔记198:Android下的帧动画(Drawable Animation) 播客中提到可以使用AnimationView(帧动画)方法先将一个gif动画利用软件分割成若干静态图片,然后按照一定的时间间隔和播放顺序一帧一帧播放图片,从而给用户体验仿佛是动画gif播放的效果 2.其实网上的开源项目中有更为完善的gif动画播放的代码,下面以此为例进一步了解开源项目的使用: (1)在https://github.com/网

Android(1)

     android(Google公司开发的操作系统) Android是一种基于Linux的自由及开放源代码的操作系统,主要使用于移动设备,由Google公司和开放手机联盟领导及开发.Android平台由操作系统.中间件.用户界面和应用软件组成. JVM和Dalvik VM( Android的虚拟机)的比较(虚拟机) DVM指dalivk的虚拟机.每一个Android应用程序都在它自己的进程中运行,都拥有一个独立的Dalvik虚拟机实例,而每一个DVM都是在Linux 中的一个进程. And

Android(Xamarin)之旅(四)

这么晚了,可能也因为一点事情,就说打开博客园看看,结果 http://www.cnblogs.com/mindwind/p/5125248.html 这篇文章瞬间吸引了我.暗暗的回想一下,十年之后,我是什么样子,还是那样吗?为了生计奔波,为了那点渺茫的未来去争取…… 在写这个的时候,我突然发现,我写的上一篇 三,竟然被转载了,哈哈,欢迎技术交流. 直接开始吧. Android(Xamarin)之旅(一) 这片文章说到了Xamain的简单配置,Android文件的目录清单文件,还有一些简单的控件.

Java基础知识强化之多线程笔记01:多线程基础知识(详见Android(java)笔记61~76)

1. 基础知识: Android(java)学习笔记61:多线程程序的引入    ~    Android(java)学习笔记76:多线程-定时器概述和使用 

Android(java)学习笔记167:Java中操作文件的类介绍

1.File类:对硬盘上的文件和目录进行操作的类.    File类是文件和目录路径名抽象表现形式  构造函数:        1) File(String pathname)       Creates a new File instance by converting the given pathname string into an abstract pathname. 2)File(File parent, String child)       Creates a new File i

Android(java)学习笔记205:网易新闻客户端应用编写逻辑过程

1.我们的项目需求是编写一个新闻RSS浏览器,RSS(Really Simple Syndication)是一种描述和同步网站内容的格式,是使用最广泛的XML应用.RSS目前广泛用于网上新闻频道,blog和wiki,主要的版本有0.91, 1.0, 2.0.使用RSS订阅能更快地获取信息,网站提供RSS输出,有利于让用户获取网站内容的最新更新.网络用户可以在客户端借助于支持RSS的聚合工具软件,在不打开网站内容页面的情况下阅读支持RSS输出的网站内容. 例如如下的网易RSS订阅: 2.由于我们这

从零开始学习Android(一)Android环境的搭建

好久没有开始写博客了,最近开始学习Android,所以想把学习的笔记都一一记录下来.一来是方便自己以后资料的查询,其次也是给Android新手朋友进行学习使用,再次也希 望得到高手的指点.废话少说,我们正式进入主题. 首先,既然我们说了是从零开始,那我们自然第一步就应该是环境的搭建了. 1.下载 工欲善其事必先利其器.一个好的开发工具必然让我们事半功倍,这里我们选择的是google官网所提供的ADT(Android Developer Tools).由于大陆对Google的限制,可能 会导致我们

Android(java)学习笔记204:自定义SmartImageView(继承自ImageView,扩展功能为自动获取网络路径图片)

1.有时候Android系统配置的UI控件,不能满足我们的需求,Android开发做到了一定程度,多少都会用到自定义控件,一方面是更加灵活,另一方面在大数据量的情况下自定义控件的效率比写布局文件更高. 2.下面我们是自定义一个SmartImageView继承自ImageView,扩展了ImageView的功能:     步骤: • 新建一个SmartImageView类,让继承自ImageView(放置特定的包下): • 实现SmartImageView类下的构造方法,最好全部实现,这个不容易出