ViewPager和ViewFlipper的基本原理

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>

猜你喜欢

转载自blog.csdn.net/b1480521874/article/details/88404580