【问题标题】:Android: HorizontalScrollView smoothScroll animation timeAndroid:Horizo​​ntalScrollView smoothScroll 动画时间
【发布时间】:2011-07-08 19:09:26
【问题描述】:

我有一种情况,我正在使用带有图像的水平滚动视图并使用按钮平滑滚动到不同的图像位置。现在它工作正常我只是想知道是否有人知道减慢平滑滚动方法,即有更长的动画时间?目前,捕捉发生得非常快。

也许通过覆盖平滑滚动,我试图搜索这个/示例但没有运气。

有什么想法吗?

谢谢,

【问题讨论】:

    标签: android horizontalscrollview smooth-scrolling


    【解决方案1】:

    怎么样:

    ObjectAnimator animator=ObjectAnimator.ofInt(yourHorizontalScrollView, "scrollX",targetXScroll );
    animator.setDuration(800);
    animator.start();
    

    【讨论】:

    • 如果添加 animator.setDuration(800),就像一个魅力。
    • 这应该是选择的答案。除了需要 API 11 或更高版本外,它是完美的解决方案。 (在我的库代码中,在 API 11 之前,我已经放弃使用 smoothScrollTo)。
    • @darrenp 您可以使用 NineOldAndroids 向后兼容一直到 1.0 (nineoldandroids.com)
    • 谢谢。使用 animator.setDuration(800),看起来很不错。
    【解决方案2】:

    这是一种方法,对我来说效果很好:

        new CountDownTimer(2000, 20) { 
    
            public void onTick(long millisUntilFinished) { 
                hv.scrollTo((int) (2000 - millisUntilFinished), 0); 
            } 
    
            public void onFinish() { 
    
            } 
         }.start();
    

    所以这里水平滚动视图 (hv) 会在两秒内从位置 0 移动到 2000,如果小于 2000 像素,则移动到视图的末尾。易于调整...

    【讨论】:

    • @Lumis 嘿,感谢您的回复,尽管我认为创建一个新的计时器 obj 以使滚动速度变慢可能有点过分,如果在倒计时期间用户执行另一个操作会发生什么情况,然后它会继续前一个并开始一个新的吗?我想除非设置了一个标志来防止这种情况发生,并且可能在 onFinish 中设置它以允许新的交互......虽然这会被误解为响应缓慢的 UI 吗?
    • 这当然取决于你的活动有什么样的互动,但我认为最好的办法是尝试、试验,看看它是如何执行的。请注意,此对象可能有一个 stop() 方法,我没有尝试过,因此您可以从任何时候停止并重新启动它。你是对的,这是一个矫枉过正的做法,但如果没有更简单的方法可以做到这一点,那么至少这可以正常工作。我在市场上的游戏中使用它。
    • 是的,我之前用 CountDownTimer 做了一些实验(在游戏的另一个方面,需要一个简单的计数器)唯一的问题是这个计时器需要在点重置,这似乎是一个问题倒数计时器,因为我尝试在它上面调用 Cancel,但没有用,设置为 null,它仍然会继续,这很奇怪。无论如何,最终创建了一个单独的线程,所以我对 CountDownTimer obj 失去了信心。
    • 我确实通过使用有人在此处发布的一些代码解决了这个问题(我会链接,但刚刚花了过去 5 分钟搜索并且找不到帖子抱歉),如果我记得我会发布当我回家的时候。它基本上以编程方式计算出滚动到哪里以及使用总视图宽度/视图数量等,并在平滑滚动方法中使用它。
    • 是的,smoothScrollTo(int x, int y),但是有人抱怨太快了,似乎没有调整速度的选项。
    【解决方案3】:

    Horizo​​ntalScrollView 的子类,使用反射来访问Horizo​​ntalScrollView 中的私有字段mScroller。当然,如果底层类更改了字段名称,这将中断,它默认恢复为原始滚动实现。

    调用myScroller.startScroll(scrollX, getScrollY(), dx, 0, 500); 改变滚动速度。

    private OverScroller myScroller;     
    
    private void init()
    {
        try
        {
            Class parent = this.getClass();
            do
            {
                parent = parent.getSuperclass();
            } while (!parent.getName().equals("android.widget.HorizontalScrollView"));
    
            Log.i("Scroller", "class: " + parent.getName());
            Field field = parent.getDeclaredField("mScroller");
            field.setAccessible(true);
            myScroller = (OverScroller) field.get(this);
    
        } catch (NoSuchFieldException e)
        {
            e.printStackTrace();
        } catch (IllegalArgumentException e)
        {
            e.printStackTrace();
        } catch (IllegalAccessException e)
        {
            e.printStackTrace();
        }
    }
    
    public void customSmoothScrollBy(int dx, int dy)
    {
        if (myScroller == null)
        {
            smoothScrollBy(dx, dy);
            return;
        }
    
        if (getChildCount() == 0)
            return;
    
        final int width = getWidth() - getPaddingRight() - getPaddingLeft();
        final int right = getChildAt(0).getWidth();
        final int maxX = Math.max(0, right - width);
        final int scrollX = getScrollX();
        dx = Math.max(0, Math.min(scrollX + dx, maxX)) - scrollX;
    
        myScroller.startScroll(scrollX, getScrollY(), dx, 0, 500);
        invalidate();
    }
    
    public void customSmoothScrollTo(int x, int y)
    {
        customSmoothScrollBy(x - getScrollX(), y - getScrollY());
    }
    

    【讨论】:

    • 也适用于垂直滚动(有一些小的补充)。作为一种保障,一个人可能会编写自己的卷轴吗?另请注意:OverScroller 是 API 9,而不是 Scroller 的子类。
    • @pjco 您可以发布您为垂直滚动所做的更改。我很难让它发挥作用。
    • 当然,看看这里是我的更改:gist.github.com/patrickcousins/5699691 仅更改了customSmoothScrollBy 中的一些值
    【解决方案4】:

    它是一个自动连续滚动的滚动条。它通过连续滚动图像列表来显示信用屏幕。这可能会对您有所帮助或给您一些想法。

    https://github.com/blessenm/SlideshowDemo

    【讨论】:

      【解决方案5】:

      请改用.smoothScrollToPositionFromTop。示例

      listView.smoothScrollToPositionFromTop(scroll.pos(),0,scroll.delay());
      

      wherescroll 是一个简单的变量,来自一个类,它获取当前屏幕位置.get() 返回新位置.pos() 和平滑滚动时间.delay ...等

      【讨论】:

        【解决方案6】:

        或者更简单,.smoothScrollTo()。示例:

        hsv.smoothScrollTo(x, y);
        

        文档:Android Developer ScrollView docs

        【讨论】:

          【解决方案7】:

          看看http://developer.android.com/reference/android/widget/Scroller.html:

          滚动的持续时间可以在构造函数中传递,并指定滚动动画应该花费的最长时间

          【讨论】:

          • Horizo​​ntalScrollView 没有 setScroller 方法,它有自己的一组滚动属性。那么,如何将 Scroller 附加到水平滚动视图?
          • 您是否必须创建自己的并从那里覆盖属性?
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多