如何为 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;
}
}
我有一个自动翻转的 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;
}
}