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