在我的 Android OpenGL ES 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
这是我在该方法期间通过记录制作的 excel 图表integrate()
:
如您所见,整个图中都有小尖峰。我想避开他们。我已经尝试将所有读写事件放入一个synchronized()
块中,但这似乎没有帮助。我怀疑峰值是由于输入线程提供的信息与渲染线程读取数据的频率不同。
什么可能是适当的技术来获得平稳的运动?我想过一个低通滤波器,但我愿意接受更好的想法。