【问题标题】:How to set unit for Paint.setTextSize()如何为 Paint.setTextSize() 设置单位
【发布时间】:2011-03-04 23:10:51
【问题描述】:

是否可以更改Paint.setTextSize() 的单位?据我所知,它是像素,但我喜欢在 DIP 中设置文本大小以支持多屏幕。

【问题讨论】:

    标签: java android view


    【解决方案1】:

    接受的答案是手势,而不是设置文本大小。投票最高的答案(在撰写本文时)已接近,但文档建议使用 sp 而不是 dp,因为除了针对屏幕密度(如 dp 值)进行缩放外,sp 是还根据用户首选的字体大小进行缩放。

    来自代码中的int

    int spSize = 17;
    float scaledSizeInPixels = spSize * getResources().getDisplayMetrics().scaledDensity;
    mTextPaint.setTextSize(scaledSizeInPixels);
    

    或者

    int spSize = 17;
    float scaledSizeInPixels = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP,
            spSize, getResources().getDisplayMetrics());
    mTextPaint.setTextSize(scaledSizeInPixels);
    

    来自资源

    或者,如果您在资源中有 spdp 值:

    <resources>
        <dimen name="fontSize">17sp</dimen>
    </resources>
    

    float scaledSizeInPixels = getResources().getDimensionPixelSize(R.dimen.fontSize);
    mTextPaint.setTextSize(scaledSizeInPixels);
    

    其他链接

    【讨论】:

    • 我测试了您的建议,但所有建议都存在相同的问题:例如字体大小 22 在 Pixel XL (1440x2560, 560dpi) 上看起来不错,但在 Nexus One (480x800, hdpi=240dpi) 上它很小/不可读了。其他人建议this,但它会导致同样的事情发生。最好只使用硬编码的像素大小(例如myPaint.setTextSize(80)),因为这样文本在每个设备上将具有相同的真实宽度(例如0.5“)(画布会缩放它!) - 即使它很明显不会随着 Android 的“字体大小”设置缩放。
    • @Neph,我已经有一段时间没有做这个了。将dp 值设置为80 是否与使用myPaint.setTextSize(80) 产生相同的结果?
    • 老实说,我真的没想到会在这么久之后得到答案,所以谢谢你!你的意思是,使用 `17sp` 和 dp 而不是 sp?我刚刚也用dp 对其进行了测试,但我得到了相同的结果:22sp/22dp 给我appr。与myPaint.setTextSize(80) 的结果相同——至少对于更大的 Pixel XL。在较小的 Nexus One 上,文本太小而无法阅读。
    • 好的,我不确定接下来会发生什么,但感谢您的评论。
    【解决方案2】:

    如果您的 Paint 对象用于在 Canvas 上绘制文本,您可以让 Canvas 为您处理缩放。

    调用Canvas.drawText()时,文本大小首先由传入的Paint对象确定,可以通过Paint.setTextSize()设置。文字大小会根据画布密度自动缩放Canvas,可以使用Canvas.getDensity()找到。

    在将要在 Canvas 上绘制的绘制对象上设置文本大小时,请使用 dpsp 的单位值,并让 Canvas 为您处理缩放。

    【讨论】:

    • Paint.setTextSize(float textSize) 中,textSize 是一个像素值。在我看来,这似乎并不能确定它会自动缩放。如果确实如此,那么我认为文档会说单位是 spdp 而不是像素。
    • 我的应用使用Canvas.drawText() 设置地图标记。我测试了不同的解决方案,但像getDimensionPixelSize(R.dimen.fontSize) 这样的建议不能正常工作:&lt;dimen name="fontSize"&gt;22sp&lt;/dimen&gt; 在 Pixel XL(1440x2560、560dpi)上看起来不错,在 Nexus 4(768x1280,xhdpi=320dpi)上它明显更小,但在 Nexus One 上(480x800,hdpi=240dpi)它很小/不可读了。 TextViews 会自动缩放,但画布也会处理某些缩放:它不会对 Android 字体设置的更改做出反应,但会确保每个设备上的文本大小相同(例如 0.5" 宽)。跨度>
    【解决方案3】:

    像这样转换它

    // The gesture threshold expressed in dip
    private static final float GESTURE_THRESHOLD_DIP = 16.0f;
    
    // Convert the dips to pixels
    final float scale = getContext().getResources().getDisplayMetrics().density;
    mGestureThreshold = (int) (GESTURE_THRESHOLD_DIP * scale + 0.5f);
    
    // Use mGestureThreshold as a distance in pixels
    

    从这里http://developer.android.com/guide/practices/screens_support.html#dips-pels

    【讨论】:

    【解决方案4】:

    在考虑显示指标的情况下,这是将 dp-s 转换为 px-els 的更短的方法

    https://developer.android.com/reference/android/content/res/Resources.html#getDimensionPixelSize(int)

    【讨论】:

      【解决方案5】:

      我知道这个话题已经过时并且已经回答了,但我也想推荐这段代码:

      int MY_DIP_VALUE = 5; //5dp
      
      int pixel= (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,
                                    MY_DIP_VALUE, getResources().getDisplayMetrics());
      

      【讨论】:

        猜你喜欢
        • 2012-07-28
        • 1970-01-01
        • 1970-01-01
        • 2023-03-31
        • 1970-01-01
        • 2012-02-17
        • 2019-01-27
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多