【问题标题】:Famo.us ScrollView scroll like in a chatFamo.us ScrollView 像聊天一样滚动
【发布时间】:2014-05-19 06:18:01
【问题描述】:

我有 ScrollView 和其中的 Surface 元素序列。 我希望能够在最新元素出现在数组中时立即滚动到它。

这是一个演示,我希望它可以像在任何聊天应用程序中一样滚动...旧表面超出了场景,新表面将始终位于底部。问题和这里一样:Famo.us how to make a scrollview be filled from bottom to top (or right to left)?

http://jsfiddle.net/LA49a/

Famous.loaded(function () {
    var Engine = Famous.Core.Engine;
    var Surface = Famous.Core.Surface;
    var Scrollview = Famous.Views.Scrollview;
    var Timer = Famous.Utilities.Timer;

    var mainContext = Engine.createContext();

    var scrollview = new Scrollview();
    var surfaces = [];
    var i = 0;

    scrollview.sequenceFrom(surfaces);

    Timer.setInterval(function () {
        var temp = new Surface({
            content: "Surface: " + (i + 1),
            size: [undefined, 50],
            properties: {
                backgroundColor: "hsl(" + (i * 360 / 40) + ", 100%, 50%)",
                lineHeight: "50px",
                textAlign: "center"
            }
        });

        temp.pipe(scrollview);
        surfaces.push(temp);
        i++;
        // scrollview.goToNextPage();
    }, 400);

    mainContext.add(scrollview);
});

【问题讨论】:

    标签: javascript scroll scrollview famo.us


    【解决方案1】:

    通过将对齐属性设置为 1,这在著名的 flex ScrollView 中得到支持。

    查看此演示: https://github.com/IjzerenHein/famous-flex-chat

    【讨论】:

      【解决方案2】:

      我假设您输入了一个非常大的整数来让滚动视图移动到最后,这会显示您的“最新”元素。

      如果您有相同宽度的表面(假设滚动视图的 X 方向),您可能会通过检查实际需要移动的像素数来获得更平滑的结果,以便将最后一个项目定位在右边缘滚动视图。您拥有运行 sequenceFrom() 的原始数组。将其中的项目数乘以表面宽度并减去滚动视图宽度的像素(可以设置为“未定义”,在这种情况下,您需要查看窗口的宽度)以调整以获取最新元素到滚动视图的右侧而不是左侧。

      如果您的表面大小不同,您可以在将它们添加到支持数组时更改一些内容以跟踪每个表面的 x 偏移量,只需向表面添加一个属性即可。然后你可以问表面它的偏移量是多少,然后减去滚动视图的宽度。

      希望能帮助你更接近。

      【讨论】:

      • 嘿!谢谢您的回复!是的,我正在使用scrollView.setPosition(20000)。问题是如何在将表面放置到序列时计算表面的偏移量,它尚未渲染。据我了解,在获得表面偏移后,我需要执行以下操作:scrollView.setPosition(surface.offset - scrollview.height),对吗? :)
      • 从你的问题来看,我担心可能没有好的答案。但也许更多信息会有所帮助。当您创建每个表面时,您为“大小”数组选项设置了什么?
      【解决方案3】:

      已解决,通过将 ScrollView 旋转 180˚ 并将其中的所有表面也旋转 180˚ http://jsfiddle.net/tamtamchik/LA49a/3/

      Famous.loaded(function () {
          var Engine = Famous.Core.Engine;
          var Surface = Famous.Core.Surface;
          var Scrollview = Famous.Views.Scrollview;
          var Timer = Famous.Utilities.Timer;
          var Transform = Famous.Core.Transform;
          var StateModifier = Famous.Modifiers.StateModifier;
          var ContainerSurface = Famous.Surfaces.ContainerSurface;
      
          var mainContext = Engine.createContext();
      
          var scrollview = new Scrollview();
          var surfaces = [];
          var i = 0;
          var surfaceHeight = 50;
      
          scrollview.sequenceFrom(surfaces);
      
          Timer.setInterval(function () {
              var container = new ContainerSurface({
                  size: [undefined, surfaceHeight]
              });
      
              var temp = new Surface({
                  content: "Surface: " + (i + 1),
                  size: [undefined, surfaceHeight],
                  properties: {
                      backgroundColor: "hsl(" + (i * 360 / 40) + ", 100%, 50%)",
                      lineHeight: "50px",
                      textAlign: "center"
                  }
              });
      
              var surfaceRotate = new StateModifier({
                  transform: Transform.rotateZ(Math.PI)
              });
      
              var surfacePush = new StateModifier({
                  transform: Transform.translate(window.innerWidth, surfaceHeight)
              });
      
              container.add(surfacePush).add(surfaceRotate).add(temp);
              container.pipe(scrollview);
              temp.pipe(scrollview);
              surfaces.unshift(container);
              i++;
          }, 400);
      
          var rotate = new StateModifier({
              transform: Transform.rotateZ(Math.PI)
          });
      
          var push = new StateModifier({
              transform: Transform.translate(window.innerWidth, window.innerHeight)
          });
      
          mainContext.add(push).add(rotate).add(scrollview);
      });
      

      【讨论】:

        【解决方案4】:

        嗯,这很狡猾!如果您在这些节点中有很多文本内容,它的几个额外矩阵可能会变得非常慢......

        我认为,通过使用一个巨大的数字,这只是为了迫使 famo.us 滚动到视图的末尾?

        如果渲染发生了,你也可以:

        pos = getPosition(nodeNum)  // for last elements scrollposition
        setPosition(pos)
        

        但如果插入发生在与您的移动控件相同的代码块中,则它尚未呈现。

        这里提供了一个复杂的解决方法,使用事件在部署/渲染发生后触发大小计算: how can we get the size of a surface within famo.us?

        这里还有另一个技巧,可以从无与伦比的 @johntraver 中重新计算出著名的尺寸 how to make famo.us recalculate sizes?

        您是否还查看了 Engine.nextTick() 或 JQuery.deferred ? 似乎在您插入内容后立即会有一个“未呈现”的瞬间,但在更新后您可以得到尺寸确定。

        【讨论】:

        • setPosition 以糟糕的规律工作。如果您一次在屏幕上做的足够多,它可能会被剪切并且只能滚动部分距离。有一个带有滑块类型滚动视图的应用程序只需要几分钟就可以在缓慢的时刻抓住它,而且它不会完全成功。
        猜你喜欢
        • 2018-10-13
        • 1970-01-01
        • 2015-03-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-01-17
        相关资源
        最近更新 更多