У меня нет опыта работы с OpenGL
или акселерометром, но прокрутки (называемые fling в API Android) достичь нелегко. Первое, что вам нужно, когда делает такой пользовательский вид, реализует 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.fling()
начать «моделирование» в 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 имеет ошибку, для которой анимация сбрасывания фактически не заканчивается, даже если она достигает пределов, которые вы передавали в качестве аргументов (однако вычисленное смещение уважает их, поэтому оно фактически не будет перемещаться) ,
К сожалению, на ваш вопрос ответил неэтичный пользователь. Я бы посоветовал вам проверить этот вопрос: http://stackoverflow.com/questions/4951142/smooth-scrolling-in-android – Will