Android - Как я могу получить scrollView для автоматической прокрутки с определенной скоростью? - PullRequest
1 голос
/ 02 октября 2010

Я пишу приложение телесуфлера для Android и пытаюсь заставить скрипт автоматически прокручиваться с определенной скоростью. Я попытался сделать это, расширив Scrollview и написав новую функцию SmoothScrollBy. Вот мой код.

Пользовательский ScrollView:

import android.content.Context;
import android.util.AttributeSet;
import android.util.Log;
import android.view.ViewConfiguration;
import android.view.animation.AnimationUtils;
import android.widget.ScrollView;
import android.widget.Scroller;

public class myScrollView extends ScrollView {
static final int ANIMATED_SCROLL_GAP = 250;
private long mLastScroll;
static final float MAX_SCROLL_FACTOR = 0.5f;
private Scroller mScroller;


public myScrollView(Context context) {
    super(context);
    initScrollView();
}
public myScrollView(Context context, AttributeSet attrs){
    super(context,attrs);
    initScrollView();
}
public myScrollView(Context context, AttributeSet attrs, int defStyle){
    super(context,attrs, defStyle);
    initScrollView();

}

private void initScrollView(){

    mScroller = new Scroller(getContext());
    setFocusable(true);
    setDescendantFocusability(FOCUS_AFTER_DESCENDANTS);
    setWillNotDraw(false);
}


public final void smoothScrollBy(int dx, int dy, int dur) {
    if (getChildCount() == 0) {
        // Nothing to do.
        return;
    }
    long duration = AnimationUtils.currentAnimationTimeMillis() - mLastScroll;
    if (duration > ANIMATED_SCROLL_GAP) {
        final int height = getHeight() - getPaddingBottom() - getPaddingTop();
        final int bottom = getChildAt(0).getHeight();
        final int maxY = Math.max(0, bottom - height);
        final int scrollY = getScrollY();
        dy = Math.max(0, Math.min(scrollY + dy, maxY)) - scrollY;

        Log.d("scroll dy", "from" +  Integer.toString(getScrollY()) + "to" + Integer.toString(dy));
        mScroller.startScroll(getScrollX(), getScrollY(), 0, dy, dur);
        invalidate();
    } else {
        if (!mScroller.isFinished()) {
            mScroller.abortAnimation();
        }
        Log.d("scroller", "fallback");
        scrollBy(dx, dy);
    }
    mLastScroll = AnimationUtils.currentAnimationTimeMillis();
}


}

Функция вызова:

    ((myScrollView)findViewById(R.id.ScrollView01)).setOnTouchListener(new OnTouchListener() {

        @Override
        public boolean onTouch(View v, MotionEvent event) {
            long delta = event.getEventTime() - event.getDownTime(); 
            if(event.getAction() == MotionEvent.ACTION_UP && delta < 200){
                ((myScrollView)v).smoothScrollBy(0, v.getHeight(), 30000);
            }
            return false;
        }
    });

Я что-то не так делаю? Когда я делаю одно нажатие. Ничего не происходит.

Спасибо.

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