在Canvas中,我们可以为它的子元素通过附加属性Canvas.Left和Canvas.Top来设置位置,那么子元素和Canvas之间的位置关系也就很清楚了,但是我们需要更一般化的方法,来获得某个子元素相对于桌面,某个父元素等的位置关系,那就需要引入Transform的概念了,也就是通过这个数学化的概念来达到我们想到达的目的。当然除了这个,还有计算的函数,那就是来自Visual的TransformToVisual(Visual visual)方法,在该方法的MSDN文档中有这样一个例子:
XAML代码:
<StackPanel Name="myStackPanel" Margin="8"> <TextBlock Name="myTextBlock" Margin="4" Text="Hello, world" /> </StackPanel>
核心代码:
// Return the general transform for the specified visual object. GeneralTransform generalTransform1 = myStackPanel.TransformToVisual(myTextBlock); // Retrieve the point value relative to the child. Point currentPoint = generalTransform1.Transform(new Point(0, 0));
先说一下这个例子的目的是,求得myStackPanel相对于它的子元素myTextBlock的位置,我们可以猜想,若以myTextBlock的左上角为(0,0),那么算上Margin值,这个相对的位置应该是(-4,-4)。
现在看代码,首先,使用myStackPanel.TransformToVisual获得一个用于封装Transform概念的GeneralTransform对象,这是个抽象的通用类,我们可以看一下它的继承关系:
Object
DispatcherObject (abstract)
DependencyObject
Freezable (abstract)
Animatable (abstract)
GeneralTransform (abstract)
GeneralTransformGroup
Transform (abstract)
TranslateTransform
ScaleTransform
SkewTransform
RotateTransform
MatrixTransform
TransformGroup
我通过断点,发现它返回的是一个MatrixTransform类型,这就好办了,因为它们的内部都含有一个Matrix属性,用来表示Visual的Transform状况,看其中的值,就是{1,0,0,1,-4,-4},其实就是如下的一个矩阵:
|1 0 0|
|0 1 0|
|-4 -4 1|
最后一列是固定的,所以省去,按行展开,就是{1,0,0,1,-4,-4}。我们知道这个3乘以3矩阵的每个元素的作用,最后一行的前两列用于表示位移,那么,用(0,0)乘以这个矩阵后得出的点是哪个点呢(自己算算就明白,其实这里就是平移产生效果),若你懒点,就直接用Transform方法,它会帮助我们得到这个结果,那就是把我们的点Point(0,0)放进去即可,得出的点就是(-4,-4)。
-
1 Feathers类库(即原Foxhole)成为Adobe支持的UI类库
- 1.1 简介
- 1.2 实例演示
- 1.3 跨平台
- 1.4 易于皮肤定制
- 1.5 自由和开放源码
- 1.6 概述
- 1.7 组件
更新:Lee Brimelow制作了Feathers UI的视频教程。
视频教程地址:http://gotoandlearn.com/play.php?id=173
Foxhole是一个和Starling整合的UI类库,相信已经不少人开始用了,现在成为Adobe支持的类库,更给力了!
Starling中文站翻译整理
Feathers是轻量级,易于定制皮肤和扩展的UI组件(适用于移动设备和桌面)。Feathers通过Starling框架,利用GPU的强大能力渲染组件,来实现更加平滑和友好的体验。
- 源码下载:https://github.com/joshtynjala/feathers/zipball/master
- 官方站点:http://feathersui.com/
- 官方下载:http://feathersui.com/download/
- API文档:http://feathersui.com/documentation/
- 提交Bug:https://github.com/joshtynjala/feathers/issues
- 入门教程:http://wiki.starling-framework.org/feathers/getting-started
- 常见问答:http://wiki.starling-framework.org/feathers/faq
- Feathers代码风格约定:http://wiki.starling-framework.org/feathers/coding-conventions
- Components Explorer
- Layout Explorer
- Tile List
- Gallery
- Display Object Explorer
利用Feathers可以为iOS,Android,Windows,Mac构建强大的,基于硬件加速的用户界面。通过Feathers, Starling Framework和Adobe的技术可以为所有操作系统创建本地应用。
易于皮肤定制游戏通常需要UI界面风格和故事情节相匹配,而用户希望得到在某个平台上相似的用户体验。所以Feathers提供了很多皮肤选项和行为,来为移动和桌面应用定制皮肤。
自由和开放源码Feathers是基于MIT协议开源的,所以您可以随意在商业或开源项目中使用Feathers。扩展和调试可能不太容易,因为您必须读懂和修改Feathers和Starling的源码(译者注:其实代码很清晰,容易读懂)。
概述- 设计的时候已经考虑到了移动设备.
- 为电话和平板设备的性能进行了优化.
- 支持多点触摸.
- 滚动遵循了移动设备的体验,具备弹性边缘(如果需要的话,您也可以选择传统的桌面滚动条和滚轮控制).
- 易于扩展,适配不同的屏幕尺寸和DPI.
- 简单但功能强大的组件体系.
- 改变属性后,设置"失效",直到Starling的呈现阶段才会渲染(类似Flex).
- getStyle()/setStyle()方法不通过会导致含糊的字符串来设置样式,所有的皮肤和视觉属性都有严格的类型定义.
- 使用 as3-signals 代替事件.
- 工厂方法和接口允许您自定义子组件. 例如,选择最适合手机,平板电脑,或PC的组件类型.
- 易于理解,如果您用过 Adobe Flex 或 Flash Pro AS3 组件的话.
- 所有组件都是基于Starling显示对象的并且可以更换皮肤.
- 组件通常会根据提供的皮肤的大小调整自己的尺寸.
- 子组件可以继承父级的皮肤,一直嵌套下去.
- 支持从其它项目剥离的皮肤代码形成的主题.
- 支持9宫格,3宫格,以及平铺布局.
- 智能的图片管理.
- 插件支持的功能.
- 支持位图和矢量文本渲染. 也可以自定义文本渲染方式.
- 强大的按钮导航系统和过渡动画.
- 拖拽支持.
- 弹出窗体(模态和非模态).
Feathers包括许多不同的组件,比如按钮,滑块,拨动开关,复选框,单选按钮,列表,进度条,文本输入,标签,导航,容器,标注等等。来看看其中一些组件的几个值得注意的特点。
- 按钮
- 可以为每个状态定义皮肤和图标, 包括 up, hover, down, 和 disabled.
- 额外的 toggle/selection 行为.
- 文本输入
- 使用操作系统的本机输入,支持选择,复制和粘贴.
- 滚动容器
- 可以支持任何类型内容的滚动控制.
- 多种内置布局,还可以自定义布局.
- 列表
- 可滚动的列表,单项可以选中.
- 可定制的布局方式.
- 布局虚拟化(提高性能).
- 可改变itemRenderer的尺寸.
- 自定义 itemRenderers.
- 提供一个默认的itemRenderer类,来显示文本和图标,以及和按钮相似的视图状态.
- 一个 ListCollection 实现对数据的封装. 支持 Array, Vector, 和 XMLList.
- 分组列表
- 提供更强大的列表功能.
- 提供分组显示功能.
- 为headers, footers, 和 items指定独立的渲染器.
- 多维的数据描述.
- 屏幕导航
- 使用事件或消息来驱动屏幕切换 (如游戏中的菜单).
- 屏幕切换时的数据共享
- 为屏幕切换指定动画.
今天在提交应用的时候遇到了一个新问题:二进制文件已经Archive、Validate、Distribute,Itunes Connect上却显示Missing Screenshot。经查看,在Itunes Connect上3.5-Inch Retina Display Screenshots中也上传了应用截图,后来,经查看iTunes Connect Developer Guide以及开发者邮件,得知问题所在。
iTunes Connect Developer Guide中有这么一段话:
If your binary indicates that your app will run on the 4-inch Retina display, you are required to upload at least one of these screenshots.
Up to four additional optional screenshots can be uploaded. All subsequent screenshots will appear in numbered order on the App Store, in the same order in which they were uploaded in iTunes Connect. Only Newsstand apps can reorder their screenshots after they have been uploaded.
For best results, do not include the iPhone status bar in your screenshots, and follow these requirements:
640 x 1096 pixels for portrait (without status bar) minimum
640 x 1136 pixels for portrait (full screen) maximum
1136 x 600 pixels for landscape (without status bar) minimum
1136 x 640 pixels for landscape (full screen) minimum
72 ppi, RGB, flattened, no transparency
High-quality JPEG, TIFF or PNG image file format. ZIP-compressed TIFF files are not acceptable.
邮件中有这么一段:
If you deliver a new app binary that takes advantage of the new screen size for iPhone 5 or iPod touch (5th generation) without screenshots in the new dimensions, the status of your app will change to Missing Screenshot. Your app will not be reviewed until you upload screenshots with the correct dimensions. You will also need to upload screenshots for any added localizations you have set up on iTunes Connect.
那么,iTunes Connect是如何判断是否需要上传iPhone 5的应用截图的呢?
The only thing that indicates whether or not your app supports the 4-inch screen is whether you have a "Default-568h@2x.png" file or not. If you haven't added that, your app won't natively support the 4-inch screen (which is fine!) and you don't need to change any other settings or provide other screenshots.
如果你的应用不兼容iPhone 5的话,那么可以果断删除Default-568h@2x.png这个图片,然后重新上传即可。
如果你的应用兼容iPhone 5的话,那么Default-568h@2x.png这个图片就不能删了,有了这个图片就必须提供至少一张iPhone 5的应用截图了,否则就会出现Missing Screenshot的错误,所以在4-Inch Retina Display Screenshots中上传一下iPhone 5的应用截图即可。