原型\UX 设计软件Fuse的安装及其初探

Fuse

什么是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.png

Cmd+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,也就是变回圆角矩形,下面是运行结果:

UX动画3

下面来添加最后一个动画:
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版),这只是我的一点学习分享~

如果本篇文章对你有帮助,请点一下左下角的喜欢,大家的支持是我继续写作的动力!

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

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,988评论 25 707
  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 12,084评论 4 62
  • 在iOS中随处都可以看到绚丽的动画效果,实现这些动画的过程并不复杂,今天将带大家一窥ios动画全貌。在这里你可以看...
    每天刷两次牙阅读 8,481评论 6 30
  • 最近遇到了密钥保存的问题:由于本人有热爱折腾操作系统的习惯,所以我的笔记本一般不超过两个月就要重装系统。重装系统前...
    Nitroethane阅读 12,368评论 3 15
  • 儿子一天的节目实在太多了 老公在外地出差时:妈妈你给我生个小妹妹陪我玩吧!我:等爸爸回来商量一下 妈妈别等了 快生...
    尹敏熙xixi阅读 275评论 0 2