Android 为什么相同的pt在不同的设备下显示不同的尺寸

Android 为什么相同的pt在不同的设备下显示不同的尺寸,android,Android,我希望不同设备的字体大小完全相同,所以我选择使用pt 但是有很多不同分辨率的虚拟设备试图找到相同的PT显示字体大小是不一样的 public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setConten

我希望不同设备的字体大小完全相同,所以我选择使用pt

但是有很多不同分辨率的虚拟设备试图找到相同的PT显示字体大小是不一样的

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        TextView tv = findViewById(R.id.textView);
        String tx = "123456";
        tv.setText(tx);
        tv.setTextSize(TypedValue.COMPLEX_UNIT_PX, pt2px(this, 50));
        tv.setBackgroundColor(Color.RED);
        tv.setGravity(Gravity.CENTER);
    }

    public static int pt2px(Context context, float ptValue) {
        DisplayMetrics dm = new DisplayMetrics();
        getWindowManager().getDefaultDisplay().getRealMetrics(dm);
        final float fontScale = dm.xdpi;
        return (int) (ptValue * (fontScale / 72f) + 0.5f);
    }
}

谢谢你的回答

我找到了原因,因为DisplayMetrics获得的DPI是由设备制造商自己设置的,不一定准确。SP和PX之间的转换需要scaledDensity,该值也不准确,因此在同一SP下获得的某些设备的字体大小也不同。


但我仍然没有找到解决办法。

因为你的数学很怪。首先,您要根据水平dpi计算高度(textSize是什么)。它应该是垂直的。其次,你的数学是相反的-dpi是每英寸点数(像素)。50*dpi=50英寸内的像素数。你不是想让这个50英寸高。从单位的角度来看,划分是有意义的,但仍然可能不是您想要的。(我不知道你到底想做什么)


无论如何,你不应该这样做。使用SP。人们根据自己阅读手机的能力设置不同的字体大小。这是视力有问题的人使用设备的唯一方式。与他们合作,使用SP,使其能够根据他们所说的需要进行缩放。

请使用SP。作为一个必须使用阅读眼镜阅读facebook提醒的人,我求求你。由于纵横比等因素,您将从不同的设备获得不同的结果。像素密度不必在每个方向上都像你看到的那样相同,你是在混合术语。dpi是具体的打印方式。ppi是像素密度。不要认为dpi与屏幕有关,因为它与屏幕无关。无论如何,不是直接的。如果你把它设置在你要在屏幕上显示的东西上,它可以而且通常会被缩放。这尤其适用于文本,因为android中有一个内置的缩放(或收缩)设置,任何像样的阅读器应用程序也可以让你缩小缩放。

查看此链接,我刚刚尝试使用SP,但不同设备上的文本大小仍然不同。如果你使用SP,它仍然会变小。您应该使用SP而不是这个。在这一点上可能会有所不同,如果用户要求它更大或更小。我找到了原因,因为有些设备返回的xdpi值是错误的,与我自己的手动计算不同,例如Meizu X8,DisplayMetrics HightPixels是2220,widthPixels是1080,屏幕大小是6.2英寸,然后计算的DPI应该是398左右,但是DisplayMetrics中的densityDPI是480,xdpi是318,ydpi是320,所有这些都是错误的,你知道原因是什么吗?在这个链接中是真的吗,使用DisplayMetrics获得的数据可能是错误的吗?densityDPI没有错,它是一个映射到的bucket,通常以160的倍数递增(因为160 dpi是原始Android的基本dpi,它使用它作为1的倍增进行缩放。所以这是一个3倍的设备).我也不知道你是怎么计算的,但我离398还差得远。我得到的数字和他们说的差不多,其余的可能是我的快速数学中的错误,而我尝试过使用SP,在某些设备上获得的大小是不同的。我找到了原因,因为Di获得的DPIsplayMetrics由设备制造商自己设置,不一定准确。SP和PX之间的转换需要scaledDensity,而且该值也不准确,因此在同一SP下获得的某些设备的字体大小也不同。您引用的是一篇8年前的帖子。那是android 4。