【译】Fuse入门(三)

UI 组件

Fuse里有大量现成的UI组件可以用来构建用户界面(User interface)。 在UX文件里,添加UI组件很容易,只需要标签化它们即可,像这样:

<Image File="MyImage.png" />
<Rectangle Width="50" Height="50" Fill="#888" />
<Text>Hello world!</Text>

注意并不是括在标签内就都是UI组件,还有的是触发器(Triggers)和动作(Actions)。

文本 Text

先来个渲染文本的小App:

<App>
    <Text>Hello, world!</Text>
</App>

简单搞定是不是? 但是当有大段文字需要显示时,最好开启文本包TextWrapping属性:

<Text TextWrapping="Wrap">Lorem Ipsum(...)</Text>

如果文字太多,TextWrapping也搞不定,那你就得考虑把内容放进ScrollView滚动视图中,或者是改变字体大小。TextWrapping有两个设定值,缺省是“NoWrap”,另一个是“Wrap”。

字体 Fonts

你可以导入ttf字库文件,就是TrueType fonts。字体被指定后,一般都会在App里自始至终的使用,所以最好给它创建一个全局源:

<App>
    <Font File="Roboto-Medium.ttf" ux:Global="Medium" />
    <Font File="Roboto-Light.ttf" ux:Global="Light" />
    <StackPanel>
        <Text Font="Light">Roboto Light</Text>
        <Text Font="Medium">Roboto Medium</Text>
        <Text Font="Light">Roboto Light again</Text>
    </StackPanel>
</App>

在上面这个例子里,字库文件和相关的UX文件被放在同一目录里,这样可以保证整个项目都可以使用该字库,而且只需加载一次。

iOS和安卓都支持用多字节字符集(Multibyte character sets)来渲染文字,这表示在设备上能正常渲染表情符号(emojis)。

备注:目前在桌面的预览窗口里渲染多字节字符集还有些问题,所以遇上桌面预览与设备上的预览不尽相同的情况,别意外,我们正在解决。

文本属性 Text properties

如需对文字渲染有更多控制,你可以设置TextAlignmentTextColorFontSizeLineSpacing这些属性:

<Text TextColor="#999">Left</Text>
<Text TextAlignment="Center">Center</Text>
<Text FontSize="24" TextAlignment="Right">Right</Text>
<Text LineSpacing="10">
Multiple
Lines
</Text>

逐条解释一下上面这个例子,第一行文字元素缺省是左对齐,文字颜色设为浅灰色。第二行文字是居中对齐。第三行文字是右对齐并字号设为较大的24号。第四行代码是两行文字,行间距被设为10点。TextAlignment的有效设定值有Left(默认)、RightCenter

数字 Number

虽然大部分情况是处理文字,但有时也需要对数字进行格式化,这就得用到Format属性,具体这些格式参见微软网站上的这张表

目前Fuse只支持F格式(Fixed-Point), 就是指定数字精确到小数点后几位数。

下面代码会显示为3.141

<Number Value="3.14159265359" Format="F03" />

图像 Image

显示一个图片:

<App>
    <Image File="FuseLogo.png" />
</App>

上面的代码假设FuseLoge.png文件与UX文件在同一目录,如果要从互联网上加载图片,如下所示:

<Image Url="http://path_to_image" />

备注:如果你做网页开发多年,习惯使用src设定URL地址,需要注意这里,虽然Image有一个Source属性,用来设定一个图片的来源,这个Resource就是HttpImageSource,但是那是Fuse在背后来创建的,所以你要记住的是,坚持使用Url来加载网络图片。

指定图像源的几种方法

还有其它的加载图像数据的方法,这里是一个用到JavaScript做数据绑定的例子:

<FileImageSource ux:Key="pic2" File="Images/Image2.jpg" />
<StackPanel>
    <JavaScript>
        module.exports = {
            imageResource: "pic2",
            url: "http://somewhereontheinternet/Cute-Cat.jpg"
        }
    </JavaScript>
    <Image File="Images/Image1.jpg" />
    <Image Source="{DataToResource imageResource}" />
    <Image Url="{url}" />
</StackPanel>

上面的代码将三张图片上下排列。最上面的图片就是简单的取自项目中的一个文件(Image1.jpg)。第二张图片,首先在第一行代码中使用 FileImageSource来引用了一个文件(Image2.jpg),然后用DataToResource来做数据绑定,这会从JavaScript代码中找出并取出一个键值作为来源。最后,我们取得一个网上图片的URL网址并使用Url属性与另一个Image绑定。如果这些代码看起来有些复杂,不要紧,我们在后面详细说说数据绑定Data Binding, 还有JavaScript。

图片上色

给一个Image染个色是可以的,使用Color属性即可。注意,此法主要作用于图片中最接近白色的部分,所以想好了效果再用,看下面的例子:

<Image File="WhiteIcon.png" Color="#f00" />

这行代码将一个白色图标变成了红色。

拉伸模式 StretchMode

当一个Image被置入一个容器(container), 它默认会尽可能的占用最大显示面积,但如果图片的宽高比与容器的不一样,那么容器会有部分留白。

通过给Image设置不同的StretchMode属性,我们可以用多种不同方式来处理这个问题,如下所示:

  • Fill - 填充全部容器空间,不管宽高比了。
  • PixelPrecise - 以图片的像素为单元,确保图片在所有设备上都保持晰利,这意味着在不同分辨率的设备上,图片的显示大小会不一样。该选项会忽略容器的大小。
  • PointPrecise - 以点位单位保持图片的大小,以保证图片在所有设备上显示的都一样,一般会忽略掉容器大小,举例说,64 X 64像素大小的图片,在设备上就精确控制在64 X 64 点的大小。
  • PointPrefer - 综合了PointPrecisePixelPrecise模式,该模式优先用PointPrecise使图片保持正确的大小,在PixelPrecise大约能创建大小合适的“on screen”图像的情况下,则该模式会使用PixelPrecise来提升图片的显示清晰度。
  • Scale9 - 该模式根据的是图片的Scale9Margin设定来拉伸显示图片,该设定决定哪些像素被拉伸及拉伸多少。Scale9Margin将图片分为9部分,四角部分会保持原始的宽高比,剩下的部分会根据图片所需显示的大小而进行拉伸。
  • Uniform - 此模式是在保持图片原始宽高比不变的情况下,最大化地显示图片,这经常会没法是图片覆盖整个容器。
  • UniformToFill - 保持图片的宽高比的情况下,显示覆盖整个容器,这通常会发生容器裁掉部分图片的情况。

拉伸方向 StretchDirection

你可以通过StretchDirection属性来设置拉伸方向:

  • Both - 同时上下拉伸
  • UpOnly - 只能上拉伸
  • DownOnly - 只能下拉伸

内容对齐 ContentAlignment

在使用StretchModeStretchDirection属性的情况下,多多少少会发生图片四边形与显示后四边形大小不符的情况,那我们提供如下对齐选项:

  • Default
  • Left
  • HorizontalCenter
  • Right
  • Top
  • VerticalCenter
  • Bottom
  • TopLeft
  • TopCenter
  • TopRight
  • CenterLeft
  • Center
  • CenterRight
  • BottomLeft
  • BottomCenter
  • BottomRight

图片来源

图片来源可以直接在Image中用FileUrl属性来标明,这么做,在图片生命时间的多个方面会少了一些控制。

换个方式,使用ImageSource对象,你可以只在一个地方给一个图片文件命名,把它当作资源,然后在项目的任何地方复用,这样就不会搞得到处是相同的路径和元数据这类信息。

下面的代码声明了一个图片为一个资源:

<FileImageSource ux:Global="CloseIcon" File="close.png" Density="2" />

然后你就可以在项目的任何地方,使用这个名为CloseIcon的资源了:

<Image Source="CloseIcon" />

Fuse目前支持如下图片源类型:

  • FileImageSource - 指定一个本地图片,并可以设定其密度值。
  • HttpImageSource - 从一个URL网址指定一个图片,并可以设定其密度值。
  • MultiDesityImageSource - 同一个图像内容,给不同DPI的设备屏幕指定不同的分辨率的版本。

另外,下面的类可以让你更进一步配置图片来源:

MemoryPolicy - 当显示完图片后,不在用它时,该类可以让你控制图片数据在内存里的保留时间。

MultiDensityImageSource

现在市面上有非常广泛不同规格的手持设备,有很多不同DPI的屏幕,Fuse可以让你在一个Image标签里指定不同密度的图片文件:

<Image StretchMode="PointPrefer">
    <MultiDensityImageSource>
        <FileImageSource File="Icon.png" Density="1"/>
        <FileImageSource File="Icon.png@2x.png" Density="2"/>
    </MultiDensityImageSource>
</Image>

然后Fuse会为不同DPI的屏幕自动适配图片源,并且会兼顾到图片的拉伸模式设定。

HttpImageSource

HttpImageSource - 可以让你指定一个从网上用HTTP取来的图片文件,并会异步显示。

<Image>
    <MultiDensityImageSource>
        <HttpImageSource Url="{image_url_1x}" Density="1"/>
        <HttpImageSource Url="{image_url_2x}" Density="2"/>
    </MultiDensityImageSource>
</Image>

或者,你想用一个固定密度的图片,代码就少了很多:

<Image Url="{image_url}" />

注意:从网上用HTTP取图片需要些时间才会加载,在加载前,Fuse根本不知道图片的尺寸,因此,当App的布局是基于网上图片的大小时,你要格外小心。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,752评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,100评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,244评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,099评论 1 286
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,210评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,307评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,346评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,133评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,546评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,849评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,019评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,702评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,331评论 3 319
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,030评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,260评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,871评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,898评论 2 351

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,917评论 25 707
  • ¥开启¥ 【iAPP实现进入界面执行逐一显】 〖2017-08-25 15:22:14〗 《//首先开一个线程,因...
    小菜c阅读 6,381评论 0 17
  • 问答题47 /72 常见浏览器兼容性问题与解决方案? 参考答案 (1)浏览器兼容问题一:不同浏览器的标签默认的外补...
    _Yfling阅读 13,744评论 1 92
  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 12,074评论 4 62
  • 长腿妹妹是班里的起床困难户,因为前几天利用早操时间加练理化生实验,为了督促长腿妹妹和大家一起练实验。我以和长腿妹妹...
    阿拉小仙儿阅读 174评论 0 0