Подтвердить что ты не робот

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

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

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

4b9b3361

Ответ 1

У меня нет опыта работы с OpenGL или акселерометром, но прокручивать (называемый fling в Android API) не сложно. Первое, что вам нужно при создании такого пользовательского 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 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 имеет ошибку, для которой анимация fling фактически не заканчивается, даже если она достигает пределов, которые вы передавали в качестве аргументов (однако вычисленное смещение их уважает, поэтому оно фактически не будет перемещаться).