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