DisplayMetrics.widthPixels在三星Galaxy A5等机型返回结果异常问题咨询
问题原因分析与修复方案
嘿,这个问题我之前也踩过坑!核心问题出在文本大小的单位误解上,咱们一步步拆解清楚:
问题根源
你当前的代码里:
myButton.setTextSize((float)metrics.widthPixels / 10f);
这里犯了一个关键错误:TextView.setTextSize(float)方法默认使用**SP(缩放无关像素)作为单位,但你传入的是从widthPixels获取的PX(实际物理像素)**值。
SP是和屏幕密度、系统字体缩放绑定的单位,不同机型的屏幕密度(DPI)不同,SP到PX的转换系数也不一样:
- 比如Galaxy J5如果是mdpi(密度系数1.0),
widthPixels/10得到的PX值和SP值刚好等价,所以显示效果符合预期; - 而Galaxy A5、华为P9 Lite这类机型属于hdpi/xhdpi(密度系数1.5/2.0),SP值会被乘以密度系数放大,导致实际显示的文本像素远大于你预期的屏幕宽度1/10,看起来就明显偏大了。
修复步骤
要让文本大小严格等于屏幕宽度的1/10,你需要明确指定setTextSize的单位为PX,这样就不会受屏幕密度干扰:
替换原来的setTextSize调用为:
myButton.setTextSize(TypedValue.COMPLEX_UNIT_PX, (float)metrics.widthPixels / 10f);
如果你的需求是文本大小能随系统字体缩放调整,但仍保持和屏幕宽度的比例,可以用scaledDensity做转换:
float desiredPx = metrics.widthPixels / 10f; float desiredSp = desiredPx / metrics.scaledDensity; myButton.setTextSize(desiredSp);
不过如果只是要固定占屏幕宽度的1/10,第一种指定PX单位的方法更直接准确。
内容的提问来源于stack exchange,提问作者Zoltán Tankó
相关产品推荐
相关产品推荐

