Плавная прокрутка в Android - PullRequest
       33

Плавная прокрутка в Android

32 голосов
/ 10 февраля 2011

На рынке есть приложение под названием «Плавающие изображения». Это приложение имеет одну из самых плавных прокрутки логики. По сути, в приложении есть пустой холст, покрывающий весь экран, а затем поверх пустого холста отображаются некоторые изображения. Пользователь может провести, и приложение перемещает изображение в направлении пролистывания. Плюс это делает кинетическую прокрутку тоже. Плюс к этому нет полос прокрутки, поэтому кажется, что разработчик создал собственное представление, реализующее всю логику плавной прокрутки.

было бы замечательно, если бы я мог получить его источник ... но у любого есть псевдокод или логика о том, как реализовать такую ​​функцию. Любые ссылки, ссылки на сайты будут полезны.

Ответы [ 2 ]

64 голосов
/ 10 февраля 2011

У меня нет опыта работы ни с OpenGL, ни с акселерометром, но смахивание (называемое fling в API Android) не представляет особой сложности. Первое, что вам нужно при создании такого пользовательского View, это реализация GestureDetector и вызов его onTouchEvent() в вашем представлении onTouchEvent()

GestureDetector mGD = new GestureDetector(getContext(),
                                        new SimpleOnGestureListener() {

    @Override
    public boolean onScroll(MotionEvent e1, MotionEvent e2,
                                float distanceX, float distanceY) {
        // beware, it can scroll to infinity
        scrollBy((int)distanceX, (int)distanceY);
        return true;
    }

    @Override
    public boolean onFling(MotionEvent e1, MotionEvent e2, float vX, float vY) {
        mScroller.fling(getScrollX(), getScrollY(),
                -(int)vX, -(int)vY, 0, (int)mMaxScrollX, 0, (int)mMaxScrollY);
        invalidate(); // don't remember if it's needed
        return true;
    }

    @Override
    public boolean onDown(MotionEvent e) {
        if(!mScroller.isFinished() ) { // is flinging
            mScroller.forceFinished(true); // to stop flinging on touch
        }
        return true; // else won't work
    }
});

@Override
public boolean onTouchEvent(MotionEvent event) {
    return mGD.onTouchEvent(event);
}

Хотя OnGestureListener.onScroll() вызывает напрямую View.scrollBy(), для метода onFling() вам понадобится Scroller.

Scroller - это простой объект, который, как говорится в ссылке, инкапсулирует прокрутку. Его можно использовать для непрерывной прокрутки или для реагирования на броски. Scroller.fling () начинает «симуляцию» прокрутки броска внутри себя, и, наблюдая за ней, вы можете скопировать ее плавность с непрерывной анимацией перерисовки:

@Override
protected void onDraw(Canvas canvas) {
    // ....your drawings....

    // scrollTo invalidates, so until animation won't finish it will be called
    // (used after a Scroller.fling() )
    if(mScroller.computeScrollOffset()) {
        scrollTo(mScroller.getCurrX(), mScroller.getCurrY());
    }
}

то есть, пока анимация не запустится, вычислите точку, которую мы достигли, и прокрутите ее там.

В качестве последнего примечания: не забудьте вернуть true в вашем OnGestureListener.onDown(), даже если вы не хотите ничего делать, или это не сработает.

И будьте осторожны, потому что Scroller в Android 2.2 имеет ошибку, из-за которой анимация броска фактически не заканчивается, даже если она достигает пределов, которые вы передали в качестве аргументов (хотя вычисленное смещение учитывает их, поэтому оно фактически не перемещается ).

8 голосов
/ 21 февраля 2011

Приложение Floating Images - проект с открытым исходным кодом. http://code.google.com/p/floatingimage/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...