Android: как узнать, прокручивается ли представление

в iPhone это было бы просто — у каждого представления есть метод scrollViewDidScroll. Я пытаюсь найти эквивалент в Android.

Мой код работает, но он не дает мне того, что я хочу. Мне нужно выполнять код на протяжении всей прокрутки представления. Итак, несмотря на то, что я использую метод onScroll OnGestureListener, он срабатывает только тогда, когда палец находится на экране (на самом деле он не правильно назван — его следует называть «onSlide» или «onSwipe», фокусируясь на жесте, а не на анимации пользовательского интерфейса. ). Он не продолжает срабатывать, если пользователь щелкает представление, и оно все еще прокручивается в течение нескольких секунд после того, как пользователь поднимает палец.

есть ли метод, который вызывается на каждом шаге прокрутки?

public class Scroll extends Activity implements OnGestureListener {

public  WebView         webview;

public  GestureDetector gestureScanner;

public  int         currentYPosition;
public  int         lastYPosition;

public void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);

    webview = new WebView(this);
    setContentView(webview);
    webview.loadUrl("file:///android_asset/Scroll.html");

    gestureScanner = new GestureDetector(this);

    currentYPosition = 0;
    lastYPosition = 0;

}


public boolean onTouchEvent(final MotionEvent me) {
    return gestureScanner.onTouchEvent(me);
}


public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
    // I do stuff here.
    return true;
}

person Dave    schedule 19.03.2010    source источник


Ответы (3)


Я немного поиграл с WebView и не нашел способа отслеживать прокрутку, но вам определенно нужно, чтобы это был WebView? Если вы используете ListView или GridView, вы можете реализовать методы ListView.OnScrollListener, особенно onScrollStateChanged и onScroll. Первый особенно полезен, поскольку он дает вам обновленную информацию о том, что делает список, даже для вашего конкретного примера, когда пользователь «выбрасывает» список, и он продолжает прокручиваться в течение некоторого времени после этого. Пример того, как вы будете это отслеживать:

public class List13 extends ListActivity implements ListView.OnScrollListener {

(...)

    public void onScrollStateChanged(AbsListView view, int scrollState) {
        switch (scrollState) {
        case OnScrollListener.SCROLL_STATE_IDLE:
            //List is idle
            break;
        case OnScrollListener.SCROLL_STATE_TOUCH_SCROLL:
            //List is scrolling under the direct touch of the user
            break;
        case OnScrollListener.SCROLL_STATE_FLING:
            //The user did a 'fling' on the list and it's still scrolling
            break;
        }
    }
}

Я взял это прямо из примеров кода, которые предоставляет Google, например List13 в проекте «Api Demos». Если вы хотите поближе взглянуть на это, импортируйте его в Eclipse, выбрав «Файл» -> «Создать» -> «Проект Android», «Создать проект из существующего источника» и перейдите к (ваша папка SDK)/platforms/(версия, которую вы используете). работа с)/samples/ApiDemos. Если вы не можете его найти, возможно, вы не загрузили примеры приложений при настройке SDK. Вы можете сделать это в Eclipse, перейдя в «Окно» -> «Android SDK и AVD Manager», а затем в разделе «Доступные пакеты» слева.

person Steve Haley    schedule 20.03.2010
comment
Спасибо .... эти WebViews, кажется, действуют совершенно иначе, чем любое другое представление Android. Это второй вопрос, который я задал на этом форуме, в результате чего: это имело бы смысл, но WebView кажется недокументированным исключением из обычных соглашений Android. Очень расстраивает. Остерегайтесь веб-просмотров! - person Dave; 09.04.2010

Я думаю, вы могли бы захотеть сделать это с представлением, а не с действием. Представление имеет метод с именем onScrollChanged, который звучит как то, что вам нужно. Если это не так, вы также можете изучить методы computeScroll, scrollBy и scrollTo того же класса.

person Daniel    schedule 20.03.2010

Попробуйте следующий метод

@Override
    protected void onScrollChanged(int l, int t, int oldl, int oldt) {
}

это даст вам последнюю позицию прокрутки и новую позицию прокрутки после прокрутки.

person Brijesh Masrani    schedule 07.10.2010