Android: отскок Listview к просмотру прокрутки - PullRequest
13 голосов
/ 26 августа 2011

Есть ли способ добавить эффект отказов ListView к обычному просмотру прокрутки?Под отскоком я подразумеваю эффект резинки, когда вы попадаете в конец списка.

Ответы [ 5 ]

18 голосов
/ 15 ноября 2012

Добавить эффект отказов к списку в Android

Шаг 1 : Создать новый файл BounceListView в пакете com.base.view

public class BounceListView extends ListView
{
    private static final int MAX_Y_OVERSCROLL_DISTANCE = 200;

    private Context mContext;
    private int mMaxYOverscrollDistance;

    public BounceListView(Context context) 
    {
        super(context);
        mContext = context;
        initBounceListView();
    }

    public BounceListView(Context context, AttributeSet attrs) 
    {
        super(context, attrs);
        mContext = context;
        initBounceListView();
    }

    public BounceListView(Context context, AttributeSet attrs, int defStyle) 
    {
        super(context, attrs, defStyle);
        mContext = context;
        initBounceListView();
    }

    private void initBounceListView()
    {
        //get the density of the screen and do some maths with it on the max overscroll distance
        //variable so that you get similar behaviors no matter what the screen size

        final DisplayMetrics metrics = mContext.getResources().getDisplayMetrics();
            final float density = metrics.density;

        mMaxYOverscrollDistance = (int) (density * MAX_Y_OVERSCROLL_DISTANCE);
    }

    @Override
    protected boolean overScrollBy(int deltaX, int deltaY, int scrollX, int scrollY, int scrollRangeX, int scrollRangeY, int maxOverScrollX, int maxOverScrollY, boolean isTouchEvent) 
    { 
        //This is where the magic happens, we have replaced the incoming maxOverScrollY with our own custom variable mMaxYOverscrollDistance; 
        return super.overScrollBy(deltaX, deltaY, scrollX, scrollY, scrollRangeX, scrollRangeY, maxOverScrollX, mMaxYOverscrollDistance, isTouchEvent);  
    }

}

Шаг 2: В вашем макете, пожалуйста, измените

<ListView 
   android:id="@+id/list"
   android:layout_width="fill_parent"
   android:layout_height="wrap_content"
/>

на

<com.base.view.BounceListView 
   android:id="@+id/list"
   android:layout_width="fill_parent"
   android:layout_height="wrap_content"
/>
11 голосов
/ 26 августа 2011

Судя по всему, в ScrollView API вы сможете переопределить метод onOverScrolled(), если создадите пользовательское представление, расширяющее класс ScrollView. После быстрого поиска в Google я наткнулся на эту ссылку , и похоже, что это то, что вы пытаетесь сделать ... Я верю, что этот метод был добавлен в Android 2.3.1, хотя вы ограничено устройствами, на которых это работает.

5 голосов
/ 02 октября 2013

Я нашел лучшую реализацию BounceListView (по лицензии LGPL). Вот оно: https://github.com/Larphoid/android-Overscroll-ListView

2 голосов
/ 26 августа 2011

Возможно, у вас настроенное устройство Samsung. Вы должны знать, что эффект отскока не является поведением ОС Android по умолчанию, это то, что было введено Samsung (и оно плохо реализовано, они должны были заставить ScrollView вести себя так же). Поддержка избыточной прокрутки была введена в Android 2.3, и поведение по умолчанию не подпрыгивает, вместо этого это свечение света с интенсивностью, прямо пропорциональной скорости прокрутки / «силе». И это работает везде (просмотры списков, просмотры прокрутки, веб-просмотры и т. Д.).

В заключение, вы не должны беспокоиться об этом. Нет простого аргумента, который вы можете передать на ScrollView, чтобы сделать так, чтобы он перебирался. И все трудности с расширением класса ScrollView не стоят того, ИМО. Просто положитесь на поведение по умолчанию.

Если Samsung хочет связываться со своими пользователями и предоставлять им непоследовательный интерфейс, пусть будет так.

0 голосов
/ 12 августа 2015

Для тех, кто хочет реализовать эффект отскока на ListView.

Howto

, один из способов добавить этот эффект - использовать addHeaderView и addFooterView в ListView,и их отступы (topPadding для вида заголовка и bottomPadding для вида нижнего колонтитула) в первый раз устанавливаются на 0, затем мы переопределяем onTouchEvent и изменяем отступ в соответствии с расстоянием перемещения.

Реализация

Пример кода

Заметки

Идея заимствована из android-pulltorefresh , поскольку эффект отскокапроще, чем pull-to-refresh, поэтому код тоже короче.^ _ ^

Надеюсь, это кому-нибудь поможет ..

...