动画三部曲--补间动画

图片从慢慢退出,过程中通过缩放、渐变等实现动画效果

将缩放的参数写入xml 中,translate_animation.xml

<translate
    xmlns:android="http://schemas.android.com/apk/res/android"

    android:fromXDelta="0"
    android:fromYDelta="0"
    android:toXDelta="100"
    android:toYDelta="100"
    />

加载播放动画

        ImageView iv = findViewById(R.id.book_anim2);
        Animation animation = AnimationUtils.loadAnimation(this, R.anim.translate_animation);
        iv.setAnimation(animation);

先看下,类UML 关系,Animation 抽象类,有4个子类,子类实现 applyTransformation 具体的属性更改

 

看下底层怎样加载
AnimationUtils.loadAnimation(this, R.anim.translate_animation);

   public static Animation loadAnimation(Context context, @AnimRes int id)
            throws NotFoundException {

        XmlResourceParser parser = null;
        try {
            parser = context.getResources().getAnimation(id);
            return createAnimationFromXml(context, parser);

        } ...
    }

解析xml ,根据不同的标签,创建不同的子类,解析具体属性

private static Animation createAnimationFromXml(Context c, XmlPullParser parser,
        AnimationSet parent, AttributeSet attrs) throws XmlPullParserException, IOException {

...
    while (((type=parser.next()) != XmlPullParser.END_TAG || parser.getDepth() > depth)
           && type != XmlPullParser.END_DOCUMENT) {

        if (type != XmlPullParser.START_TAG) {
            continue;
        }

        String  name = parser.getName();

        if (name.equals("set")) {
            anim = new AnimationSet(c, attrs);
            createAnimationFromXml(c, parser, (AnimationSet)anim, attrs);
        } else if (name.equals("alpha")) {
            anim = new AlphaAnimation(c, attrs);
        } else if (name.equals("scale")) {
            anim = new ScaleAnimation(c, attrs);
        }  else if (name.equals("rotate")) {
            anim = new RotateAnimation(c, attrs);
        }  else if (name.equals("translate")) {
            anim = new TranslateAnimation(c, attrs);
        } else if (name.equals("cliprect")) {
            anim = new ClipRectAnimation(c, attrs);
        } else {
            throw new RuntimeException("Unknown animation name: " + parser.getName());
        }

        if (parent != null) {
            parent.addAnimation(anim);
        }
    }

    return anim;

}

View.java 添加动画的时候,开始动画

public void setAnimation(Animation animation) {
    mCurrentAnimation = animation;

    if (animation != null) {
        // If the screen is off assume the animation start time is now instead of
        // the next frame we draw. Keeping the START_ON_FIRST_FRAME start time
        // would cause the animation to start when the screen turns back on
        if (mAttachInfo != null && mAttachInfo.mDisplayState == Display.STATE_OFF
                && animation.getStartTime() == Animation.START_ON_FIRST_FRAME) {
            animation.setStartTime(AnimationUtils.currentAnimationTimeMillis());
        }
        animation.reset();
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值