Android 在getActionBar()触发的动画结束时获取通知。隐藏();getActionBar().show()
当我使用Android 在getActionBar()触发的动画结束时获取通知。隐藏();getActionBar().show(),android,android-actionbar,android-animation,show-hide,Android,Android Actionbar,Android Animation,Show Hide,当我使用getActionBar().hide()或getActionBar().show()隐藏或显示ActionBar时,操作栏(dis)将以平滑动画的形式出现 动画完成后有没有办法得到通知 实现OnLayoutChangeListener似乎不是一个好的选择,因为onLayoutChange()有时在动画过程中也被调用,无法确定哪个调用是最后一个调用。您可以使用ActionBar.getHeight()查找动作栏的高度,当布局高度增加了这么多像素时,您知道动画已经完成 或者,当Action
getActionBar().hide()
或getActionBar().show()
隐藏或显示ActionBar
时,操作栏(dis)将以平滑动画的形式出现
动画完成后有没有办法得到通知
实现
OnLayoutChangeListener
似乎不是一个好的选择,因为onLayoutChange()
有时在动画过程中也被调用,无法确定哪个调用是最后一个调用。您可以使用ActionBar.getHeight()
查找动作栏的高度,当布局高度增加了这么多像素时,您知道动画已经完成
或者,当ActionBar.getHeight()返回0时,您知道操作栏是隐藏的
动画完成后有没有办法得到通知
是的,但是你必须使用反射ActionBarImpl
监视显示和隐藏动画,因此您可以将自己的动画附加到此字段
并接收回调
下面是一个例子:
private void monitorActionBarAnimation() {
final ActionBar actionBar = getActionBar();
try {
// Get the Animator used internally
final Class<?> actionBarImpl = actionBar.getClass();
final Field currentAnimField = actionBarImpl.getDeclaredField("mCurrentShowAnim");
// Monitor the animation
final Animator currentAnim = (Animator) currentAnimField.get(actionBar);
currentAnim.addListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animation) {
// Do something
}
});
} catch (final Exception ignored) {
// Nothing to do
}
}
private void monitorActionBarAnimation(){
最终ActionBar ActionBar=getActionBar();
试一试{
//让动画师在内部使用
最终类actionBarImpl=actionBar.getClass();
最终字段currentAnimField=actionBarImpl.getDeclaredField(“mCurrentShowAnim”);
//监视动画
最终动画师currentAnim=(动画师)currentAnimField.get(actionBar);
currentAnim.addListener(新的AnimatorListenerAdapter(){
@凌驾
AnimationEnd上的公共无效(Animator动画){
//做点什么
}
});
}捕获(忽略最终异常){
//无事可做
}
}
只需确保在调用ActionBar.show
或ActionBar.hide
后使用它,因为在这些调用之前它没有初始化。另外,它在AnimatorListener.onAnimationEnd中发布,因此每次都需要调用它。您需要它的具体用途是什么?当我隐藏/显示操作栏时,可用屏幕区域会发生变化。我有一个自定义视图,可以填充所有可用空间并显示预渲染图像。当可用屏幕区域改变时,我需要用新的大小重新渲染图像。这是昂贵的,在后台完成,并且使用本机代码,一旦启动就无法中断。因此,我不想在动画完成之前就这样做。这就像一个魔咒。完美的感谢您提供的优秀示例代码!这是一个简单的解决方案,但我会认为这是一个黑客:-)。