2013年4月24日
周三常见问题解答:杂项问题
今天是周三,又到了解答常见问题的时间。以下是一些常见问题(FAQ)。
1. 为什么 native.setActivityIndicator 在我的代码中不起作用?
native.setActivityIndicator 不能在同一个代码块中设置和清除。所有显示对象(包括原生对象)在代码块结束之前都不会渲染到屏幕上。
以下是设置活动指示器的错误方式。活动指示器直到函数结束后才设置,然后被清除。(注意:Android 中当前存在一个错误,在这个例子中活动指示器不会关闭。)
1 2 3 4 5 |
native.setActivityIndicator( true ) for i = 1, 1000 do print( "i = " .. i ) end native.setActivityIndicator( false ) |
这是设置活动指示器的正确方式。指示器在一秒后清除。这种方法的弊端是活动指示器在 for 循环 执行后才设置,因此在 for 循环 运行时不会显示活动指示器。
1 2 3 4 5 6 7 |
native.setActivityIndicator( true ) for i = 1, 1000 do print( "i = " .. i ) end -- 一秒后关闭指示器 timer.performWithDelay( 1000, function() native.setActivityIndicator( false ) end ) |
上述问题的解决方案是在定时器函数中运行 for 循环 代码。在定时器开始之前启动活动指示器,并在定时器函数中关闭活动指示器。
1 2 3 4 5 6 7 8 9 |
native.setActivityIndicator( true ) timer.performWithDelay( 100, function() for i = 1, 1000 do print( "i = " .. i ) end native.setActivityIndicator( false ) end ) |
2. 我在使用动态缩放,但在不同设备上测试时,原生 textField 和 textBox 的字体大小没有变化。
当你在 config.lua 中指定目标屏幕大小时,这允许显示对象根据设备的本地屏幕大小进行缩放。唯一的例外是原生文本字段中使用的字体。字体不会自动缩放,因此需要手动调整字体大小。你可以通过读取设备类型(使用 system.getInfo( “model” ))或读取设备的缩放因子(display.contentScaleX 和 display.contentScaleY)来确定正确的大小。对于 Android,我们最近在每日构建版本中添加了一些新的 system.getInfo API 调用,可能会有所帮助:“androidDisplayWidthInInches”、“androidDisplayHeightInInches”、“androidDisplayXDpi” 和 “androidDisplayYDpi”。
3. 从构建版本 1076 开始,我的 network.request 调用不再工作了。发生了什么?
从构建版本 1053 开始,我们为所有平台添加了默认的 Content-Type 字段 “text/plain”。这样做是为了在平台之间保持一致。在构建版本 1053 之前,我们依赖操作系统来提供 Content-Type 字段(如果 network.request 中缺少该字段)。如果你的 network.request 包含一个等于 “binary” 的 parms.bodyType,或者你的 parms.body 包含一个表(指定文件名),则 Content-Type 将被设置为 “application/octet-stream”。如果你的 network.request 为 Content-Type 指定了一个值,它将覆盖默认值。在所有其他情况下,它将被设置为 “text/plain”。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
-- 使用用户名/密码登录的示例代码 local function networkListener( event ) print( "networkListener called", event.response ) end local user = "myName" local password = "abc" local headers = {} headers["Content-Type"] = "application/x-www-form-urlencoded" local body = "login="..user.."&password="..password local params = {} params.headers = headers params.body = body -- 转到 http://requestb.in/ 设置一个测试页面 network.request("http://requestb.in/", "POST", networkListener, params ) |
4. Display.save 现在在保存的图像中显示白色背景。背景以前是黑色的。
我们在 display.save 捕获中存在一个混合问题,通过使正在保存的对象后面的背景完全透明来修复。此更改发生在构建版本 1079 中。如果要保存组,则背景将是透明的,这是未定义的。在 1079 之前,我们将背景设置为黑色,这给一些用户带来了问题。现在,当保存到 .JPEG 文件时,透明区域可能会显示为黑色或白色。如果将其保存到 .PNG 文件(display.save 现在支持),则背景将是透明的,并在显示时呈现现有背景。
在 display.save 中指定 .PNG 文件是保存组时解决问题的一种方法。另一种方法是创建一个与你的组大小相同的黑色 display.newRect,并将其填充为黑色,并将其插入到所有其他组对象的后面。在调用 display.save 之前执行此操作,并在之后删除 newRect 对象。
5. 我正在使用 Corona SDK 的发布版本,并且在小部件中看到错误。我该怎么办?
好消息是,我们决定开源我们的 Widgets 2.0 库。我们已将该库上传到 GitHub,您可以在自己的项目中包含它。这与我们每日构建版本中包含的代码相同,我们的计划是保持两者同步。这意味着无法访问我们每日构建版本的初学者仍然可以使用最新的 Widget 库。如果您发现 Widget 错误,请提交错误报告和一个演示该错误的小测试项目。在报告中,请提及您正在使用的 Corona 版本以及您报告的 Widget 库版本。在此处获取更多信息 here
这就是今天的问题。我希望您喜欢它们,甚至学到了一些东西。
J. A. Whye
发布于 17:50, 4 月 25 日关于#2,您说
“...字体大小需要手动调整。您可以通过...读取设备的缩放因子(display.contentScaleX 和 display.contentScaleY)来确定正确的大小。”
这如何确定正确的大小?我认为还有更多需要考虑的。
从论坛中我抓取了这个
local fontSize = 14 / display.contentScaleY
...但这不起作用。它在 iPhone 4S 上给了我很大的字体,在 iPad Retina 上给了我巨大的字体。经过反复试验,我添加了这个
if fontSize > 14 then fontSize = fontSize * .66 end
...这在很大程度上修复了问题。字体大小在不同设备上并不完全相同,但它们很接近。尚未在 Android 设备上进行测试,但我真希望有一种*确定的*方法来处理这个问题。
有人吗?
Jay
Ragdog 工作室
发布于 12:51, 4 月 28 日我认为最好的方法是根据 iOS 上的设备型号和 contentScale 以及 Android 上的新参数来计算特定的大小。
如果它是 iPad,并且 contentScale 适合 Retina,则您给出一个特定的大小。如果它是普通的 iPad,则您给出另一个大小。如果它属于 iPhone 的范围,则您为 iPhone 3GS 及更低版本给出一个大小,为 iPhone 4 及更高版本给出一个大小(始终检查比例)。
理想情况下,您可以只设置一个取决于上述的乘数,并以 iPhone 3GS 为基础编写所有字体大小,然后将其乘以正确的值。