1

次のようなコードを使用して、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ピクセルは大きなジャンプのようです。そして時にはそれはさらに大きくなります!

4

4 に答える 4

2

少し後で、実際の MotionEvent の位置ではなく Delay のみに関心がある場合は、getRawX() および getRawY() メソッドを使用できます。私はまったく同じ問題を抱えていたので、座標と出来上がりを取得する方法を変更しました!!! それは働いていた。

于 2015-02-16T16:32:31.247 に答える
0

この背後にある正確なロジックはわかりませんが、同じ問題に直面していました

この問題は「ハードウェア」に関連するものではありません。3つの異なるデバイス(1つはsony、他の2つはsamsung)でテストしたためですが、どこでも同じ結果が得られました。エミュレーターでも同じように動作します...

「縦スワイプ」の場合に直面していました。数ピクセルスワイプしていましたが、150ピクセル(またはそれ以上)の大きな違いがありました。

私はこの奇妙なジャンプにほとんどうんざりしていました

しかし、「デモアプリケーション」で同じコードをコピーして試してみると、そこは魅力のように機能しました。

解決 :-

ScrollViewXMLレイアウト(スワイプの親レイアウトであり、問​​題の背後にある唯一の理由である可能性があります)から置き換えたところ、その後すべてが並べ替えられました...

ScrollViewあなたの場合も犯人だといいのですが。

ところで、コードにスワイプを実装するための参照としてこれを使用しています。

于 2013-03-06T10:22:41.340 に答える
-1

おそらくハードウェア関連?より強力なデバイスを試しましたか?

于 2012-10-16T11:05:09.037 に答える