迁移至AndroidX后菜单图标尺寸异常问题咨询
问题分析与解决方案
这个问题我在AndroidX迁移过程中也碰到过,核心原因是AndroidX对BitmapDrawable的密度处理逻辑和旧版支持库不一致,导致你手动缩放后的Drawable被系统再次缩放,最终显示尺寸翻倍。
具体原因
你的resize函数里,通过Bitmap.createScaledBitmap生成了指定尺寸的Bitmap,但这个Bitmap保留了原Drawable的密度信息(比如原图标是xxhdpi密度)。在AndroidX中,BitmapDrawable的构造函数不会自动将Bitmap的密度适配当前屏幕的密度,系统渲染时会再次根据屏幕密度缩放这个Drawable,最终显示尺寸就变成了你预期的两倍。
修复方案
修改你的resize函数,确保缩放后的Bitmap密度与当前屏幕密度一致,同时兼容不同类型的Drawable(比如矢量图):
public static Drawable resize(Drawable image, Context c, int widthDp, int heightDp) { int widthPx = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, widthDp, c.getResources().getDisplayMetrics()); int heightPx = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, heightDp, c.getResources().getDisplayMetrics()); Drawable resizedDrawable; if (image instanceof BitmapDrawable) { Bitmap originalBitmap = ((BitmapDrawable) image).getBitmap(); Bitmap scaledBitmap = Bitmap.createScaledBitmap(originalBitmap, widthPx, heightPx, true); // 关键:设置缩放后Bitmap的密度为当前屏幕密度 scaledBitmap.setDensity(c.getResources().getDisplayMetrics().densityDpi); resizedDrawable = new BitmapDrawable(c.getResources(), scaledBitmap); } else if (image instanceof VectorDrawable || image instanceof androidx.vectordrawable.graphics.drawable.VectorDrawable) { // 兼容AndroidX的矢量图类型 VectorDrawable vectorDrawable = (VectorDrawable) image; vectorDrawable.setBounds(0, 0, widthPx, heightPx); resizedDrawable = vectorDrawable; } else { // 处理其他Drawable类型,直接设置边界 image.setBounds(0, 0, widthPx, heightPx); resizedDrawable = image; } return resizedDrawable; }
额外检查项
- 确认
gradle.properties中的AndroidX配置是否正确:
这两个配置是AndroidX迁移的必要项,缺失可能导致旧代码与AndroidX库的兼容问题。android.useAndroidX=true android.enableJetifier=true - 检查主题是否已迁移到AndroidX版本:确保应用主题继承自AndroidX的主题(比如
Theme.MaterialComponents.DayNight),旧主题可能会导致菜单控件的渲染异常。
内容的提问来源于stack exchange,提问作者Ben
相关产品推荐
相关产品推荐

