幕布斯7119047
我没有OpenGL和加速度计的经验,但是滑动(在Android API中称为fling)并不难实现。进行这样的自定义时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 }});@Overridepublic boolean onTouchEvent(MotionEvent event) { return mGD.onTouchEvent(event);}虽然OnGestureListener.onScroll()直接调用View.scrollBy(),对于onFling()方法你需要一个Scroller。Scroller正如参考文献所述,它是一个简单的对象,它封装了滚动。它可用于连续滚动或对弹起做出反应。Scroller.fling()开始对其内部滚动进行“模拟”,通过观看它,您可以使用连续重绘动画来复制其平滑度:@Overrideprotected 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(),即使你不想下来做任何事情,否则将无法正常工作。请注意,因为ScrollerAndroid 2.2中存在一个bug,即使到达达到您作为参数传递的限制时,fling动画也不会真正结束(但计算的偏移量尊重它们,因此它实际上不会移动)。