1 描述
AdapterViewFlipper 继承了AdapterViewAnimator,它会显示Adapter提供的多个View组件,但每次只能显示一个View,可以通过showNext、showPrevious显示下一个、上一个组件,也可以调用startFlipping自动播放View。
2 XML属性:
android:animateFirstView:设置显示该组件的第一个View时是否使用动画
android:inAnimation:设置组件显示时使用的动画
android:loopViews:设置循环到最后一个组件后是否自动“转头”到第一个组件
android:outAnimation:设置组件隐藏时使用的动画
android:autoStart:设置显示该组件是否是自动播放
android:flipInterval:设置自动播放的时间间隔
3 常用方法:
//设置动画自动播放的时间间隔setFlipInterval(1000);
//设置显示第一个View时是否使用动画
setAnimateFirstView(true);
//设置适配器
setAdapter(adapter);
setInAnimation(Context context, int resourceID);//设置图片进入动画
setOutAnimation(Context context, int resourceID);//设置图片出来动画
showNext();//显示下一个view
showPrevious();//显示下一个view
stopFlipping();//停止自动播放
startFlipping();//开始自动播放
4 使用示例
xml布局:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:gravity="center_horizontal" android:layout_width="match_parent" android:layout_height="match_parent"> <!--属性 android:loopViews="true" 设置动画可循环播放--> <AdapterViewFlipper android:id="@+id/av_flipper" android:layout_width="match_parent" android:loopViews="true" android:layout_weight="1" android:layout_height="wrap_content"> </AdapterViewFlipper> <LinearLayout android:layout_width="match_parent" android:gravity="center" android:layout_height="wrap_content" android:layout_marginBottom="10dp" android:orientation="horizontal"> <Button android:text="下一个" android:onClick="next" android:layout_width="wrap_content" android:layout_height="wrap_content"/> <Button android:text="上一个" android:onClick="previous" android:layout_width="wrap_content" android:layout_height="wrap_content"/> <Button android:text="自动播放" android:onClick="auto" android:layout_width="wrap_content" android:layout_height="wrap_content"/> </LinearLayout> </LinearLayout>
自定义动画xml文件:
anim_left_enter.xml:
<?xml version="1.0" encoding="utf-8"?> <objectAnimator xmlns:android="http://schemas.android.com/apk/res/android" android:interpolator="@android:anim/accelerate_decelerate_interpolator" android:propertyName="x" android:valueType="floatType" android:valueFrom="-1500" android:valueTo="0" android:duration="600"> </objectAnimator>
anim_left_exit.xml:
<?xml version="1.0" encoding="utf-8"?> <objectAnimator xmlns:android="http://schemas.android.com/apk/res/android" android:interpolator="@android:anim/accelerate_decelerate_interpolator"> <objectAnimator android:propertyName="x" android:valueType="floatType" android:valueFrom="0" android:valueTo="1500" android:duration="600"/> </objectAnimator>
anim_right_enter.xml:
<?xml version="1.0" encoding="utf-8"?> <objectAnimator xmlns:android="http://schemas.android.com/apk/res/android" android:interpolator="@android:anim/accelerate_decelerate_interpolator" android:propertyName="x" android:valueType="floatType" android:valueFrom="1500" android:valueTo="0" android:duration="600"> </objectAnimator>
anim_right_exit.xml:
<?xml version="1.0" encoding="utf-8"?> <objectAnimator xmlns:android="http://schemas.android.com/apk/res/android" android:interpolator="@android:anim/accelerate_decelerate_interpolator"> <objectAnimator android:propertyName="x" android:valueType="floatType" android:valueFrom="0" android:valueTo="-1500" android:duration="600"/> </objectAnimator>
Activity中实现:
public class ActivityFliperActivity extends Activity { private AdapterViewFlipper avFlipper; //图片资源 public int[] imgIds = {R.mipmap.pic_1,R.mipmap.pic_2,R.mipmap.pic_3,R.mipmap.pic_4,R.mipmap.pic_5}; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_fliper); FliperAdapter adapter = new FliperAdapter(this,imgIds); avFlipper = (AdapterViewFlipper) findViewById(R.id.av_flipper); //设置动画自动播放的时间间隔 avFlipper.setFlipInterval(1000); //设置显示第一个View时是否使用动画 avFlipper.setAnimateFirstView(true); //设置适配器 avFlipper.setAdapter(adapter); // ObjectAnimator objectAnimator = ObjectAnimator.ofFloat(avFlipper,"x",0f,1f); // ObjectAnimator objectAnimator2 = ObjectAnimator.ofFloat(avFlipper,"x",1f,0f); } /** * 下一个 * @param view */ public void next(View view){ //左进左出 avFlipper.setInAnimation(this , R.animator.anim_left_enter);//设置图片进入动画 avFlipper.setOutAnimation(this , R.animator.anim_left_exit);//设置图片出来动画 avFlipper.showNext();//显示下一个view avFlipper.stopFlipping();//停止自动播放 } /** * 上一个 * @param view */ public void previous(View view){ //右进右出 avFlipper.setInAnimation(this , R.animator.anim_right_enter); avFlipper.setOutAnimation(this , R.animator.anim_right_exit); avFlipper.showPrevious();//显示下一个view avFlipper.stopFlipping();//停止自动播放 } /** * 自动播放 * @param view */ public void auto(View view){ avFlipper.startFlipping();//开始自动播放 } }
5 动画异常处理
(1)异常描述:Caused by: java.lang.ClassCastException: android.animation.AnimatorSet cannot be cast to android.animation.ObjectAnimator
解决方案:
把自定义动画的XML改为这种形式:
<?xml version="1.0" encoding="utf-8"?> <objectAnimator xmlns:android="http://schemas.android.com/apk/res/android" android:interpolator="@android:anim/accelerate_decelerate_interpolator" android:propertyName="x" android:valueType="floatType" android:valueFrom="-1500" android:valueTo="0" android:duration="600"> </objectAnimator>
或者:
<?xml version="1.0" encoding="utf-8"?> <objectAnimator xmlns:android="http://schemas.android.com/apk/res/android" android:interpolator="@android:anim/accelerate_decelerate_interpolator"> <objectAnimator android:propertyName="x" android:valueType="floatType" android:valueFrom="0" android:valueTo="-1500" android:duration="600"/> </objectAnimator>
然后重启Android studio才有效(修改之后,我通过clear 、rebuild项目都没有效果,结果重启一下才有效果,很是崩溃!)。也可以参见下面这个链接:
6 效果图
源码:
点击打开链接