什么是Fuse
Fuse是一款可以实时创建可交互ios/Android原生应用的软件,它用UX markup语言(一种非常类似于HTML的标记语言)可以快速创建UI和UX交互,用javaScript编写程序逻辑,除此之外还可以导出原生的Xcode项目,在模拟器或者真机上进行操作。
接下来我向大家详细介绍一下它的安装过程,最后带着大家一步一步创建一个UX动画的小示例,并熟悉一下UX markup这个新的语言(目前互联网上关于它的介绍可以说几乎没有)
Fuse的安装(Mac OSX)
由于下载比较慢(90mb的软件居然下了1个多小时),所以我把安装文件传到了百度网盘上:
百度网盘地址
下载完毕后,打开文件夹,里面有两个东西,一个是Fuse的安装包,还有一个是配套使用的编辑器:
1.首先打开安装包Fuse_0_5_3373.pkg
这一步很简单,只要一直继续/下一步就可以完成了
打开终端,输入
fuse
如果出现以下内容:
Trying to start the daemon as a background process.
A daemon background process was successfully started.
并弹出一个对话框:
启动Fuse
恭喜你!安装成功!
2.打开另一个文件,把编辑器拖到应用程序文件夹
将Sublime Text打开一下,再关闭,如果一次都没有打开,就无法安装Fuse的插件,为我们提供代码高亮和自动补齐功能。
打开终端输入以下命令来安装Fuse插件:
fuse install sublime-plugin
显示安装成功后重启编辑器,如果Project菜单项中有New Fuse project这一项说明插件安装成功!
如何创建Fuse项目
打开终端,使用cd命令将当前目录转到你想要创建Fuse工程的目录,比如桌面:
cd /Users/<你的用户名>/Desktop
输入以下代码,来创建一个名叫hello的工程:
fuse create app hello
如果显示出:
Created project hello at '<你的Fuse工程目录>'
说明工程创建成功
编辑和运行项目
打开工程文件,会看到以下几个文件
屏幕快照 2015-08-24 上午9.48.01.png
-
devices.json 放置一些模拟器的配置信息
-
hello.unoproj 工程文件
-
MainView.ux 默认生成的UX markup源代码,我们主要在这里进行代码编写
用Sublime编辑器打开MainView.ux
屏幕快照 2015-08-24 上午9.54.06.png
这是自动生成的模板文件,可以直接运行,在终端中输入命令来运行它:
fuse preview
如果没有错误,应该会出现以下运行结果:
屏幕快照 2015-08-24 上午10.05.45.png如果这时你改变MainView.ux的代码,然后保存,你会发现你的改变会实时反映出来,不需要重新运行。比如你改变switch标签中的Alignment的值为Center,运行结果会立刻改变,如下所示: 屏幕快照 2015-08-24 上午10.56.08.png
当然你也可以导出Xcode工程,并在模拟器上运行:
屏幕快照 2015-08-24 上午10.09.png点击Build
屏幕快照 2015-08-24 上午10.09.59.png点击Build,然后等待一段时间编译好的Xcode项目会自动打开
屏幕快照 2015-08-24 上午10.10.pngCmd+R运行它,如果没有问题就会打开模拟器,运行我们的工程
屏幕快照 2015-08-24 上午10.11.png下面我们来看看文件的结构,并熟悉一些标签,这代码看起来非常熟悉,因为这个和HTML如出一辙:
屏幕快照 2015-08-24 上午9.54.06.png
- 首先
<App Theme="Basic" ClearColor="#eeeeeeff"></App>
标签,是我们应用程序的接入点,是应用程序的根类
Theme
属性定义整个app的外观等信息,可以自定义,但是目前还不太会用。。以后我会研究一下。
ClearColor
用来定义app的背景色 -
<DockPanel></DockPanel>
标签可以对它之内的各个组件进行排列,将他们锁定到特定方位(Top,Left,Right,Bottom) -
<StatusBarBackground DockPanel.Dock="Top" />
设定手机状态栏的位置,留出相应地空间。 -
<ScrollViewer ClipToBounds="true"></ScrollViewer>
相当于iOS中的ScrollView的作用,把它内部的元素全部放入一个scrollView中。 -
<StackPanel></StackPanel>
对其内部的元素按一个方向进行排列(水平和竖直排列,在默认情况下是竖直排列,如果要水平排列的话,将它的Orientation属性的值改为"Horizontal",<StackPanel Orientation="Horizontal">
)
所有标签的使用说明可以在它的Class Reference中找到:
[UX Class Reference] (https://www.fusetools.com/developers/ux)
创建一个UX动画的示例
创建一个Fuse工程,名为UXAnimation:
新建工程
我们要有4个不同的UX动画效果,所以首先我们要创建含有4页的PageControl元素,首先新建4个新的UX文件,分别代表4个页:
StaggeredAnimation.ux
AnchoredAnimation.ux
ClickEvents.ux
ScrollingBasics.ux
然后我们初始化每一页:
StaggeredAnimation.ux:
<Panel Background="#FF5C3A">
</Panel>
AnchoredAnimation.ux:
<Panel Background="#FFC05A">
</Panel>
ClickEvents.ux:
<Panel Background="#FF8EB4">
</Panel>
ScrollingBasics.ux:
<Panel Background="#5AB2FF">
</Panel>
打开MainView.ux:
删除除了App和标签以外的内容:
<App Theme="Basic" ClearColor="#eeeeeeff">
<StatusBarBackground DockPanel.Dock="Top" />
</App>
创建Panel标签作为我们的画布:
<App Theme="Basic" ClearColor="#eeeeeeff">
<StatusBarBackground DockPanel.Dock="Top" />
<Panel>
</Panel>
</App>
在Panel中创建PageControl,并设置它的页面属性ClipToBounds="True",通过Style标签来设置:
<App Theme="Basic" ClearColor="#eeeeeeff">
<StatusBarBackground DockPanel.Dock="Top" />
<Panel>
<PageControl ux:Name="myPages" HitTestMode="LocalBoundsAndChildren">
<Style>
<Page ClipToBounds="True" />
</Style>
</PageContol>
</Panel>
</App>
创建4个空白页:
<App Theme="Basic" ClearColor="#eeeeeeff">
<StatusBarBackground DockPanel.Dock="Top" />
<Panel>
<PageControl ux:Name="myPages" HitTestMode="LocalBoundsAndChildren">
<Style>
<Page ClipToBounds="True" />
</Style>
<Page></Page>
<Page></Page>
<Page></Page>
<Page></Page>
</PageContol>
</Panel>
</App>
设置第一页:
<Page>
<StackPanel Alignment="Top">
<StatusBarBackground />
<Text TextAlignment="Center" TextColor="#fff">staggered animation</Text>
</StackPanel>
<StaggeredAnimation/>
</Page>
设置第二页:
<Page>
<StackPanel Alignment="Top">
<StatusBarBackground />
<Text TextAlignment="Center" TextColor="#fff">anchored animation</Text>
</StackPanel>
<AnchoredAnimation/>
</Page>
设置第三页:
<Page>
<StackPanel Alignment="Top">
<StatusBarBackground />
<Text TextAlignment="Center" TextColor="#fff">event based animation</Text>
<Text TextAlignment="Center" TextColor="#fff" Margin="0,12,0,0">tap and press</Text>
</StackPanel>
<ClickEvents/>
</Page>
设置第四页:
<Page>
<StackPanel Alignment="Top">
<StatusBarBackground />
<Text TextAlignment="Center" TextColor="#fff">basic scrolling</Text>
</StackPanel>
<ScrollingBasics/>
</Page>
最后文件应该会是这样:
MainView.ux保存,运行一下,你的app应该像这样:
app给第一页(在StaggeredAnimation.ux中的Panel标签内)添加一些代码:
<StackPanel Alignment="Center" Orientation="Horizontal">
<Style>
<Rectangle Width="100" Height="100" CornerRadius="5" Margin="10" Fill="White" />
</Style>
<Rectangle ux:Name="rec1"/>
<Rectangle ux:Name="rec2" />
<WhilePressed>
<Rotate Target="rec1" Degrees="90" Duration="0.5" Easing="QuadraticOut" EasingBack="QuadraticIn" />
<Rotate Target="rec2" Degrees="90" Delay="0.5" Duration="0.5" EasingBack="QuadraticIn" Easing="QuadraticOut" />
</WhilePressed>
</StackPanel>
在style标签内设置Rectangle的大小、圆角半径、间距、填充颜色:<Rectangle Width="100" Height="100" CornerRadius="5" Margin="10" Fill="White" />
画出两个矩形,rec1和rec2:
<Rectangle ux:Name="rec1"/>
<Rectangle ux:Name="rec2" />
添加长按点击事件响应:
<WhilePressed>
<Rotate Target="rec1" Degrees="90" Duration="0.5" Easing="QuadraticOut" EasingBack="QuadraticIn" />
<Rotate Target="rec2" Degrees="90" Delay="0.5" Duration="0.5" EasingBack="QuadraticIn" Easing="QuadraticOut" />
</WhilePressed>
当点击任何一个矩形时.两个矩形都会顺时针旋转90度,由于设置了Delay属性,所以rec1先旋转,在0.5的延时后,rec2再旋转,Easing设置的是进入动画的时间曲线,EasingBack设置的是归位动画的时间曲线:
UX动画1在AnchoredAnimation.ux中(同样是在Panel标签内)添加代码:
<Rectangle Alignment="Center" Width="100" Height="100"
CornerRadius="5" TransformOrigin="TopLeft" Fill="#fff">
<WhilePressed>
<Rotate Degrees="90" Duration="1" Easing="BounceOut" EasingBack="BounceIn" EasingBack="BounceIn"/>
</WhilePressed>
</Rectangle>
同样是长按后矩形顺时针旋转90度,但是不一样的是,矩形的旋转中心被设置到了左上角,这样会产生与上一个动画不一样的效果。Easing设置为了BounceOut会使得动画有一个弹回的感觉,效果看起来很不错:
UX动画2在ClickedEvent.ux中(同样是在Panel标签内)添加代码:
<StackPanel Orientation="Horizontal" Alignment="Center">
<Style>
<Rectangle Width="100" Height="100" Margin="10" Fill="White" />
</Style>
<Rectangle CornerRadius="5">
<Tapped>
<Scale Factor="0.8" Duration="0.3" Easing="QuadraticInOut"/>
<Move Y="0.3" Duration="0.3" Easing="QuadraticInOut" RelativeTo="Size"/>
</Tapped>
</Rectangle>
<Rectangle ux:Name="fillRectB" CornerRadius="50">
<WhilePressed>
<Rotate Degrees="180" Duration="0.5" Easing="QuadraticInOut"/>
<Change fillRectB.CornerRadius="5" Duration="0.5" Easing="QuadraticInOut"/>
</WhilePressed>
</Rectangle>
</StackPanel>
注意这里有一个新的事件Tapped,它和WhilePressed的区别是,它是单击后触发。
<Scale Factor="0.8" Duration="0.3" Easing="QuadraticInOut"/>
设置的是在触发事件后把大小降低到原来的0.8倍
<Move Y="0.3" Duration="0.3" Easing="QuadraticInOut" RelativeTo="Size"/>
事件触发后将Y坐标增加目标高度的0.3倍,对于这个矩形来说,就是向下移动30个点(如果将它设置为负值那就是向下移动)。RelativeTo属性设置增加值是用相对于目标的高度的倍数或者是具体的点个数,分别对应"Size"和"Point"。
<Rectangle ux:Name="fillRectB" CornerRadius="50">
第二个矩形设置圆角半径为50,也就是其边长的一半,也就是一个圆形
<Change fillRectB.CornerRadius="5" Duration="0.5" Easing="QuadraticInOut"/>
该动画的结果是将其圆角半径变为5,也就是变回圆角矩形,下面是运行结果:
下面来添加最后一个动画:
在ScrollingBasics.ux文件中,同样是Panel标签内,添加如下代码:
<Panel Width="300" Height="400">
<Rectangle Width="300" Height="400" HitTestMode="None" Margin="0" CornerRadius="5">
<Stroke Width="5" Alignment="Outside" Brush="#FAB2FD" />
</Rectangle>
<ScrollViewer ClipToBounds="true">
<StackPanel ux:Name="stackPanel">
<Style>
<Rectangle Height="75" CornerRadius="5" Margin="0, 5, 0, 5" Width="100%" ux:InheritStyle="false" Fill="White" />
</Style>
<Rectangle />
<Rectangle />
<Rectangle />
<Rectangle />
<Rectangle />
</StackPanel>
</ScrollViewer>
</Panel>
该动画用ScrollViewer实现了一个类似于iOS中tableView的滚动、弹跳效果
<Panel Width="300" Height="300">
限定ScrollViewer的滚动区域
<ScrollViewer ClipToBounds="true">
定义一个ScrollViewer用于承载它内部所定义的多个矩形。由于这几个矩形是按竖直方向排列,很显然要高于ScrollViewer的高度,所以超过的部分会截断,由于是圆角矩形所以上边或下边被截断之后,圆角就会消失:
看起来不太好,所以我们要在限制区域上加一个圆角矩形的框:
<Rectangle Width="300" Height="400" HitTestMode="None" Margin="0" CornerRadius="5">
<Stroke Width="5" Alignment="Outside" Brush="#FAB2FD" />
</Rectangle>
圆角矩形框
就像这样,当然颜色只是为了看得明显,我们要让它的颜色和背景融为一体,所以将Brush值改为#5AB2FF,这样就完成了代码的编写,来看看效果:
UX动画4完整运行一下app:
完整app完整工程文件下载:
百度网盘下载
到此为止,我们完成了对这个新软件的小小的探索,其实我们还没有将Javascript结合到工程中,但是仅仅用UX markup我们就已经实现了很多事情,而且它并不是很难: ]当然我才学习了一天而已(准确的说Fuse在8月21日才发布beta版),这只是我的一点学习分享~
网友评论
不管是设计者还是开发者,希望更多的fuse的使用者一起来交流