Android PopupMenu锚定ImageView时以图片原始尺寸而非显示尺寸为锚点问题
问题根因与解决方案
1. 修正ImageView属性配置
你的ImageView使用wrap_content作为高度,且未配置图片缩放规则,大尺寸原始图片会让ImageView的实际测量高度远大于视觉呈现的24dp,而PopupMenu锚定是基于控件的实际测量尺寸计算,而非视觉显示范围,因此出现偏移。
将ImageView的XML属性修改为如下配置即可:
<ImageView android:id="@+id/languageFlag" android:layout_width="24dp" android:layout_height="24dp" android:layout_margin="@dimen/activity_vertical_margin" android:clickable="true" android:adjustViewBounds="true" android:scaleType="centerCrop" app:layout_constraintBottom_toBottomOf="@id/searchView" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toEndOf="@+id/searchView" app:layout_constraintTop_toTopOf="@+id/searchView" app:srcCompat="@drawable/ic_baseline_casino_24" />
- 固定宽高为24dp,保证控件实际尺寸不受原始图片大小影响
adjustViewBounds="true"保证图片等比缩放不拉伸scaleType可根据显示需求切换为fitCenter等其他模式
2. 修正点击事件逻辑错误
你当前把dropDownMenu.show()写在for循环内部,每添加一个菜单项就触发一次PopupMenu绘制,会额外导致位置计算异常,将相关逻辑移到循环外部即可:
languagePicker.setOnClickListener { val dropDownMenu = PopupMenu(it.context, languagePicker) val languages = it.resources.getStringArray(R.array.translation_directions) for(index in languages.indices) { dropDownMenu.menu.add(0, index, index, languages[index]) } dropDownMenu.setOnMenuItemClickListener(this) dropDownMenu.show() }
可选:手动指定锚定偏移
如果仍有轻微位置偏差,可使用showAsDropDown重载方法手动调整偏移:
// 两个参数分别为X轴、Y轴偏移量,可根据实际显示效果调整数值 dropDownMenu.showAsDropDown(languagePicker, 0, 0)
以上修改完成后,PopupMenu会完全基于ImageView控件本身的尺寸和位置锚定,不会再受原始图片尺寸影响。
内容的提问来源于stack exchange,提问作者Sarah Multitasker
相关产品推荐
相关产品推荐

