如何为工具栏溢出菜单图标添加动画效果

5
有没有一种方法可以为工具栏上的默认三个垂直点状菜单图标添加动画效果?
我使用标准代码将工具栏用作操作栏:
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);

我也在活动中使用onCreateOptionsMenu方法,其中我会填充我的menu.xml文件,但我不知道如何对自动生成的溢出图标获得更多控制权。我最感兴趣的是如何引用菜单图标,以便我可以对其进行动画处理。我不关心动画类型。它可以是简单的旋转动画。


你在尝试做什么样的动画呢…? - Mariano Zorrilla
我不在意。可以是一个简单的旋转动画。 - ThanosFisherman
好的...使用SOF搜索功能:https://dev59.com/MWkw5IYBdhLWcg3wqMY1 - Mariano Zorrilla
是的,但当我填充menu.xml时,溢出图标会自动创建。我如何创建对它的引用?这样我就可以对其进行动画处理了。 - ThanosFisherman
我尝试查找Android中ActionBar#addOnMenuVisibilityListener的实际源代码,因为我相信该方法引用了溢出菜单按钮。这是一个选项,但也许您将不得不创建自己的ActionBar实现。 - Paulo Avelar
1个回答

2

你需要使用 View,具体来说是ActionMenuView。尝试将以下代码复制到你的Activity中:

//we declare our objects globally
Toolbar tool;  ActionMenuView amv;

然后重写onPrepareOptionsMenu方法,你决定return什么是你的选择。

@Override
public boolean onPrepareOptionsMenu(Menu menu) {
    //to be safe you can check if children are greater than 1
    amv = (ActionMenuView) tool.getChildAt(1);//hope you've met amv
    return true;
}

现在是关键部分 - 每当您想要动画化" 3个垂直点 "-(您的溢出)时,必须检查可见的子元素 -(即如果您想) 其实忘记这个
amv.getChildAt(amv.getChildCount()-1).startAnimation(AnimationUtils.loadAnimation(
        MainActivity.this,R.anim.abc_fade_in));

这段代码提供了一种基本的淡入动画-现在你可以让它更加华丽。

编辑1:

以上代码假设您的工具栏中除了在onCreateOptionsMenu中填充菜单之外没有添加任何内容。

如果您使用了复杂的ToolBar,请使用以下代码进行初始化。

@Override
public boolean onPrepareOptionsMenu(Menu menu) {
    for(int i =0; i < tool.getChildCount(); ++i){
        if(tool.getChildAt(i).getClass().getSimpleName().equals("ActionMenuView")){
            amv = (ActionMenuView) tool.getChildAt(i);
            break;
        }
    }
    return true;
}

同时,您调用 amv 视图的初始化可以在 onCreateOptionsMenu onPrepareOptionsMenu 中进行,我选择了 onPrepareOptionsMenu ,因为我想要更好的可读性。

希望这有所帮助。


这真的很不错!我得在实践中检查一下,看看效果如何。谢谢。 - ThanosFisherman
你可以接受并点赞,也可以为它支付悬赏,欢迎@ThanosF。 - Elltz
使用第一种方式 tool.getChildAt(1); 初始化 amv 导致了 classCastException,但这只是因为我的工具栏上还有一个导航抽屉的汉堡图标。你第二次修改后的方法非常好用,我相信这是初始化 ActionMenuView 的正确方法。无论如何,再次感谢你,这是你的赏金! - ThanosFisherman
欢迎您,您不应该立即附加赏金,现在它已经从特色列表中移除了,哈哈,没关系,是的,第二种方法是解决方案,第一种方法只是逻辑。@ThanosF - Elltz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接