Android的Tween动画的实现框架

本文探讨了Android中的Tween动画,包括点击事件、构造参数、平移动画和旋转动画的理解。详细分析了动画执行框架,如startAnimation、applyTransformation和getTransformation等关键函数。还介绍了不同类型的插值器,并通过实例解释了平移和旋转动画的正负值区别,以及RotateAnimation的pivot参数如何确定旋转原点。文章提供了参数错误示例,强调理解动画坐标系统的重要性。
摘要由CSDN通过智能技术生成

在写程序的时候遇到了Tween动画几个问题:

1,  执行动画的时候点击事件仍然在动画开始的位置?

2,  XXXAnimation的构造参数里面的值具体是什么意思?

3,  平移动画中fromXValue和toXValue旋转动画中fromDegrees和toDegrees取负值有什么不同??(相信很多人也有疑惑)

4,  RotateAnimation的int pivotXType, float pivotXValue, int pivotYType, float pivotYValue四个参数是怎么确定旋转原点的?确定的旋转原点在哪里?

Android动画分为:

Tween Animation  View动画也叫补间动画

Drawable Animation  也叫Frame 帧动画

Property Animation(3.0以后加入)

主要研究Tween动画

我在写程序的时候经常由于参数设置不当(主要是从多少度旋转为多少度,有时是负的度数)得不到想要的效果。因此打算把动画的实现框架研究一下。

研究之前请看这篇文章:Android中图像变换Matrix的原理  了解一下Matrix矩阵的相关知识。明白图形的各种转换就是要得到对应的变换矩阵。


首先说一下动画的大概绘制框架过程,不然由于我写的比较乱可能看晕了。

调用startAnimation会设置与View关联的animation,然后会重绘视图,重绘视图的时候调用到drawChild,这时获取与View绑定的Animation,不为null了,只要动画时间没有结束就会通过绘制的时间获得变换矩阵,然后将画布原点平移到视图的左上角?(是不是这样?)绘制新的一帧。绘制完又会重绘,然后获取新的一帧的转换矩阵…..循环下去,直到动画结束就不再重绘视图了。

回到View的onDraw函数里面,onDraw函数做了如下工作。

1. Draw the background

2. If necessary, save the canvas' layers toprepare for fading

3. Draw view's content

4. Draw children

5. If necessary, draw the fading edges andrestore layers

6. Draw decorations (scrollbars forinstance)

当是ViewGroup的时候会执行第四步,dispatchDraw(canvas); 

@Override
protected void dispatchDraw(Canvas canvas) {
// LayoutAnimationController比较熟悉,是让ViewGroup的子控件有动画效果,以前没发现竟然也是在这里发生的。
final LayoutAnimationController controller = mLayoutAnimationController;
		...
       // We will draw our child's animation, let's reset the flag
//下面对子View动画进行处理。
        mPrivateFlags &= ~DRAW_ANIMATION;
        mGroupFlags &= ~FLAG_INVALIDATE_REQUIRED;
        boolean more = false;
        final long drawingTime = getDrawingTime();
        if ((flags & FLAG_USE_CHILD_DRAWING_ORDER) == 0) {
            for (int i = 0; i < count; i++) {
                final View child = children[i];
                if ((child.mViewFlags & VISIBILITY_MASK) == VISIBLE || child.getAnimation() != null) {
                    more |= drawChild(canvas, child, drawingTime);
                }
            }
        } else {
            for (int i = 0; i < count; i++) {
                final View child = children[getChildDrawingOrder(count, i)];
                if ((child.mViewFlags & VISIBILITY_MASK) == VISIBLE || child.getAnimation() != null) {
                    more |= drawChild(canvas, child, drawingTime);
                }
            }
        }
		...
    }

肯定会执行到drawChild(canvas, child, drawingTime); 在该函数顾名思义就是绘制子控件。

protected boolean drawChild(Canvas canvas, View child, long drawingTime) {
        boolean more = false;

        final int cl = child.mLeft;
        final int ct = child.mTop;
        final int cr = child.mRight;
        final int cb = child.mBottom;

        final int flags = 
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值