我的问题是当我使用滚动条并在其上绘制画布时。它将平滑滚动,但是当我绘制位图+画布时,滚动滚动非常慢意味着滚动很重,这就是为什么它滚动非常慢的方式。
如何解决这个问题?
答案 0 :(得分:2)
我没有使用OpenGL
或加速度计的经验,但是滑动(在Android的API中称为fling)并不难实现。制作此类自定义视图时首先需要实现的是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()
开始在其内部投掷滚动的“模拟”,通过观察它,您可以使用连续重绘动画来复制其平滑度:
@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());
}
}
也就是说,在动画运行之前,计算我们到达的点并滚动到那里。
作为最后一点:请记住在OnGestureListener.onDown()
中返回true,即使您不想做任何事情,也不会有效。
请注意,因为Android 2.2中的Scroller
有一个错误,即使它达到你作为参数传递的限制,投掷动画也不会真正结束(但是计算出的偏移会尊重它们,所以它不会实际上是移动)。