如何为 ViewFlipper 捕获翻转事件

How to capture the flip event for ViewFlipper

我有一个自动翻转的 ViewFlipper 组件,我想处理该组件在当前视图和下一个视图之间进行转换的事件。可能吗?

谢谢。

mViewFlipper.setInAnimation(AnimationUtils.loadAnimation(this, android.R.anim.fade_in));
mViewFlipper.setOutAnimation(AnimationUtils.loadAnimation(this, android.R.anim.fade_out));
mViewFlipper.getAnimation().setAnimationListener(this);
mViewFlipper.startFlipping();

这是日志:

02-16 14:27:50.860: E/AndroidRuntime(7961): 致命异常: main 02-16 14:27:50.860: E/AndroidRuntime(7961): 进程: com.idiadasample, PID: 7961 02-16 14:27:50.860: E/AndroidRuntime(7961): java.lang.RuntimeException: 无法启动 activity ComponentInfo{com.idiadasample/com.idiada.activity.ViewFlipperActivity}: java.lang.NullPointerException: 尝试在空 object 引用上调用虚拟方法 'void android.view.animation.Animation.setAnimationListener(android.view.animation.Animation$AnimationListener)' 02-16 14:27:50.860: E/AndroidRuntime(7961): 在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2298) 02-16 14:27:50.860: E/AndroidRuntime(7961): 在 android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2360) 02-16 14:27:50.860: E/AndroidRuntime(7961): 在 android.app.ActivityThread.access$800(ActivityThread.java:144) 02-16 14:27:50 .860: E/AndroidRuntime(7961): 在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:1278) 02-16 14:27:50.860: E/AndroidRuntime( 7961): 在 android.os.Handler.dispatchMessage(Handler.java:102) 02-16 14:27:50.860: E/AndroidRuntime(7961): 在 android.os.Looper.loop(Looper.java :135) 02-16 14:27:50.860: E/AndroidRuntime(7961): 在 android.app.ActivityThread.main(ActivityThread.java:5221) 02-16 14:27:50.860 : E/AndroidRuntime(7961): 在 java.lang.reflect.Method.invoke(本机方法) 02-16 14:27:50.860: E/AndroidRuntime(7961): 在 java.lang.reflect.Method.invoke(Method.java:372) 02-16 14:27:50.860: E/AndroidRuntime(7961): 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899) 02-16 14:27:50.860: E/AndroidRuntime(7961): 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694) 02-16 14:27:50.860: E/AndroidRuntime( 7961):引起:java.lang.NullPointerException:尝试调用虚拟会议hod 'void android.view.animation.Animation.setAnimationListener(android.view.animation.Animation$AnimationListener)' on null object reference 02-16 14:27:50.860: E/AndroidRuntime(7961): at com.idiada.activity.ViewFlipperActivity.onCreate(ViewFlipperActivity.java:89) 02-16 14:27:50.860: E/AndroidRuntime(7961): 在 android.app.Activity.performCreate(Activity.java:5933) 02-16 14:27:50.860: E/AndroidRuntime(7961): 在 android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1105) 02-16 14:27:50.860: E/AndroidRuntime(7961): 在 android.app.ActivityThread.performLaunchActivity (ActivityThread.java:2251) 02-16 14:27:50.860: E/AndroidRuntime(7961): ... 10 更多

您可以按照this answer中的建议添加动画并监听动画事件:

viewFlipper.getInAnimation().setAnimationListener(new Animation.AnimationListener() {
   public void onAnimationStart(Animation animation) {}
   public void onAnimationRepeat(Animation animation) {}
   public void onAnimationEnd(Animation animation) {}
});

设置动画:

viewFlipper.setInAnimation(AnimationUtils.loadAnimation(this,
         R.anim.fade_in));
viewFlipper.setOutAnimation(AnimationUtils.loadAnimation(this,
         R.anim.fade_out));

我已经扩展 ViewFlipper 来做到这一点。

import android.content.Context;
import android.support.annotation.NonNull;
import android.util.AttributeSet;
import android.view.View;
import android.widget.ViewFlipper;

public class DecentViewFlipper extends ViewFlipper implements View.OnLayoutChangeListener {

    public void onLayoutChange(View view, int i, int i1, int i2, int i3, int i4, int i5, int i6, int i7) {
        onViewFlipperFlippedListener.onViewFlipperFlipped(view, getDisplayedChild());
    }

    public interface OnViewFlipperFlippedListener {
        void onViewFlipperFlipped(View childView, int index);
    }

    public DecentViewFlipper(Context context) {
        super(context);
    }

    public DecentViewFlipper(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    private static final String TAG = DecentViewFlipper.class.getSimpleName();
    private OnViewFlipperFlippedListener onViewFlipperFlippedListener = null;

    public void setOnViewFlipperFlippedListener(@NonNull OnViewFlipperFlippedListener listener){
        if (listener == null) throw new IllegalStateException("OnViewFlipperFlippedListener can not be null");
        if (getChildCount() != 0) {
            DecentViewFlipper flipper = (DecentViewFlipper) getCurrentView().getParent();
            flipper.addOnLayoutChangeListener(this);
        } else {
            throw new IllegalStateException("can't use setOnViewFlipperFlippedListener before you have added at least one View to the "+TAG);
        }
        onViewFlipperFlippedListener = listener;
    }

    public OnViewFlipperFlippedListener getOnViewFlipperFlippedListener() {
        return onViewFlipperFlippedListener;
    }

}