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中发布,因此每次都需要调用它。

您需要它的具体用途是什么?当我隐藏/显示
操作栏时,可用屏幕区域会发生变化。我有一个自定义视图,可以填充所有可用空间并显示预渲染图像。当可用屏幕区域改变时,我需要用新的大小重新渲染图像。这是昂贵的,在后台完成,并且使用本机代码,一旦启动就无法中断。因此,我不想在动画完成之前就这样做。这就像一个魔咒。完美的感谢您提供的优秀示例代码!这是一个简单的解决方案,但我会认为这是一个黑客:-)。