图片从慢慢退出,过程中通过缩放、渐变等实现动画效果
将缩放的参数写入xml 中,translate_animation.xml
<translatexmlns: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 onif (mAttachInfo != null && mAttachInfo.mDisplayState == Display.STATE_OFF&& animation.getStartTime() == Animation.START_ON_FIRST_FRAME) {animation.setStartTime(AnimationUtils.currentAnimationTimeMillis());}animation.reset();}
}













