ViewPager extends ViewGroup
ViewPager实现了onMeasure,onLayout,draw(),onDraw(),draw()中主要是绘制EdgeEffect(阻尼效果),onDraw中主要是绘制marginDrawable。使用VelocityTracker,Scroller及scrollTo()方法实现滑动和fling
ViewFlipper extends ViewAnimator
ViewAnimator extends FrameLayout
ViewFlipper和ViewAnimator都没有实现onMeasure,onLayout,onDraw等方法。只是添加了autoStart,flingInterval属性,然后通过addView()方法把child添加进去后,就按FrameLayout的布局,全部重合到一起。然后就实现一个Runnable和startFling()方法,通过View.startAnimation()把setInAnimation和setOutAnimation的动画分别应用到两个child中,动画完成后,就设置其他visibility为invisible,一个child为visible。
而ViewFlipper只实现了自动循环播放逻辑。
如果是移动切换的话,InAnimation的toXDelta必须为0,即最终到达原来的地方。而OutAnimation的FromXDelta必须为0,即从原来的地方开始离开,一般animation如下:
InAnimation
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate
android:duration="500"
android:fromXDelta="-100%p"
android:toXDelta="0"/>
</set>
OutAnimation
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate
android:duration="500"
android:fromXDelta="0"
android:toXDelta="-100%p"/>
</set>