1

我有一个自定义 ListView,它“逐页”显示项目。所以我已经编写了 OnTouch 方法并且它运行良好,现在我想编写 OnFling 方法来实现我的 ListView 的平滑和惯性滚动。

问题是 smoothScrollToPosition(int position) 的滚动动画不流畅,速度非常快。smoothScrollToPosition(int position, int offset, int duration) 有效,但我的 minSdk 必须为 8,除此之外,尽管存在偏移量,但此函数仍严重放置当前元素。

这是我的 OnFling 方法的代码:

@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) 
{
        if(null == getAdapter()) return false;

        boolean returnValue = false;
        float pty1 = 0, pty2 = 0;

        if (e1 == null || e2 == null)
            return false;

        pty1 = e1.getY();
        pty2 = e2.getY();

        if (pty1 - pty2 > swipeMinDistance && Math.abs(velocityY) > swipeThresholdVelocity) 
        {
            float currentVelocity = Math.min(Math.abs(velocityY), Math.abs(swipeMaxVelocity));

            final int shift = (int) ((currentVelocity / swipeMaxVelocity) * swipeMaxElements + 1);

            if (activeItem < getAdapter().getCount() - shift - 1)
                activeItem = activeItem + shift;
            else
            {
                activeItem = getAdapter().getCount() - 1;
                return false;
            }

            returnValue = true;
        } 
        else if (pty2 - pty1 > swipeMinDistance && Math.abs(velocityY) > swipeThresholdVelocity) 
        {
            float currentVelocity = Math.min(Math.abs(velocityY), Math.abs(swipeMaxVelocity));

            final int shift = (int) ((currentVelocity / swipeMaxVelocity) * swipeMaxElements + 1);

            if (activeItem >= shift)
                activeItem = activeItem - shift;
            else
            {
                activeItem = 0;
                return false;
            }

            returnValue = true;
        }
        smoothScrollToPosition(activeItem);
        return returnValue;
    }

xml内容为:

<?xml version="1.0" encoding="utf-8"?>
 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  android:id="@+id/rl_main"
  android:layout_width="match_parent"
  android:layout_height="match_parent">

 <konteh.example.errortest.CardsListView
     android:id="@+id/cardsListView"
     android:layout_width="wrap_content"
     android:layout_height="wrap_content"
     android:layout_alignParentLeft="true"
     android:layout_alignParentTop="true"
     android:smoothScrollbar="true" 
     />
4

1 回答 1

0

解决了!我的解决方案是:

    int pixelCount = height * shift * (isForward ? 1 : -1); // calculate approximately shift in pixels
    smoothScrollBy(pixelCount, 2 * DURATION * shift);//this smooth scroll works!
    postDelayed(new Runnable() 
    {
        public void run() 
        {
            smoothScrollBy(0, 0); // Stops the listview from overshooting.
            smoothScrollToPosition(activeItem + 1);
        }
    }, 
    DURATION * shift);

也许这不是最好的解决方案,但它有效!

于 2014-04-22T07:38:06.113 回答