不同设备中Button相对位置Y轴偏移问题求助
问题根源
你现在用metrics.heightPixels拿到的是整个屏幕的总高度,但这个高度包含了状态栏(顶部的信号栏)和导航栏(底部的虚拟按键栏)的高度。而你的背景图片是显示在APP的内容区域(也就是去掉状态栏、导航栏之后的区域)。
当设备尺寸变小时,状态栏和导航栏占总屏幕高度的比例会变大,你用全屏幕高度计算的66*height/100,对应到内容区域的实际比例就不对了,所以Button会往下偏移。
另外,getMetrics(metrics)这个方法在API 17之后已经被废弃了,建议用更准确的方法获取屏幕尺寸。
解决办法
办法1:获取APP内容区域的真实高度
不要用全屏幕高度,而是拿到内容区域的高度来计算topMargin:
// 获取内容区域的边界 Rect contentRect = new Rect(); getWindow().getDecorView().getWindowVisibleDisplayFrame(contentRect); // 内容区域高度 = 屏幕总高度 - 状态栏高度(contentRect.top) - 导航栏高度(屏幕总高 - contentRect.bottom) int actualContentHeight = metrics.heightPixels - contentRect.top - (metrics.heightPixels - contentRect.bottom); // 用内容区域高度计算topMargin rel_btn.topMargin = 66 * actualContentHeight / 100;
这样计算出来的topMargin是基于APP实际显示内容的区域,和背景图片的范围完全匹配,Button就不会偏移了。
办法2:改用ConstraintLayout(更推荐)
如果可以调整布局,建议直接用ConstraintLayout,它可以直接通过百分比约束来定位控件,完全不需要手动计算margin,系统会自动适配所有设备:
- 把布局文件改成ConstraintLayout,背景图用ImageView设置
- 给Button添加这些约束:
<Button android:id="@+id/btnTag" android:background="@android:color/transparent" app:layout_constraintWidth_percent="0.04" <!-- 宽度占父布局4% --> app:layout_constraintHeight_percent="0.07" <!-- 高度占父布局7% --> app:layout_constraintStart_toStartOf="parent" app:layout_constraintHorizontal_bias="0.15" <!-- 水平方向15%位置 --> app:layout_constraintTop_toTopOf="parent" app:layout_constraintVertical_bias="0.66" /> <!-- 垂直方向66%位置 -->
这样代码里不需要再动态创建Button、计算参数,ConstraintLayout会帮你搞定所有适配,省心又准确。
办法3:修正屏幕尺寸的获取方式
如果你坚持用RelativeLayout,也可以用getRealMetrics获取真实的屏幕尺寸(包含导航栏),同时结合导航栏的显示状态调整,但不如办法1精准:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) { windowManager.getDefaultDisplay().getRealMetrics(metrics); } else { windowManager.getDefaultDisplay().getMetrics(metrics); }
内容的提问来源于stack exchange,提问作者F. Alvarado
相关产品推荐
相关产品推荐

