UI 組件
Fuse里有大量現(xiàn)成的UI組件可以用來構(gòu)建用戶界面(User interface)。 在UX文件里默怨,添加UI組件很容易,只需要標(biāo)簽化它們即可,像這樣:
<Image File="MyImage.png" />
<Rectangle Width="50" Height="50" Fill="#888" />
<Text>Hello world!</Text>
注意并不是括在標(biāo)簽內(nèi)就都是UI組件姆钉,還有的是觸發(fā)器(Triggers)和動(dòng)作(Actions)。
文本 Text
先來個(gè)渲染文本的小App:
<App>
<Text>Hello, world!</Text>
</App>
簡單搞定是不是抄瓦? 但是當(dāng)有大段文字需要顯示時(shí)潮瓶,最好開啟文本包TextWrapping
屬性:
<Text TextWrapping="Wrap">Lorem Ipsum(...)</Text>
如果文字太多,TextWrapping
也搞不定钙姊,那你就得考慮把內(nèi)容放進(jìn)ScrollView
滾動(dòng)視圖中毯辅,或者是改變字體大小。TextWrapping
有兩個(gè)設(shè)定值煞额,缺省是“NoWrap”思恐,另一個(gè)是“Wrap”沾谜。
字體 Fonts
你可以導(dǎo)入ttf字庫文件,就是TrueType fonts胀莹。字體被指定后基跑,一般都會(huì)在App里自始至終的使用,所以最好給它創(chuàng)建一個(gè)全局源:
<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>
在上面這個(gè)例子里描焰,字庫文件和相關(guān)的UX文件被放在同一目錄里媳否,這樣可以保證整個(gè)項(xiàng)目都可以使用該字庫,而且只需加載一次荆秦。
iOS和安卓都支持用多字節(jié)字符集(Multibyte character sets)來渲染文字篱竭,這表示在設(shè)備上能正常渲染表情符號(hào)(emojis)。
備注:目前在桌面的預(yù)覽窗口里渲染多字節(jié)字符集還有些問題萄凤,所以遇上桌面預(yù)覽與設(shè)備上的預(yù)覽不盡相同的情況室抽,別意外,我們正在解決靡努。
文本屬性 Text properties
如需對(duì)文字渲染有更多控制坪圾,你可以設(shè)置TextAlignment
、TextColor
惑朦、FontSize
和LineSpacing
這些屬性:
<Text TextColor="#999">Left</Text>
<Text TextAlignment="Center">Center</Text>
<Text FontSize="24" TextAlignment="Right">Right</Text>
<Text LineSpacing="10">
Multiple
Lines
</Text>
逐條解釋一下上面這個(gè)例子兽泄,第一行文字元素缺省是左對(duì)齊,文字顏色設(shè)為淺灰色漾月。第二行文字是居中對(duì)齊病梢。第三行文字是右對(duì)齊并字號(hào)設(shè)為較大的24號(hào)。第四行代碼是兩行文字梁肿,行間距被設(shè)為10點(diǎn)蜓陌。TextAlignment
的有效設(shè)定值有Left
(默認(rèn))、Right
和Center
吩蔑。
數(shù)字 Number
雖然大部分情況是處理文字钮热,但有時(shí)也需要對(duì)數(shù)字進(jìn)行格式化,這就得用到Format
屬性烛芬,具體這些格式參見微軟網(wǎng)站上的這張表隧期。
目前Fuse只支持F
格式(Fixed-Point), 就是指定數(shù)字精確到小數(shù)點(diǎn)后幾位數(shù)。
下面代碼會(huì)顯示為3.141
:
<Number Value="3.14159265359" Format="F03" />
圖像 Image
顯示一個(gè)圖片:
<App>
<Image File="FuseLogo.png" />
</App>
上面的代碼假設(shè)FuseLoge.png
文件與UX文件在同一目錄赘娄,如果要從互聯(lián)網(wǎng)上加載圖片仆潮,如下所示:
<Image Url="http://path_to_image" />
備注:如果你做網(wǎng)頁開發(fā)多年,習(xí)慣使用src
設(shè)定URL地址遣臼,需要注意這里性置,雖然Image
有一個(gè)Source
屬性,用來設(shè)定一個(gè)圖片的來源揍堰,這個(gè)Resource
就是HttpImageSource
鹏浅,但是那是Fuse在背后來創(chuàng)建的辟灰,所以你要記住的是,堅(jiān)持使用Url
來加載網(wǎng)絡(luò)圖片篡石。
指定圖像源的幾種方法
還有其它的加載圖像數(shù)據(jù)的方法芥喇,這里是一個(gè)用到JavaScript做數(shù)據(jù)綁定的例子:
<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>
上面的代碼將三張圖片上下排列。最上面的圖片就是簡單的取自項(xiàng)目中的一個(gè)文件(Image1.jpg)凰萨。第二張圖片继控,首先在第一行代碼中使用 FileImageSource
來引用了一個(gè)文件(Image2.jpg),然后用DataToResource
來做數(shù)據(jù)綁定胖眷,這會(huì)從JavaScript代碼中找出并取出一個(gè)鍵值作為來源武通。最后,我們?nèi)〉靡粋€(gè)網(wǎng)上圖片的URL網(wǎng)址并使用Url
屬性與另一個(gè)Image
綁定珊搀。如果這些代碼看起來有些復(fù)雜冶忱,不要緊,我們?cè)诤竺嬖敿?xì)說說數(shù)據(jù)綁定Data Binding
, 還有JavaScript境析。
圖片上色
給一個(gè)Image
染個(gè)色是可以的囚枪,使用Color
屬性即可。注意劳淆,此法主要作用于圖片中最接近白色的部分链沼,所以想好了效果再用,看下面的例子:
<Image File="WhiteIcon.png" Color="#f00" />
這行代碼將一個(gè)白色圖標(biāo)變成了紅色沛鸵。
拉伸模式 StretchMode
當(dāng)一個(gè)Image
被置入一個(gè)容器(container), 它默認(rèn)會(huì)盡可能的占用最大顯示面積括勺,但如果圖片的寬高比與容器的不一樣,那么容器會(huì)有部分留白曲掰。
通過給Image
設(shè)置不同的StretchMode
屬性疾捍,我們可以用多種不同方式來處理這個(gè)問題,如下所示:
-
Fill
- 填充全部容器空間栏妖,不管寬高比了乱豆。 -
PixelPrecise
- 以圖片的像素為單元,確保圖片在所有設(shè)備上都保持晰利底哥,這意味著在不同分辨率的設(shè)備上咙鞍,圖片的顯示大小會(huì)不一樣房官。該選項(xiàng)會(huì)忽略容器的大小趾徽。 -
PointPrecise
- 以點(diǎn)位單位保持圖片的大小,以保證圖片在所有設(shè)備上顯示的都一樣翰守,一般會(huì)忽略掉容器大小孵奶,舉例說,64 X 64像素大小的圖片蜡峰,在設(shè)備上就精確控制在64 X 64 點(diǎn)的大小了袁。 -
PointPrefer
- 綜合了PointPrecise
與PixelPrecise
模式朗恳,該模式優(yōu)先用PointPrecise
使圖片保持正確的大小,在PixelPrecise
大約能創(chuàng)建大小合適的“on screen”圖像的情況下载绿,則該模式會(huì)使用PixelPrecise
來提升圖片的顯示清晰度粥诫。 -
Scale9
- 該模式根據(jù)的是圖片的Scale9Margin設(shè)定來拉伸顯示圖片,該設(shè)定決定哪些像素被拉伸及拉伸多少崭庸。Scale9Margin
將圖片分為9部分怀浆,四角部分會(huì)保持原始的寬高比,剩下的部分會(huì)根據(jù)圖片所需顯示的大小而進(jìn)行拉伸怕享。 -
Uniform
- 此模式是在保持圖片原始寬高比不變的情況下执赡,最大化地顯示圖片,這經(jīng)常會(huì)沒法是圖片覆蓋整個(gè)容器函筋。 -
UniformToFill
- 保持圖片的寬高比的情況下沙合,顯示覆蓋整個(gè)容器,這通常會(huì)發(fā)生容器裁掉部分圖片的情況跌帐。
拉伸方向 StretchDirection
你可以通過StretchDirection
屬性來設(shè)置拉伸方向:
-
Both
- 同時(shí)上下拉伸 -
UpOnly
- 只能上拉伸 -
DownOnly
- 只能下拉伸
內(nèi)容對(duì)齊 ContentAlignment
在使用StretchMode
和StretchDirection
屬性的情況下首懈,多多少少會(huì)發(fā)生圖片四邊形與顯示后四邊形大小不符的情況,那我們提供如下對(duì)齊選項(xiàng):
Default
Left
HorizontalCenter
Right
Top
VerticalCenter
Bottom
TopLeft
TopCenter
TopRight
CenterLeft
Center
CenterRight
BottomLeft
BottomCenter
BottomRight
圖片來源
圖片來源可以直接在Image
中用File
或Url
屬性來標(biāo)明谨敛,這么做猜拾,在圖片生命時(shí)間的多個(gè)方面會(huì)少了一些控制。
換個(gè)方式佣盒,使用ImageSource
對(duì)象挎袜,你可以只在一個(gè)地方給一個(gè)圖片文件命名,把它當(dāng)作資源肥惭,然后在項(xiàng)目的任何地方復(fù)用盯仪,這樣就不會(huì)搞得到處是相同的路徑和元數(shù)據(jù)這類信息。
下面的代碼聲明了一個(gè)圖片為一個(gè)資源:
<FileImageSource ux:Global="CloseIcon" File="close.png" Density="2" />
然后你就可以在項(xiàng)目的任何地方蜜葱,使用這個(gè)名為CloseIcon
的資源了:
<Image Source="CloseIcon" />
Fuse目前支持如下圖片源類型:
-
FileImageSource
- 指定一個(gè)本地圖片全景,并可以設(shè)定其密度值。 -
HttpImageSource
- 從一個(gè)URL網(wǎng)址指定一個(gè)圖片牵囤,并可以設(shè)定其密度值爸黄。 -
MultiDesityImageSource
- 同一個(gè)圖像內(nèi)容,給不同DPI的設(shè)備屏幕指定不同的分辨率的版本揭鳞。
另外炕贵,下面的類可以讓你更進(jìn)一步配置圖片來源:
MemoryPolicy
- 當(dāng)顯示完圖片后,不在用它時(shí)野崇,該類可以讓你控制圖片數(shù)據(jù)在內(nèi)存里的保留時(shí)間称开。
MultiDensityImageSource
現(xiàn)在市面上有非常廣泛不同規(guī)格的手持設(shè)備,有很多不同DPI的屏幕,F(xiàn)use可以讓你在一個(gè)Image
標(biāo)簽里指定不同密度的圖片文件:
<Image StretchMode="PointPrefer">
<MultiDensityImageSource>
<FileImageSource File="Icon.png" Density="1"/>
<FileImageSource File="Icon.png@2x.png" Density="2"/>
</MultiDensityImageSource>
</Image>
然后Fuse會(huì)為不同DPI的屏幕自動(dòng)適配圖片源鳖轰,并且會(huì)兼顧到圖片的拉伸模式設(shè)定清酥。
HttpImageSource
HttpImageSource
- 可以讓你指定一個(gè)從網(wǎng)上用HTTP取來的圖片文件,并會(huì)異步顯示蕴侣。
<Image>
<MultiDensityImageSource>
<HttpImageSource Url="{image_url_1x}" Density="1"/>
<HttpImageSource Url="{image_url_2x}" Density="2"/>
</MultiDensityImageSource>
</Image>
或者焰轻,你想用一個(gè)固定密度的圖片,代碼就少了很多:
<Image Url="{image_url}" />
注意:從網(wǎng)上用HTTP取圖片需要些時(shí)間才會(huì)加載昆雀,在加載前鹦马,F(xiàn)use根本不知道圖片的尺寸,因此忆肾,當(dāng)App的布局是基于網(wǎng)上圖片的大小時(shí)荸频,你要格外小心。