美文网首页
【译】Fuse入门(三)

【译】Fuse入门(三)

作者: 赵赵811 | 来源:发表于2015-12-21 00:44 被阅读0次

    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的布局是基于网上图片的大小时,你要格外小心。

    相关文章

      网友评论

          本文标题:【译】Fuse入门(三)

          本文链接:https://www.haomeiwen.com/subject/majmhttx.html