android 自定义动画(一)

其实动画的的本质,就是通过不断改变matrix的值,然后View根据matrix,不断的重绘制,从而形成连续变化的效果。

所以我们要自定义我们的动画,其实就是如何设置这个matrix的值的问题。view的显示都是通过这个matrix

的值来确定,包括坐标,大小等

关于android.graphics.Matrix的详细介绍请看:matrix 详细介绍

当我们给View注册一个Animation对象的时候,就可以获得这个View的 transformation matrix,这个animation的一个回调方法,

protected void applyTransformation(float interpolatedTime, Transformation t)

可以拿到这个matrix,从而我们就可以在这个方法中修改这个matrix值,来实现我们想要的动画。通过源码我们知道,其实系统提供的四种tween动画也是这么实现的。


下面看一个缩放的动画小例子:


package com.example.liaoli.animationdome.animation;

import android.graphics.Matrix;
import android.util.Log;
import android.view.animation.Animation;
import android.view.animation.DecelerateInterpolator;
import android.view.animation.Transformation;

/**
 * Created by liaoli on 2015/12/28.
 */
public class CustomAnimation_1 extends Animation {


    private static final String TAG = "CustomAnimation_1";

    @Override
    public void initialize(int width, int height, int parentWidth, int parentHeight) {
        super.initialize(width, height, parentWidth, parentHeight);


        setDuration(1000);

        setInterpolator(new DecelerateInterpolator());

        setFillAfter(true);
    }

    /**
     * 系统会不断的调用此方法来同步动画,每次参数interpolatedTime都会变化,
     * 值从0-1,表示动画进展,当interpolatedTime的值为1时表示动画结束。
     * 参数Transformation t ,可以获得当前参数Transformation Matrix的信息,
     * 我们的目的,或者说动画的本质就是修改这个矩阵的值。每次传入的都是单位矩阵
     * 这是我们最初的那个矩阵,没有发生动画之前的那个矩阵
     * 根据动画进行的进度(interpolatedTime)。我们会给矩阵设置不同的值
     * viewpaint时,新的matrix起作用,形成动画效果。
     *
     *
     * @param interpolatedTime  是怎么产生的?这个值是我们设置的插值器在
     *                          getTransformation(long currentTime, Transformation outTransformation)
     *                          根据时间生成的,
     * @param t 是个什么东西?Transformation 类包含一个透明度属性 和一个Matrix
     *          透明度就是view的透明度,注意此Matrix是没有播放动画时view对应的Matrix
     *          其实就是一个3x3的单位矩阵
     */
    @Override
    protected void applyTransformation(float interpolatedTime, Transformation t) {
        //super.applyTransformation(interpolatedTime, t);

        Matrix matrix = t.getMatrix();

        Log.e(TAG,"----------start----------");



        Log.e(TAG,"interpolatedTime = " + interpolatedTime);
        Log.e(TAG,"interpolatedTime = " + interpolatedTime);
        Log.e(TAG,"Transformation t = " + t);

        Log.e(TAG,"Transformation t  matrix= " + matrix);

        /**
         *
         * 缩放,
         * interpolatedTime的值是从0变到1         * 这里我们长和宽的缩放值都为interpolatedTime,则缩放的效果则为从没有缩放到View原本的大小,
         * 我们可以任意定义这个两个值,
         * 不过最好与interpolatedTime,产生关联,应为这样动画才能持续,线性的或者非线性的,
         * 都可以。
         *
         */
        matrix.setScale(interpolatedTime, interpolatedTime);

        Log.e(TAG, "Transformation t  matrix= " + matrix);

        Log.e(TAG,"---------- end ----------");
    }


在view上使用该动画

CustomAnimation_3 customAnimation_3 = new CustomAnimation_3();
lv = (ListView)findViewById(R.id.lv);
lv.startAnimation(customAnimation_3);

效果:







  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值