Qt on Android 字体挑选



  • Qt on Android 字体挑选

    在开发安卓应用的时候,发现,字体是个很大的问题,毕竟安卓上没有微软雅黑,不能直接设置微软雅黑。

    方法如下:

    1. 使用 qrc 资源文件加载 ttf,但是毕竟微软雅黑的块头在那,这么嗨大。在编译 qrc 的时候,cpu 占用极高。

    2. 挑选安卓系统上现有的字体

      在我的魅蓝 note 2 上,使用 Qt.fontFamilies() 可以打印安卓系统上的字体库。

      AndroidClock
      AndroidClock-Large
      Carrois Gothic SC
      Clockopia
      Coming Soon
      Cutive Mono
      Dancing Script
      Droid Sans Mono
      Lohit Odia
      MotoyaLMaru
      Noto Color Emoji
      Noto Naskh Arabic
      Noto Naskh Arabic UI
      Noto Sans
      Noto Sans Armenian
      Noto Sans Balinese
      Noto Sans Batak
      Noto Sans Bengali
      Noto Sans Bengali UI
      Noto Sans Buginese
      Noto Sans Buhid
      Noto Sans Canadian Aboriginal
      Noto Sans Cham
      Noto Sans Cherokee
      Noto Sans Coptic
      Noto Sans Devanagari
      Noto Sans Devanagari UI
      Noto Sans Ethiopic
      Noto Sans Georgian
      Noto Sans Glagolitic
      Noto Sans Gujarati
      Noto Sans Gujarati UI
      Noto Sans Gurmukhi
      Noto Sans Gurmukhi UI
      Noto Sans Hanunoo
      Noto Sans Hebrew
      Noto Sans Javanese
      Noto Sans JP
      Noto Sans Kannada
      Noto Sans Kannada UI
      Noto Sans Kayah Li
      Noto Sans KR
      Noto Sans Lao
      Noto Sans Lao UI
      Noto Sans Lepcha
      Noto Sans Limbu
      Noto Sans Malayalam
      Noto Sans Malayalam UI
      Noto Sans Meetei Mayek
      Noto Sans Myanmar
      Noto Sans Myanmar UI
      Noto Sans Ol Chiki
      Noto Sans Rejang
      Noto Sans Saurashtra
      Noto Sans SC
      Noto Sans Sinhala
      Noto Sans Sundanese
      Noto Sans Syloti Nagri
      Noto Sans Symbols
      Noto Sans Tagbanwa
      Noto Sans Tai Le
      Noto Sans Tai Tham
      Noto Sans Tai Viet
      Noto Sans Tamil
      Noto Sans Tamil UI
      Noto Sans TC
      Noto Sans Telugu
      Noto Sans Telugu UI
      Noto Sans Thaana
      Noto Sans Thai
      Noto Sans Thai UI
      Noto Sans Tifinagh
      Noto Sans Yi
      Noto Serif
      Roboto
      Roboto Condensed
      Source Han Sans CN
      Source Han Sans JP
      Source Han Sans KR
      

    但是看起来貌似都不靠谱呢。现在是使用 NotoSansHans-DemiLight 这个字体(7.95MB 呢)。

    求推荐。



  • Android最好字体不设置。在Windows phone系统上,字体也要换成等线字体。



  • @jiangcaiyang

    什么是等线字体?



  • @qyvlik Windows Phone 8特有的字体。是默认字体。



  • @qyvlik 说:

    字体是个很大的问题,毕竟安卓上没有微软雅黑

    刚才无意中看到墨迹天气的安卓包里assets目录下有个font文件夹你可以参考一下

    0_1449800814870_upload-c975aaef-24f7-41d0-8d45-4970035cf61a



  • @Zero 嗯,可以将字体放在assets文件夹中。这样的好处是不必在程序启动前就将该字体载入其中。


Log in to reply
 

最近的回复

  • 看了你的脚本,看来PowerShell是一种shell的方言,支持function和自定义的符号。和bash还不一样。
    我以前也写过Apple Script,看来大家都在shell语言上加上自己的特性啊。
    顺便了解到你们主要用Visual Studio开发Qt应用的。😁 😁

    read more
  • @wentaojia2014
    代码中的 {1} 是自动生成的,注意删掉

    read more
  • 脚本玩家路过一下😁
    我写了一段Powershell脚本,可以一键打开/关闭调试信息和代码优化。
    原理就是解析.sln文件(xml格式),找到关联的所有.vcproj文件(也是xml格式),并把其中的字段修改掉。

    看脚本

    # filename: DebugInfoSwitch.ps1 Add-Type -AssemblyName System.Xml.Linq # 获取绝对路径 function GetAbsolutePath { [OutputType([string])] param([string]$filePath) $aPath = Resolve-Path $filePath return Split-Path $aPath } # 解析sln文件,提取出project列表 function ParseSolution { [OutputType([string[]])] param([string]$solutionFile) $parttern = [regex]"^Project*" [string[]] $projs = @() Get-Content $solutionFile | Where-Object {$_ -match $parttern} | ForEach-Object { $items = $_.ToString().Split(',') if ($items[1].EndsWith("vcxproj`"")) { $projs += $items[1] } } return $projs } #Write-Host($debugGroup | Format-Table | Out-String ) function UpdateDebugInfo { param([System.Xml.Linq.XNamespace]$xNamespace,[System.Xml.Linq.XElement] $group, [bool]$isOpen) [System.Xml.Linq.XElement]$xClCompile = $group.Element($xNamespace + "ClCompile") [System.Xml.Linq.XElement]$xLink = $group.Element($xNamespace + "Link") [System.Xml.Linq.XElement]$format = $xClCompile.Element($xNamespace + "DebugInformationFormat") [System.Xml.Linq.XElement]$optimization = $xClCompile.Element($xNamespace + "Optimization") [System.Xml.Linq.XElement]$generate = $xLink.Element($xNamespace + "GenerateDebugInformation") if ($null -eq $format) { $format = [System.Xml.Linq.XElement]::new($xNamespace + "DebugInformationFormat") $xClCompile.Add($format) } if ($null -eq $optimization) { $optimization = [System.Xml.Linq.XElement]::new($xNamespace + "Optimization") $xClCompile.Add($optimization) } if ($null -eq $generate) { $generate = [System.Xml.Linq.XElement]::new($xNamespace + "GenerateDebugInformation") $xLink.Add($generate) } if ($isOpen) { $format.SetValue("ProgramDatabase"); $optimization.SetValue("Disabled"); $generate.SetValue("true"); } else { $format.SetValue("None"); $optimization.SetValue("MaxSpeed"); $generate.SetValue("false"); } } function SwitchDebugInfo { param([string]$projPath, [bool]$open, [bool]$isRelease) if (Test-Path($projPath)) { [System.Xml.Linq.XDocument]$xDoc = [System.Xml.Linq.XDocument]::Load($projPath) [System.Xml.Linq.XNamespace]$xNamespace = $xDoc.Root.GetDefaultNamespace(); [System.Xml.Linq.XElement]$group = $null $groups = $xDoc.Root.Elements($xNamespace + "ItemDefinitionGroup") foreach ($i in $groups) { if ($isRelease) { if ($i.Attribute("Condition").Value -match "^*Release*") { $group = $i; break; } } else { if ($i.Attribute("Condition").Value -match "^*Debug*") { $group = $i; break; } } } UpdateDebugInfo $xNamespace $group $open $xDoc.Save($projPath) } } #脚本入口函数 function Main { param([string]$sln, [bool]$open, [bool]$isRelease) Write-Host("sln file ", $sln) $slnPath= GetAbsolutePath $sln $projList = ParseSolution $sln $t = $projList.Split(' ') | ForEach-Object { $s = $_.ToString() if ($s) { $projPath=-Join($slnPath, '\', ($s.SubString(1, $s.Length - 2) )) SwitchDebugInfo $projPath $open $isRelease } } } function Usage { Write-Host ("Usage: DebugInfoSwitch.ps1 slnFilePath mode[D/d for Debug, R/r for Release] open[Y/y for open, N/n for close]") Write-Host ("Example for open Release mode debugInfo: DebugInfoSwitch.ps1 xxx.sln R y") Write-Host ("Example for close Debug mode debugInfo: DebugInfoSwitch.ps1 xxx.sln d N") } #检查参数 [string]$sln = "" [bool]$open = $true [bool]$isRelease = $false if ( $args.Count -ne 3) { Usage return } $sln = $args[0] if ($args[1] -eq "D" -or $args[1] -eq "d") { $isRelease = $false } elseif ($args[1] -eq "R" -or $args[1] -eq "r") { $isRelease = $true } else { Usage return } if ($args[2] -eq "Y" -or $args[2] -eq "y") { $open = $true } elseif ($args[2] -eq "N" -or $args[2] -eq "n") { $open = $false } else { Usage return } #调用主函数 Main $sln $open $isRelease

    用的时候,再写个bat脚本,调用这个ps1并传参数就行了。
    比如打开Release模式的调试信息、同时关掉优化开关

    @echo off powershell.exe -NoProfile -ExecutionPolicy Bypass -File DebugInfoSwitch.ps1 ./you/path/to.sln R N

    关闭调试信息、打开优化开关,则是传相反的参数

    @echo off powershell.exe -NoProfile -ExecutionPolicy Bypass -File DebugInfoSwitch.ps1 ./you/path/to.sln R Y

    read more
  • 我将USD在Linux中依赖的文件和脚本放在了我创建的QQ群里,我们的QQ群是“上海USD研究小组”。加入本小组,可以快速地在USD中上手解决编译问题,以及快速得到同行的响应。
    上海USD研究小组

    read more

关注我们

微博
QQ群