次のようなコードを使用して、Androidに単純なスクロール可能なギャラリータイプのビューを実装しました。
private int mPos; // The current scroll position.
private int mLastMostionPos; // Previous touch position.
@Override
public boolean onTouchEvent(MotionEvent ev)
{
final int action = ev.getAction();
Log.d(TAG, "Mouse mLastMotionPos: " + mLastMotionPos + " ev.getX(): " + ev.getX() + " mPos: " + mPos + " ev.getPointerId(0): " + ev.getPointerId(0)
+ " ev.getEventTime(): " + ev.getEventTime());
switch (action & MotionEvent.ACTION_MASK)
{
case MotionEvent.ACTION_DOWN:
// Remember where the motion event started
mLastMotionPos = (int)ev.getX();
break;
case MotionEvent.ACTION_MOVE:
final int pos = (int)ev.getX(activePointerIndex);
// Scroll to follow the motion event
int delta = mLastMotionPos - pos;
mLastMotionPos = pos;
mPos += delta;
if (mPos < mMinPos)
mPos = mMinPos;
if (mPos > mMaxPos)
mPos = mMaxPos;
break;
そしてそれは動作しますが、時々それが突然少し「ジャンプ」することに気づきました。これは、一方の端までスクロールしているときにのみ実際に目立ちます。すでに右端までスクロールしていて、指を常に右に動かすと、1フレーム左にジャンプすることがあります。
上記のログ行を追加して、この出力を取得しました(読みやすくするために編集):
50.913: Mouse mLastMotionPos: 304 ev.getX(): 379.0 mPos: 0 ev.getPointerId(0): 0 ev.getEventTime(): 111690077
50.928: Mouse mLastMotionPos: 379 ev.getX(): 369.0 mPos: 0 ev.getPointerId(0): 0 ev.getEventTime(): 111690093
50.943: Mouse mLastMotionPos: 369 ev.getX(): 384.0 mPos: 10 ev.getPointerId(0): 0 ev.getEventTime(): 111690109
50.958: Mouse mLastMotionPos: 384 ev.getX(): 391.0 mPos: 0 ev.getPointerId(0): 0 ev.getEventTime(): 111690125
50.983: Mouse mLastMotionPos: 391 ev.getX(): 399.0 mPos: 0 ev.getPointerId(0): 0 ev.getEventTime(): 111690141
51.023: Mouse mLastMotionPos: 399 ev.getX(): 399.0 mPos: 0 ev.getPointerId(0): 0 ev.getEventTime(): 111690186
10ピクセルジャンプすることに注意してください!私は指を右にドラッグするだけで、それについてかなり慎重に考えていたことを誓います。最初は、Androidがイベントを順不同で配信しているのではないかと思っていましたが、イベント時間は単調です。
なぜこれが起こっているのか考えていますか?私はそれがサムスンのせいである可能性があると思います(私はギャラクシーS2を持っています)。ドライバーが課すタッチしきい値が遅れているため、入力ドライバーを作成した人は、ドライバーが何をしているのかをはっきりと知りませんでした。それでも、10ピクセルは大きなジャンプのようです。そして時にはそれはさらに大きくなります!