【问题标题】:Which unit of measurement does the Paint.setTextSize(float) use?Paint.setTextSize(float) 使用哪种测量单位?
【发布时间】:2012-07-28 00:54:42
【问题描述】:

我想使用Canvas 在视图上绘制具有特定高度(以像素为单位)的文本。您可以简单地将Paint.setTextSize(float) 与像素数一起使用,还是使用dpsp

【问题讨论】:

    标签: android units-of-measurement


    【解决方案1】:

    它使用像素,但您可以使用以下代码将其转换为 dp:

    double getDPFromPixels(double pixels) {
        DisplayMetrics metrics = new DisplayMetrics();
        getWindowManager().getDefaultDisplay().getMetrics(metrics);
        switch(metrics.densityDpi){
         case DisplayMetrics.DENSITY_LOW:
                    pixels = pixels * 0.75;
                    break;
         case DisplayMetrics.DENSITY_MEDIUM:
                     //pixels = pixels * 1;
                     break;
         case DisplayMetrics.DENSITY_HIGH:
                     pixels = pixels * 1.5;
                     break;
        }
        return pixels;
    }
    

    【讨论】:

    • 感谢您这么快回答。
    • @Todd Davies - 我如何在自定义 View 类中使用它?无法使用 getWindowManager()
    • @Neil - 可以使用View的方法getContext()获取Context,之后调用Context.getSystemService(Context.WINDOW_SERVICE)获取WindowManager。更多信息在这里developer.android.com/reference/android/view/WindowManager.html
    • 顺便说一句,答案不正确,dppx/density。实际上,将switch 替换为pixels /= metrics.density 可以简化。
    • @Tzoiker 你能详细说明一下吗?没有得到我应该改变的东西。
    【解决方案2】:

    获取此类方法的 px 值的最简单方法是在 dimens.xml 文件中简单地定义适当的 dp 或 sp 值,然后像这样检索它:

    int sizeInPx = context.getResources().getDimensionPixelSize(R.dimen.sizeInSp);
    

    根据您的需要,您实际上可以使用 3 种方法:

    • getDimension() 返回一个以像素为单位的浮点数。

    • getDimensionPixelSize() 返回一个以像素为单位的整数。这与 getDimension() 相同,除了返回值被舍入到最接近的整数值,并确保非零输入值导致非零输出值(例如,0.1 返回为 1,而不是 0)。

    • getDimensionPixelOffset() 返回一个以像素为单位的整数。这与 getDimension() 相同,只是返回的值是 TRUNCATED(即向下舍入)。结果可能为零。

    【讨论】:

    • 这是最好的答案;它在所有现有设备上都能正常工作,并且将继续在未来的设备上工作(托德戴维斯的答案是缺少更新的密度,如 xhdpi、xxhdpi 等)。这也更加灵活,您可以为不同的屏幕尺寸(平板电脑等)提供替代的 dimens.xml 文件,或者根据需要在 dp 和 sp 之间进行更改。
    • 是的,正如 WanderingLinguist 所说,这个 TheIT 的答案是最好的答案,因为 Todd Davies 的解决方案应该更新为还包括 xHigh、xxhigh 和 xxxhigh 以及电视案例以及未来出现的案例表明其复杂性并且很容易被破解,而不是 TheIT 的答案,它现在和将来都可以工作,即使任何设备都会出现并且解决方案可以工作,因为 Android 计划处理所有国王设备密度。
    • 我试过了,但它似乎没有按预期工作:22sp 文字在大屏幕上看起来不错(例如 Pixel XL - 1440x2560、560dpi)但在小屏幕上(例如 Nexus一 - 480x800 hdpi=240dpi)它甚至不可读。与例如myPaint.setTextSize(80) 文本在两个屏幕上看起来都不错,而且大小也大致相同(不同设备的大小总是存在某种差异,尽管它通常很小)。
    • @neph 我看到你在另一个答案上问了同样的问题,我唯一能想到的是你正在绘制的画布/位图正在被缩放,因为 setTextSize() 方法需要以像素为单位,因此 80 的值在 Nexus One 上看起来应该很大。祝你好运!
    • @TheIT 是的,我在多个问题上发布了有关此的信息。而且是的,图像比小设备上的画布更大(大约 2k x 2k)。我读到一个不同的问题,如果你直接给它文本大小(而不是使用R.dimen.textSize),画布会自动缩放(根据dpi,...),这是唯一真正有效的东西 - 没有其他建议用于计算文本大小。
    【解决方案3】:

    这些方法包括DisplayMetrics,可以添加到未来的 Android SDK 中。

    要下降的像素:

    public static float getDipFromPixels(float px) {
            return TypedValue.applyDimension(
                    TypedValue.COMPLEX_UNIT_PX,
                    px,
                    Resources.getSystem().getDisplayMetrics()
            );
    }
    

    下降到像素:

    public static float getPixelsFromDip(float dip) {
            return TypedValue.applyDimension(
                    TypedValue.COMPLEX_UNIT_DIP, 
                    dip,
                    Resources.getSystem().getDisplayMetrics()
            );
    }
    

    【讨论】:

      猜你喜欢
      • 2011-03-04
      • 1970-01-01
      • 1970-01-01
      • 2011-02-26
      • 1970-01-01
      • 1970-01-01
      • 2011-05-04
      • 2013-08-12
      • 1970-01-01
      相关资源
      最近更新 更多