質問

画面のブロックでFling Motionを検出したいです。そのために次のコードを使用しています。

public class MyinfoActivity extends Activity implements OnGestureListener {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        ..........
        ..........
        gestureScanner = new GestureDetector(this);
        resBlock = (TableRow) findViewById(R.id.ResBlock);
        gestureScanner = new GestureDetector(this);
    }

    @Override
    public boolean onTouchEvent(MotionEvent me){
        Log.d(null,"Touch");
        if (gestureScanner.onTouchEvent(me))
            return gestureScanner.onTouchEvent(me);
        else
            return false;
    }

    @Override
    public boolean onFling(MotionEvent e1, MotionEvent e2,
                       float velocityX, float velocityY) {
        Log.d(null,"Fling");
        ............
        ............
    }

    @Override
    public boolean onDown(MotionEvent arg0) {
        return false;
    }

    @Override
    public void onLongPress(MotionEvent e) {}

    @Override
    public boolean onScroll(MotionEvent e1, MotionEvent e2,
                        float distanceX, float distanceY) {
        return false;
    }

    @Override
    public void onShowPress(MotionEvent e) {}

    @Override
    public boolean onSingleTapUp(MotionEvent e) {
        return false;
    }
}

TouchEventを検出していますが、飛び出しの動きは検出されません。私のコードの問題は何ですか?

役に立ちましたか?

解決

次のコードを使用して、問題を解決しました。

public class MyinfoActivity extends Activity {
    private GestureDetector gestureScanner;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.myinfotrackerinner);
        gestureScanner = new GestureDetector(this,simpleOnGestureListener);
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        return gestureScanner.onTouchEvent(event);
    }

    GestureDetector.SimpleOnGestureListener simpleOnGestureListener =
                       new GestureDetector.SimpleOnGestureListener() {
        @Override
        public boolean onDown(MotionEvent event) {
            return true;
        }

        @Override
        public boolean onFling(MotionEvent event1, MotionEvent event2,
                                   float velocityX, float velocityY) {
            Log.d(null,"Fling");
            int dx = (int) (event2.getX() - event1.getX());
            // don't accept the fling if it's too short
            // as it may conflict with a button push
            if (Math.abs(dx) > MAJOR_MOVE 
                       && Math.abs(velocityX) > Math.abs(velocityY)) {
                if (velocityX > 0) {
                    moveGraph("L");
                } else {
                    moveGraph("R");
                }
                return true;
            } else {
                return false;
            }
        }
    };
}

他のヒント

まず、OntouchEventメソッドが正しくなく、GesturesCannerオブジェクトによって2つのOntoucheventのコールを引き起こします。あなたはこれによって変更する必要があります:

    @Override
    public boolean onTouchEvent(MotionEvent me){
         Log.d(null,"Touch");
         if (gestureScanner.onTouchEvent(me))
             return true;
         else
             return super.onTouchEvent(event); // or false (it's what you whant).
    }

また、この行を2回持っています:

gestureScanner = new GestureDetector(this);

次に、次のようなオンフリング方法を変更してみてください。

@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,float velocityY) {
    try{
        if(Math.abs(e1.getY()-e2.getY()) > 250) 
            return false;               
        if(e1.getX() - e2.getX() > 120 && Math.abs(velocityX) > 200){
            Log.d("Fling", "Move Next");
            //do something...
        }
        else if(e2.getX() - e1.getX() > 120 && Math.abs(velocityX) > 200){
            Log.d("Fling", "Move Previous");
            //do something...
        }
        return false;
    }
    catch(Exception e){
        return false;
    }
}

戻る true あなたの中で onDown 方法

@Override
public boolean onDown(MotionEvent arg0) {
    return true;
}
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top