About

<#TEMPLATE_INCLUDE_NINEPAGE_ABOUTME#>
  • Feb

    17

    contentsScaleFactor 引发的 TextField 与位图 draw() 的问题

    • 0 Comments
    • Flash Platform
    • 发布:古树悬叶
    • 引用:0
    • 浏览:

    AIR SDK 22 开始,在对 AIR 桌面应用程序开发时允许加入 requestedDisplayResolution 标签,用以高清缩放显示文字。但发现一个bug,无论是在 Win10 或 MAC 系统中(一般 Win 10 小尺寸的高分屏2K会以125%或150%显示,或 Retina 屏的 MAC 电脑中)都存在,包括最新的 AIR SDK 32 版本也试了一样的结果,凡是 stage 属性的 contentsScaleFactor 如果不为1,stage 对象产生缩放效果后,虽然其它对象都是正常的,但 TextField 是个特例,它只是看起来像按 125%或 150%缩放的,但实际它并不是,它同时产生了字体大小的变化、字间距、行间距等变化,按本人的理解这种变化结果是字符最终显示以像素为单位的,所以会被四舍五入,不像矢量或位图对象宽高都可以使用浮点数。

    一般情况下使用并不会有问题,但如果此后对TextField 调用 Bitmap 的 draw() 方法(或对某个包含 TextField 对象的显示对象调用位图的 draw() 方法),产生的位图并不是与 contentsScaleFactor 缩放后的显示结果相同的,而是与 contentsScaleFactor 属于为 1 时的结果相同。当字数越多、行数越多的时候,这种差异会越明显(因为每一行的行间距、字间距等都被四舍五入)。

    能想到的方法就是使用 TLFTextField 代替 TextField ,但觉的 TLFTextField 问题也不少,比如当侦听器侦听 change 事件的时候,输入一个字符,会产生两次 change 事件。我囧!

    还有现在的 TLF 文本版本比较多,建义找个最新版本吧。查看了 Apache Flex SDK 帮助手册有 TextLayoutVersion.VERSION_3_0 版本,比现在官方的 VERSION_2_0 还要新。我在使用官方的 VERSION_2_0 又发现了Bug,如果编译器的 -swf-version 设为 23-25 正常,如果大于 25 当输入的文字超过两行时有时候会让前面的文字消失(有时需要按回车才能让它重新显示)。我试了将 SDK 换成 Apache Flex SDK 的 VERSION_3_0  最新版本,将编译器的 -swf-version 设为最新的 43 版本编译出来后的结果是正确的。

    不过使用 TLFTextField 与 TextField 有一个样式功能上缺陷,如果通过 TextFormat 设置样式时,bullet 属性是无效的。我囧囧囧!

    相关资料:《处理大小和缩放对象》中间有一段文字在加粗“注:”字后面有介绍。

    • Tags:
    • 2019 / 2 / 17
    相关文章:
      Post Comment.

      发表评论