我使用this libary在前Lollipop设备上创建CircularReveal动画。问题在于隐藏View
动画。动画也会执行,但在动画结束后,View
会在一秒钟内变为可见,然后消失。如何防止View
闪烁?
以下是使用CircularReveal动画隐藏View
的方法:
public static void revealCloseTopRight(final View view) {
int cx = view.getRight();
int cy = view.getTop();
// get the final radius for the clipping circle
int dx = Math.max(cx, view.getWidth() - cx);
int dy = Math.max(cy, view.getHeight() - cy);
float finalRadius = (float) Math.hypot(dx, dy);
SupportAnimator animator = ViewAnimationUtils.createCircularReveal(view, cx, cy, 0, finalRadius);
animator.setInterpolator(new AccelerateDecelerateInterpolator());
animator.setDuration(animDuration);
animator = animator.reverse();
try {
animator.start();
} catch (Exception ex) {
ex.printStackTrace();
}
view.postDelayed(new Runnable() {
@Override
public void run() {
view.setVisibility(View.INVISIBLE);
}
}, animDuration);
}
更新
我还试图像这样添加SupportAnimator.AnimatorListener()
:
animator.addListener(new SupportAnimator.AnimatorListener() {
@Override
public void onAnimationStart() {
Log.d(AnimationSupport.TAG, TAG + " -> 1onAnimationStart()");
}
@Override
public void onAnimationEnd() {
Log.d(AnimationSupport.TAG, TAG + " -> 1onAnimationEnd()");
view.setVisibility(View.INVISIBLE);
}
@Override
public void onAnimationCancel() {
Log.d(AnimationSupport.TAG, TAG + " -> 1onAnimationCancel()");
}
@Override
public void onAnimationRepeat() {
Log.d(AnimationSupport.TAG, TAG + " -> 1onAnimationRepeat()");
}
});
Animator.AnimatorListener()
就像这样:
animator.addListener(new Animator.AnimatorListener() {
@Override
public void onAnimationStart(Animator animation) {
Log.d(AnimationSupport.TAG, TAG + " -> onAnimationStart()");
}
@Override
public void onAnimationEnd(Animator animation) {
Log.d(AnimationSupport.TAG, TAG + " -> onAnimationEnd()");
view.setVisibility(View.INVISIBLE);
}
@Override
public void onAnimationCancel(Animator animation) {
Log.d(AnimationSupport.TAG, TAG + " -> onAnimationCancel()");
}
@Override
public void onAnimationRepeat(Animator animation) {
Log.d(AnimationSupport.TAG, TAG + " -> onAnimationRepeat()");
}
});
在这两种情况下,都不会调用此回调。我不明白为什么。
答案 0 :(得分:0)
视图正在显示,因为动画完成和处理程序执行之间的延迟非常小。
您可以通过向圆形显示动画添加动画侦听器并将视图设置为onAnimationEnd()
回调中的隐形来解决此问题。
答案 1 :(得分:0)
请确保在您要为视图设置动画的布局中没有
android:animateLayoutChanges="true"
根viewGroup中的属性。
进行此项删除可帮助您克服动画结束后的眨眼现象,并将可见性设置为“消失”(或“不可见”)。