Android导航抽屉点击项涟漪颜色修改及自定义点击动画实现求助
Android导航抽屉:修改菜单项涟漪颜色+自定义点击动画
一、修改点击涟漪颜色
直接用app:itemRippleColor失效,大概率是主题默认样式覆盖了属性,或者API兼容性问题,试试这两种方案:
方案1:自定义Ripple Drawable
- 在
drawable目录下新建ripple_nav_item.xml:
<?xml version="1.0" encoding="utf-8"?> <ripple xmlns:android="http://schemas.android.com/apk/res/android" android:color="@color/purple"> <!-- 遮罩层确保涟漪范围是整个菜单项 --> <item android:id="@android:id/mask"> <shape android:shape="rectangle"> <solid android:color="@color/purple" /> </shape> </item> </ripple>
- 在NavigationView标签中替换属性:
<com.google.android.material.navigation.NavigationView ... app:itemBackground="@drawable/ripple_nav_item" ... />
方案2:通过主题样式设置
- 在
styles.xml中定义菜单项样式:
<style name="NavMenuItemStyle" parent="Widget.MaterialComponents.NavigationView.Item"> <item name="rippleColor">@color/purple</item> </style>
- 给NavigationView指定该样式:
<com.google.android.material.navigation.NavigationView ... app:itemStyle="@style/NavMenuItemStyle" ... />
二、自定义菜单项点击动画
通过NavigationView的点击监听器,给选中的菜单项添加动画效果,举两个常见示例:
示例1:代码实现缩放动画
val navView = findViewById<NavigationView>(R.id.nav_view) navView.setNavigationItemSelectedListener { menuItem -> // 获取菜单项的文本视图(如果有自定义布局,换成你布局里的根View) val targetView = menuItem.titleView ?: menuItem.actionView?.findViewById(android.R.id.title) targetView?.let { view -> // 缩放+回弹效果 val scaleAnim = ObjectAnimator.ofPropertyValuesHolder( view, PropertyValuesHolder.ofFloat(View.SCALE_X, 1f, 1.15f, 1f), PropertyValuesHolder.ofFloat(View.SCALE_Y, 1f, 1.15f, 1f) ) scaleAnim.duration = 350 scaleAnim.interpolator = OvershootInterpolator(1.2f) scaleAnim.start() } // 常规导航逻辑:关闭抽屉、切换Fragment等 drawerLayout.closeDrawer(GravityCompat.START) true }
示例2:XML定义动画
- 在
anim目录下新建nav_item_click_anim.xml:
<?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android"> <scale android:duration="300" android:fromXScale="1.0" android:fromYScale="1.0" android:pivotX="50%" android:pivotY="50%" android:toXScale="1.1" android:toYScale="1.1" /> <alpha android:duration="300" android:fromAlpha="1.0" android:toAlpha="0.7" /> </set>
- 在代码中加载并执行动画:
val navView = findViewById<NavigationView>(R.id.nav_view) navView.setNavigationItemSelectedListener { menuItem -> val targetView = menuItem.titleView targetView?.let { val anim = AnimationUtils.loadAnimation(this, R.anim.nav_item_click_anim) it.startAnimation(anim) } drawerLayout.closeDrawer(GravityCompat.START) true }
注意:如果你的菜单项用了自定义布局(app:itemLayout),要确保获取的是布局中的目标View(比如根布局或文本控件)来执行动画。
内容的提问来源于stack exchange,提问作者humble
相关产品推荐
相关产品推荐

