视图动画实现类的分工

视图动画的实现是不停的刷新绘制区域,而绘制区域是根据刷新时的时间动态变化的,这样就形成了动画。视图动画的实现与三个类密切相关,一个就是视图本身View.java,一个是Animation.java,还有一个是Transformation.java。本文分析这三个类在视图动画框架中的分工。首先我们分析View.java,回到区域刷新绘制的地方,drawAnimation()函数。

    private boolean drawAnimation(ViewGroup parent, long drawingTime,
            Animation a, boolean scalingRequired) {
        Transformation invalidationTransform;
...
        boolean more = a.getTransformation(drawingTime, parent.mChildTransformation, 1f);

...
                final RectF region = parent.mInvalidateRegion;
                a.getInvalidateRegion(0, 0, mRight - mLeft, mBottom - mTop, region,
                        invalidationTransform);//region的赋值
...

                final int left = mLeft + (int) region.left;
                final int top = mTop + (int) region.top;
                parent.invalidate(left, top, left + (int) (region.width() + .5f),//刷新调用
                        top + (int) (region.height() + .5f));
            }
        }
        return more;
    }
这里从“刷新调用”处可以清楚的知道,视图动画动态的获取了region这一矩形区域的数据,从而实现的动画效果。那么重要的就是region的数据是如何更新的,如"region的赋值"处,它的数据更新在Animation.java的getInvalidateRegion()函数中:

    public void getInvalidateRegion(int left, int top, int right, int bottom,
            RectF invalidate, Transformation transformation) {

        final RectF tempRegion = mRegion;
        final RectF previousRegion = mPreviousRegion;

        invalidate.set(left, top, right, bottom);
        transformation.getMatrix().mapRect(invalidate);//Transformation.java类的唯一应用,正是在这里影响了整个的绘制区域
        // Enlarge the invalidate region to account for rounding errors
        invalidate.inset(-1.0f, -1.0f);
...
    }
这里我们需要知道Transformation.java类的作用,这个类包含两个属性,一个是Matrix,一个是Alpha。这两个属性都是与图形密切相关的。上面这个函数中的invalidate就是前面调用中的region的形参,而transformation正是前面调用中的invalidationTransformation的形参。

    public boolean getTransformation(long currentTime, Transformation outTransformation) {
        if (mStartTime == -1) {
            mStartTime = currentTime;
        }

        final long startOffset = getStartOffset();
        final long duration = mDuration;
        float normalizedTime;
        if (duration != 0) {
            normalizedTime = ((float) (currentTime - (mStartTime + startOffset))) /
                    (float) duration;
        } else {
            // time is a step-change with a zero duration
            normalizedTime = currentTime < mStartTime ? 0.0f : 1.0f;
        }

...

            final float interpolatedTime = mInterpolator.getInterpolation(normalizedTime);
            applyTransformation(interpolatedTime, outTransformation);
        }

getTransformation()函数正是与刷新时间相关的函数,它根据时间改变Transformation中的Matrix或Alpha值。准确的来说这一功能是在applyTransformation()函数实现的,这是一个空函数,所有继承Animation.java类的子类都必须要实现这个函数,根据不同的实现方案得到了不同的动画。


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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值