在我的Android OpenGL E.S. 2.0应用程序,我正在实现一个平滑的屏幕拖动功能。 问题是,平滑的运动并不像我想象的那样平滑。
以下是一些代码:
public class SoftMoveInfo {
private volatile float mAccumulatedDX = 0.0f;
private volatile float mAccumulatedDY = 0.0f;
private final float mSlowDownMult = 0.1f;
// called by main / input thread
public void addDragDelta(float dx, float dy) {
mAccumulatedDX += dx;
mAccumulatedDY += dy;
}
// called by rendering thread
public void integrate() {
// adjust movement
final float moveSubX = mAccumulatedDX*mSlowDownMult;
final float moveSubY = mAccumulatedDY*mSlowDownMult;
mAccumulatedDX -= moveSubX;
mAccumulatedDY -= moveSubY;
mViewX += moveSubX;
mViewY += moveSubY;
}
}
mViewX
和mViewY
将是目标屏幕“偏移”值,在该值处将渲染场景。
方法integrate()
由渲染线程调用,并基本上推进一个移动步骤。
方法addDragDelta()
将由呈现线程调用,它提供如下所示的值:
private float mLastTouchX;
private float mLastTouchY;
private mSoftDragInfo = new SoftMoveInfo();
public boolean onTouchEvent(MotionEvent e) {
final int actionMasked = e.getAction() & MotionEvent.ACTION_MASK;
switch (actionMasked) {
...
case MotionEvent.ACTION_MOVE:
float x = e.getX();
float y = e.getY();
mSoftDragInfo.addDragDelta(x-mLastTouchX, y-mLastTouchY);
mLastTouchX = x;
mLastTouchY = y;
break;
...
}
}
现在输出真的是“紧张”。这是我在方法mAccumulatedDX
中记录integrate()
时制作的excel图表:
如您所见,图表中存在小幅峰值。我想避开它们。
我已经尝试将所有读取和写入事件放入synchronized()
块中,但这似乎没有帮助。
我怀疑尖峰是由于这样的事实,即输入线程不提供与渲染线程读取数据的频率相同的信息。
什么是适当的技术来获得平稳运动?我想过一个低通滤波器,但我愿意接受更好的想法。