如何调整RTL模式下SlidingMenu的阴影位置
我懂你在适配RTL布局时遇到的这个麻烦——当把SlidingMenu改成从右侧滑出后,阴影位置完全不对,还停留在原来的左侧区域对吧?这是因为你当前用的阴影Drawable是为LTR(从左到右)场景设计的,我们只需要针对RTL场景做一点适配调整就能解决。
问题根源
你的阴影是一个从透明→浅黑→深黑的线性渐变,在LTR模式下,菜单从左侧滑出,阴影需要显示在菜单的右侧,这个渐变方向是对的;但RTL模式下菜单从右侧滑出,阴影应该显示在菜单的左侧,所以需要把渐变方向完全反转过来。
下面给你几个可行的解决方案:
方案1:利用资源目录自动适配(推荐)
Android支持根据布局方向自动加载对应目录的资源,我们可以给RTL单独准备阴影文件:
- 在
res目录下创建drawable-ldrtl文件夹(专门存放RTL方向的资源文件) - 把反转渐变方向的
shadow.xml放到这个文件夹里,内容如下:
<?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android" > <gradient android:startColor="#33000000" android:centerColor="#11000000" android:endColor="#00000000" /> </shape>
- 保持你原来的Java代码不变,只需要把注释掉的
menu.setShadowDrawable(R.drawable.shadow);打开即可。系统会在RTL模式下自动加载drawable-ldrtl里的阴影,LTR下用默认drawable目录的文件,完全不需要额外判断逻辑。
方案2:代码中手动切换阴影Drawable
如果你不想创建额外的资源目录,可以在代码里根据RTL状态手动设置对应的阴影:
- 先在普通的
drawable目录下创建shadow_rtl.xml,内容就是上面反转后的渐变代码 - 修改你的Java代码:
menu = new SlidingMenu(this); boolean isRtl = getResources().getBoolean(R.bool.is_rtl); if (isRtl) { menu.setMode(SlidingMenu.RIGHT); menu.setShadowDrawable(R.drawable.shadow_rtl); // 加载RTL专属阴影 } else { menu.setMode(SlidingMenu.LEFT); menu.setShadowDrawable(R.drawable.shadow); // 加载LTR阴影 } // 其他设置保持不变 menu.setTouchModeAbove(SlidingMenu.TOUCHMODE_FULLSCREEN); menu.setShadowWidthRes(R.dimen.shadow_width); menu.setBehindOffsetRes(R.dimen.slidingmenu_offset); menu.setFadeDegree(0.35f); menu.attachToActivity(this, SlidingMenu.SLIDING_CONTENT); menu.setMenu(R.layout.activity_home_leftmenu);
方案3:用渐变角度适配(灵活但需注意兼容性)
你也可以通过调整渐变的角度来实现适配,不需要额外的资源文件:
- 修改原
shadow.xml的渐变属性,引入角度变量:
<?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android" > <gradient android:endColor="#33000000" android:centerColor="#11000000" android:startColor="#00000000" android:angle="@integer/gradient_angle" /> </shape>
- 在
values/integers.xml中定义LTR的角度:
<integer name="gradient_angle">0</integer>
- 在
values-ldrtl/integers.xml中定义RTL的角度:
<integer name="gradient_angle">180</integer>
这样RTL模式下渐变角度反转,阴影方向就会自动对应菜单的位置了。
额外注意点
setShadowWidthRes(R.dimen.shadow_width)这个设置不需要修改,不管LTR还是RTL,阴影的宽度都是15dp,只是方向改变而已。
内容的提问来源于stack exchange,提问作者Atara
相关产品推荐
相关产品推荐

