- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我目前正在开发一个以 iPad2 作为硬件平台的 Adobe AIR 应用程序,无法在其中一个屏幕上获得良好的滚动性能。我正在使用一个 Spark 列表,带有一个自定义项目渲染器,如下所示:
<s:List id="productList" top="116" bottom="0" left="10" right="10"
width="100%"
visible="true" includeInLayout="true"
height="0"
maxHeight="500"
opaqueBackground="#ffffff"
itemRenderer="myRenderer">
</s:List>
最初,我使用的是 .mxml 渲染器,但在看到令人讨厌的性能后,我决定推出自己的渲染器,扩展 UIComponent(我省略了包和大括号以节省水平空间):
import mx.controls.listClasses.IListItemRenderer;
import mx.core.UIComponent;
import mx.events.FlexEvent;
import mx.utils.ColorUtil;
import spark.components.Label;
import spark.components.TextInput;
public final class OrderViewProductLineTestIR extends UIComponent implements IListItemRenderer
{
public function OrderViewProductLineTestIR()
{
super();
}
// Internal variable for the property value.
private var _data:Object;
private var productName:Label;
private var orderQty:TextInput;
private var stockQty:TextInput;
// Make the data property bindable.
[Bindable("dataChange")]
// Define the getter method.
public function get data():Object
{
return _data;
}
// Define the setter method, and dispatch an event when the property
// changes to support data binding.
public function set data(value:Object):void
{
_data = value;
invalidateProperties();
dispatchEvent(new FlexEvent(FlexEvent.DATA_CHANGE));
}
override protected function createChildren():void
{
super.createChildren();
productName = new Label();
// productName.visible = true;
addChild(productName);
orderQty = new TextInput();
addChild(orderQty);
stockQty = new TextInput();
addChild(stockQty);
}
override protected function commitProperties():void
{
super.commitProperties();
productName.text = _data.Name;
}
override protected function updateDisplayList(unscaledWidth:Number, unscaledHeight:Number):void
{
super.updateDisplayList(unscaledWidth, unscaledHeight);
productName.move(0, 0);
productName.setActualSize(250, 48);
orderQty.move(270, 0);
orderQty.setActualSize(100, 48);
stockQty.move(390, 0);
stockQty.setActualSize(100, 48);
}
override protected function measure():void
{
super.measure();
measuredWidth = 490;
measuredHeight = 48;
}
}
如您所见,这是相当轻量级的,但我的数据提供者包含超过 100 个项目,其中 11 个可以同时显示在屏幕上。我读到的关于提高滚动性能的所有内容都围绕着使用 opaqueBackground
和 cacheAsBitmap
,但是无论我尝试什么都没有帮助。在列表级别使用 cacheAsBitmap
没有帮助,因为一旦您滚动超过几行需要重新渲染整个内容并在快速滚动时项目渲染器级别仍然非常慢 — 大概是因为在非常快速的滚动过程中许多项目被立即回收。
我知道 iPad 在帧中以 60 fps 的速度传输一屏信息应该没有问题,但是当我快速滚动时,我发现它很难达到 10 fps(从视觉上)。所以问题是:我是否遗漏了一些明显的东西,或者这是由于使用 AIR 时涉及的层数(和矢量渲染)而导致的?为了记录,我尝试过更改渲染模式对于应用程序并尝试更改帧速率以消除明显的问题。
最佳答案
这个有点猜测,但是itemRenderer可以优化吗?每次组件重绘时,是否所有子项都需要定位和调整大小?每次运行 commitProperties 时都需要更新 productName.text 吗?
以下是我可能会如何修改:
import mx.controls.listClasses.IListItemRenderer;
import mx.core.UIComponent;
import mx.events.FlexEvent;
import mx.utils.ColorUtil;
import spark.components.Label;
import spark.components.TextInput;
public final class OrderViewProductLineTestIR extends UIComponent implements IListItemRenderer
{
public function OrderViewProductLineTestIR()
{
super();
}
// Internal variable for the property value.
private var _data:Object;
// Add a dataChanged property
private var dataChanged :Boolean = false
private var productName:Label;
private var orderQty:TextInput;
private var stockQty:TextInput;
// Make the data property bindable.
[Bindable("dataChange")]
// Define the getter method.
public function get data():Object
{
return _data;
}
// Define the setter method, and dispatch an event when the property
// changes to support data binding.
public function set data(value:Object):void
{
_data = value;
// switch the dataChanged flag
dataChanged = true;
invalidateProperties();
dispatchEvent(new FlexEvent(FlexEvent.DATA_CHANGE));
}
override protected function createChildren():void
{
super.createChildren();
productName = new Label();
// productName.visible = true;
addChild(productName);
orderQty = new TextInput();
addChild(orderQty);
stockQty = new TextInput();
addChild(stockQty);
}
override protected function commitProperties():void
{
super.commitProperties();
// Only update the display if the data actually changed
If(dataChanged){
productName.text = _data.Name;
dataChanged = false;
}
}
// add variable to tell whether the component's children have been sized and positioned or not
// since they have static locations, no need to set these each time
protected var compChildrenSized :Boolean = false;
override protected function updateDisplayList(unscaledWidth:Number, unscaledHeight:Number):void
{
super.updateDisplayList(unscaledWidth, unscaledHeight);
if(!compChildrenSized){
productName.move(0, 0);
productName.setActualSize(250, 48);
orderQty.move(270, 0);
orderQty.setActualSize(100, 48);
stockQty.move(390, 0);
stockQty.setActualSize(100, 48);
compChildrenSized = true;
}
}
override protected function measure():void
{
super.measure();
measuredWidth = 490;
measuredHeight = 48;
}
}
我想我要补充一点,我不确定测量是否会运行。如果将 textInputs 替换为标签会怎样?您使用的是 Flex 4.6,如果是,您使用的是 StyleableStageText(又名 StageText)还是使用 StyleableTextField 的 4.5 皮肤?我想知道 StageText 滚动是否会降低性能,因为它卡在 Flash 显示列表上方。
如果完全删除 textInput 并替换为标签会怎样?
这些都是小事,我不确定它们是否有帮助。
关于performance - iPad 上的 Adobe AIR 滚动性能 (2) - 我能期待什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10183386/
我是 Adobe InDesign Server 的新手,我很难找到一个好的厨房水槽应用程序。我从 SDK 获得的所有示例似乎都部分起作用。我想要做的就是从服务器端使用 InDesign 的母版页
关闭。这个问题不满足Stack Overflow guidelines .它目前不接受答案。 想改善这个问题吗?更新问题,使其成为 on-topic对于堆栈溢出。 6年前关闭。 Improve thi
我有一个带有完整设计页面的 xd adobe 链接。我想在 adobe xd windows 桌面应用程序中打开这些设计页面,但我不能。如何在 adobe xd windows 桌面应用程序中打开此链
activeDocument.fitArtboardToSelectedArt() 调用此命令时,AI 在 AI 5.1/6 32 位和 64 位版本上崩溃。我可以使用菜单中的命令。有没有人遇到过这个
activeDocument.fitArtboardToSelectedArt() 调用此命令时,AI 在 AI 5.1/6 32 位和 64 位版本上崩溃。我可以使用菜单中的命令。有没有人遇到过这个
如果可以,应该在哪里配置? 从文档中,所有提到的忽略文件都是关于从 SVN 提交 中排除 .vlt,但我们面临相反的问题 — 我们想排除来自 VLT 提交 的文件系统上的文件——例如.DS_Store
我正在 AdobeXD 中制作移动下拉菜单。 除了我的主页,我还有另外两个画板;菜单本身和一个按钮。 我想要做的就是触发菜单向下滑动,并将退出按钮覆盖在首先触发效果的按钮顶部。 它会覆盖退出按钮,
Javascript 的 setTimeout函数是window的一个方法目的。此对象在 ExtendScript 中不存在,因此不可用于为 Adobe InDesign 或 Illustrato
有人可能会争论它是否与摄影有关,但由于它与 DNG 格式有关,所以在这里问。 我正在尝试构建一个 Adobe DNG SDK,以便我能够将许多不同的相机原始格式转换为 *.dng 格式。 我为 h
我正在 Adobe CQ5.5 中开发一个自定义容器组件,我想要一个自定义消息作为占位符,而不是默认的“将组件或 Assets 拖到此处”。 到目前为止,我发现我必须添加 cq:emptyText
我想在导入 XML 时使用 Internet URL 将图像加载到 InDesign 模板中。 这可能吗?或者图片是否需要存储在本地机器上? 最佳答案 这可能吗?不需要。镜像需要存储在本地机器上吗?是
在 Adobe Edge Animate 中,如何获取 Symbol 的当前时间? 我混合使用 jQuery 和 Adobe Edge 代码来编程我的页面。我想检查一个符号的时间是否停留在第一
如果我将 adobe xd 文档放置在本地计算机上的任何位置。 示例:C:\doc\adobe-xd\brand\brand.xd 打开它并运行插件 是否可以检索 adobe xd 文档位置。 P.S
我正在使用 AEM 6.1 和 Maven 来管理依赖项。我可以看到 bundle com.adobe.granite.poi 版本 2.0.0 随 AEM 实例一起提供。但我似乎无法在 Adob
我正在使用 adobe labs magic selection 工具,但它要求用户进行 adobe 登录。有什么办法可以不让用户登录,但仍然使用 magic selection 工具?我听说过这个,
我们有 Adobe PDF writer,希望能够使用它而不是 ghostscript。 SaveAs() 函数是否锁定在 ghostscript 中,如果是,我该如何使用 adobe pdf w
我想知道 Adobe Experience Manager (AEM) 6.2/6.3 使用哪个版本的 Apache Sling?我在各种网站上进行了搜索,包括 Adobe 自己的文档,但似乎
还在努力探索动作剧本。有没有办法访问Android手机的接近感应器?想要使用传感器的输出关闭探测器。找到了里查多松/接近感应器(https://github.com/richardolsson/pro
我对 Day Cq5 还很陌生。我的对话框中有一个复选框,我想在用户选择或取消选择它时在我的 jsp 中检索它的 bool 值。请帮忙 最佳答案 如果要从组件的 JSP 中检索值,请执行以下操作: b
http://helpx.adobe.com/experience-manager/kb/HowToDefineComponentListDynamically.html 我在上面尝试过,但由于文章的
我是一名优秀的程序员,十分优秀!