【问题标题】:How would one build a realistic application using Famo.us?如何使用 Famo.us 构建一个真实的应用程序?
【发布时间】:2014-07-25 21:27:59
【问题描述】:

我对 Famo.us 所呈现的“这是零件,现在去做点什么”的方式没有意见,但如果我能就如何设置我的项目、结构、模块等

为什么没有实际网页的演示,而不是单屏 iPhone 视图(甚至可能类似于 Famo.us 大学)?

是否可以在小尺寸 DOM 元素(如 Web 组件)中使用 Famo.us?在现有的 HTML 结构中?

据我了解,可以将您想要的任何内容放入可渲染对象中,但是如何适应多种屏幕尺寸?我是否应该开始以不同的“断点大小”(sm-surface md-surface lg-surface)构建我自己的曲面库并根据视口大小创建包含脚本?

【问题讨论】:

  • 通过回程机看看 Famo.us。在最长的时间里,该站点只需要一个登录屏幕来访问该站点。现在网站的公共部分好多了,但是它的很多链接教程还没有制作出来。如果我是你,我会选择一种不同的技术,一种已经公开存在更长时间的技术,或者一种具有更多课程的技术,或者一种至少有更多演示示例的技术。 web.archive.org/web/20140601000000*/famo.us
  • 我并不是说文档很糟糕,我认为它们实际上非常好。我只是对如何从中小型应用程序的角度实现 Famo.us 感到困惑。
  • Famo.us 最近才公开。对于他们如何处理事情的反馈可能会非常受欢迎。也许您应该向他们发送您的反馈,而不是疯狂地提出一个非常基于意见的 SO 问题。

标签: famo.us


【解决方案1】:

在撰写本文时,我很惊讶您的问题为 -2,因为我认为这是一个非常有效的问题。 famo.us 网站上的幻灯片项目和 Timbre 项目是好的开始。尽管他们的网站有时对我来说仍然很不稳定,但有时无法正确呈现,但滚动部分会被最小化到足以一次读取一两行的大小。因此,您可能无法查看这些内容。有一段时间我也做不到。

John Traver,顺便说一下,如果你在这里寻求帮助,他会很有帮助,他有一个帖子 https://medium.com/@john_traver/prodigy-technology-ab94cf0bba7f,在他的项目中使用了 famo.us 之后,他给出了一些启示。关于“仅在需要使用 Famo.us 的地方使用 Famo.us”的部分让生活更轻松。

不过,他的帖子不会回答你所有的问题。从我前面提到的两个项目(位于 famo.us 网站)中,最重要的一点就是如何使用视图。对我来说,我的大部分页面都是视图,如果它们具有相似的结构,我可以通过一些自定义选项使它们适用于多个页面。然后我的主页有我调用的函数来显示视图。

            var makeSnapRenderController = function(widthIn, widthOut, heightIn, heightOut, durationIn, durationOut) {
                if (!durationIn) {
                    durationIn = 300;
                }
                if (!durationOut) {
                    durationOut = 300;
                }
                var renderer = new RenderController({
                    inTransition: {curve: Easing.inOutQuart, duration: durationIn},
                    outTransition: {curve: Easing.inOutQuart, duration: durationOut},
                    overlap: true,
                });
                renderer.inTransformFrom(function(progress) {
                    return Transform.translate(widthIn * (1.0 - progress), heightIn * (1.0 - progress), 1); // 10
                });

                renderer.outTransformFrom(function(progress) {
                    return Transform.translate(widthOut * progress - widthOut, heightOut * progress - heightOut, 1-progress); // -10
                });
                // No opacity change
                renderer.inOpacityFrom(function(progress) { return 1.5 * progress; });
                renderer.outOpacityFrom(function(progress) { return 1.5 * progress; });

                return renderer;
            };

我用它来创建我的渲染控制器。它让我可以为每个视图添加我想要的动画样式。这不是全部,但它是一个快速的工具。然后在创建 renderController 之后,我有多个调用不同视图的函数。以下是我当前项目的滑出菜单,除了登录屏幕外,它随处可见。它在登录通过身份验证后被调用。

            var showMenu = function() {
                var SlideOutMenuView = require('Views/SlideOutMenuView');
                var slideOutMenuView = new SlideOutMenuView();
                menuRenderer.show(slideOutMenuView);

                slideOutMenuView.on('usage', function(){
                    console.log('usage was clicked');
                    showStatisticsPage();
                    slideOutMenuView.close();
                });
                slideOutMenuView.on('profiles', function(){
                    console.log('profiles was clicked');
                    showProfilesPage();
                    slideOutMenuView.close();
                });
                slideOutMenuView.on('component', function(){
                    console.log('component was clicked');
                    showComponentDataPage();
                    slideOutMenuView.close();
                });

            };

要更改页面,菜单具有按钮以及在单击输出时发出发射事件的表面:slideMenu._eventOutput.emit('usage');如您所见,我在函数中观察它并调用另一个函数来显示该页面。

这给出了一般结构的概念,或者至少我希望如此。如果不问,我可以展示更多示例。对于尺码,我会这样做:

                var remove = new Surface({
                    size: [_width * 0.24, _height * 0.049],
                    content: 'Remove',
                    properties: {
                        fontSize: Math.round(_height * 0.03) + 'px',
                    },
                    classes:['remove','btn'],
                });
                this.mainNode.add(new StateModifier({
                    transform: Transform.translate(_width * 0.74, _height * 0.144, 2)
                })).add(remove);

_width 和 _height 是 window.innerWidth 和 window.innerHeight。你必须小心它并不总是有效,但在我现在正在进行的 android 项目上,以及我测试过的手机,以及我的最后一个 iphone 项目,它运行良好。我只是设置屏幕大小的百分比。只要它保持单元格大小,它就是一个很好的解决方案。对于需要多种设备类型的项目,我使用内容和类或其他任何不影响大小和布局的东西来创建表面。然后有几个函数保存 .add、transform、set size 函数,每个函数用于不同的目标设备检查它使用的比率或类型,然后调用适当的函数。

我不知道我是否已经回答了你的问题,但希望你过得更好。 Famo.us 是一个了不起的工具,我真的认为它会改变我们做事的方式。它还没有,但我不认为这不是一个理由让膝盖深陷其中并获得乐趣和一点头发拉扯的挫败感。

另外,这不一定是最好的方式,它只是我正在做的方式。这些板上的人比我聪明得多,所以如果有更好的方法,请不要给他负面的问题并解释一下。

编辑: 我工作的公司有我和另外两个开发人员使用 famo.us 开发应用程序/网站,并开始编写一些代码 sn-ps 来解决我们遇到的一些问题:https://github.com/vizidrix/famous

【讨论】:

  • 我觉得这可能是一个主观问题,但我觉得有很多人想知道同样的问题。是的,我看到 John 在 SO 上留下了有用的答案——不过我还没有阅读他的文章,所以感谢你的文章以及你在手机上的代码示例和测试报告——这真的很有帮助!
  • 我正在使用MyView.DEFAULT_OPTIONS = _getOptions() 方法返回一个基于屏幕宽度(window.innerWidth > 1024) 的选项对象,这很一般,但现在可以使用,因为我想为移动设备提供不同的体验.也许让 config.js 返回一个 user agent check 并将模块传递给每个视图也可以。
猜你喜欢
  • 2014-02-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-06
  • 1970-01-01
相关资源
最近更新 更多