Android 在BottomNavigationView上设置选定图标的动画

Android 在BottomNavigationView上设置选定图标的动画,android,material-design,bottomnavigationview,material-components,material-components-android,Android,Material Design,Bottomnavigationview,Material Components,Material Components Android,我正在研究如何设置当前在BottomNavigationView中使用的VectorDrawables的动画,如中选择了一个选项卡。但是,与使用MenuItem.getIcon获取图标、将其转换为AnimatedVectorDrawable并调用animate方法时的工具栏视图不同,没有动画 我想知道我是否可以做些什么来实现这一点,这是否可能包含在稳定材质组件库中,或者我是否最好创建一个扩展BottomNavigationView类的自定义视图。目前无法将动画图标与BottomNavigatio

我正在研究如何设置当前在BottomNavigationView中使用的VectorDrawables的动画,如中选择了一个选项卡。但是,与使用MenuItem.getIcon获取图标、将其转换为AnimatedVectorDrawable并调用animate方法时的工具栏视图不同,没有动画


我想知道我是否可以做些什么来实现这一点,这是否可能包含在稳定材质组件库中,或者我是否最好创建一个扩展BottomNavigationView类的自定义视图。

目前无法将动画图标与BottomNavigationView一起使用。我们已经在内部提交了这个特性请求,但是已经取消了它的优先级


如果您想帮助添加支持,我们很乐意接受位于

的pr,目前无法在BottomNavigationView中使用动画图标。我们已经在内部提交了这个特性请求,但是已经取消了它的优先级


如果您想帮助添加支持,我们很乐意接受位于

的pr,我们可以使用以下代码设置bottomnavigationview图标的动画:

bottomNavigationId.menu.getItem(i).icon  =  
AnimatedVectorDrawableCompat.create(this, R.drawable.ic_settings_active_avd)
val anim = bottomNavigationId.menu.getItem(i).icon as Animatable
anim.start()
但这在api>24时不起作用 因此,更好的方法是创建一个AnimatedStateListDrawable,其中AVD是用于android的转换:state_checked=true。然后,您可以将其设置为菜单项上的可绘制项,并在选择该项时运行AVD

例如:

使用此动画状态列表可作为菜单中的图标绘制

 <?xml version="1.0" encoding="utf-8"?>
 <menu xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:app="http://schemas.android.com/apk/res-auto">
    <item
       android:id="@+id/item_settings_fragment"
       android:icon="@drawable/anim_settings"
       android:title="@string/settings"
      app:showAsAction="always" />
       ...
    </menu> 
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">
   <item
       android:id="@+id/navigation_search"
       android:icon="@drawable/selector_search"
       android:title="@string/search"
       />
</menu> 
查看下面的链接,以完全了解带动画绘图的bottomnavigationview


我们可以使用以下代码设置bottomnavigationview图标的动画:

bottomNavigationId.menu.getItem(i).icon  =  
AnimatedVectorDrawableCompat.create(this, R.drawable.ic_settings_active_avd)
val anim = bottomNavigationId.menu.getItem(i).icon as Animatable
anim.start()
但这在api>24时不起作用 因此,更好的方法是创建一个AnimatedStateListDrawable,其中AVD是用于android的转换:state_checked=true。然后,您可以将其设置为菜单项上的可绘制项,并在选择该项时运行AVD

例如:

使用此动画状态列表可作为菜单中的图标绘制

 <?xml version="1.0" encoding="utf-8"?>
 <menu xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:app="http://schemas.android.com/apk/res-auto">
    <item
       android:id="@+id/item_settings_fragment"
       android:icon="@drawable/anim_settings"
       android:title="@string/settings"
      app:showAsAction="always" />
       ...
    </menu> 
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">
   <item
       android:id="@+id/navigation_search"
       android:icon="@drawable/selector_search"
       android:title="@string/search"
       />
</menu> 
查看下面的链接,以完全了解带动画绘图的bottomnavigationview

使用Shape Shift使动画矢量可绘制 在build.gradleModule:app中添加此行

默认配置{ vectorDrawables.useSupportLibrary=true }

生成可绘制选择器文件-selector_search.xml

<?xml version="1.0" encoding="utf-8"?>
<animated-selector xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    tools:targetApi="16">
    <item
        android:id="@+id/state_on"
        android:drawable="@drawable/avd_search"
        android:state_checked="true" />
    <item
        android:id="@+id/state_off"
        android:drawable="@drawable/icon_search" />
    <transition
        android:drawable="@drawable/avd_search"
        android:fromId="@id/state_off"
        android:toId="@id/state_on" />
</animated-selector>
avd搜索是动画矢量可绘制文件 图标搜索是正常的可绘制文件

使用此可绘制选择器文件作为菜单中的图标

 <?xml version="1.0" encoding="utf-8"?>
 <menu xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:app="http://schemas.android.com/apk/res-auto">
    <item
       android:id="@+id/item_settings_fragment"
       android:icon="@drawable/anim_settings"
       android:title="@string/settings"
      app:showAsAction="always" />
       ...
    </menu> 
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">
   <item
       android:id="@+id/navigation_search"
       android:icon="@drawable/selector_search"
       android:title="@string/search"
       />
</menu> 
享受

使用Shape Shift使动画矢量可绘制 在build.gradleModule:app中添加此行

默认配置{ vectorDrawables.useSupportLibrary=true }

生成可绘制选择器文件-selector_search.xml

<?xml version="1.0" encoding="utf-8"?>
<animated-selector xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    tools:targetApi="16">
    <item
        android:id="@+id/state_on"
        android:drawable="@drawable/avd_search"
        android:state_checked="true" />
    <item
        android:id="@+id/state_off"
        android:drawable="@drawable/icon_search" />
    <transition
        android:drawable="@drawable/avd_search"
        android:fromId="@id/state_off"
        android:toId="@id/state_on" />
</animated-selector>
avd搜索是动画矢量可绘制文件 图标搜索是正常的可绘制文件

使用此可绘制选择器文件作为菜单中的图标

 <?xml version="1.0" encoding="utf-8"?>
 <menu xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:app="http://schemas.android.com/apk/res-auto">
    <item
       android:id="@+id/item_settings_fragment"
       android:icon="@drawable/anim_settings"
       android:title="@string/settings"
      app:showAsAction="always" />
       ...
    </menu> 
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">
   <item
       android:id="@+id/navigation_search"
       android:icon="@drawable/selector_search"
       android:title="@string/search"
       />
</menu> 

祝您愉快

谢谢您的快速回答。老实说,我是这类事情的初学者,所以我会暂时研究它,直到我觉得我的编码足够好,能够帮助解决问题。谢谢你的快速回答。老实说,我是这方面的初学者,所以我会暂时研究它,直到我觉得我的代码足够好,能够提供帮助。虽然这个链接可能会回答这个问题,但最好在这里包括答案的基本部分,并提供链接供参考。如果链接页面发生更改,则仅链接答案可能无效。虽然此链接可以回答问题,但最好在此处包含答案的基本部分,并提供链接以供参考。如果链接页面发生更改,仅链接的答案可能无效。-@BartekLipinski现在检查先生你是个天才:虽然这个链接可以回答这个问题,但最好在这里包括答案的基本部分,并提供链接供参考。如果链接页面发生更改,则仅链接答案可能无效。虽然此链接可以回答问题,但最好在此处包含答案的基本部分,并提供链接以供参考。如果链接页面发生更改,仅链接的答案可能无效。-@BartekLipinski马上检查先生你是个天才