0

onFling イベントをリッスンするためにジェスチャ検出器を既に使用しているビューにボタンがある場合、長押しイベントをリッスンするようにボタンを設定するにはどうすればよいですか?

参考までにコードを追加しました。アクティビティに複数のリスナーを実装する方法を説明してください。また、単一のビューに対して複数のリスナーを実装できますか? 1 つは長押しリスナーで、もう 1 つはオンフリング リスナーです。

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    this.requestWindowFeature(Window.FEATURE_NO_TITLE);
    setContentView(R.layout.knowledge);

    summary =(TextView)findViewById(R.id.textSummary);
    buckview = (View) findViewById(R.id.bucketView);
    ball = (View)findViewById(R.id.meatBall);
    gestureDetector = new GestureDetector(new MyGestureDetector());
    View mainview = (View) findViewById(R.id.mainView);

    /*
    //Set touch release listener for bucket view
    mainview.setOnTouchListener(new View.OnTouchListener() {

        @Override
        public boolean onTouch(View v, MotionEvent event) {
            // TODO Auto-generated method stub
            if (event.getAction() == MotionEvent.ACTION_UP)
            {
                buckview.setVisibility(RelativeLayout.GONE);
            }
            return false;
        }
    });
    */


    // Set the touch listener for the main view to be our custom gesture listener
    mainview.setOnTouchListener(new View.OnTouchListener() {
        public boolean onTouch(View v, MotionEvent event) {
            if (gestureDetector.onTouchEvent(event)) {
                return true;
            }
            return false;
        }

    });
    ball.setOnLongClickListener(new View.OnLongClickListener() {

        @Override
        public boolean onLongClick(View v) {
            // TODO Auto-generated method stub
            buckview.setVisibility(ImageView.VISIBLE);
            return false;
        }
    });
    ball.setOnTouchListener(new View.OnTouchListener() {

        @Override
        public boolean onTouch(View v, MotionEvent event) {
            // TODO Auto-generated method stub
            if(event.getAction()==MotionEvent.ACTION_UP)
            {
                buckview.setVisibility(ImageView.GONE);
                return false;
            }
            else
            return true;
        }
    });
}

class MyGestureDetector extends SimpleOnGestureListener {

    public void onShowPress(MotionEvent event){

    }
    @Override
    public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
    Intent intent = new Intent(Knowledge.this.getBaseContext(), Knowledge.class);

        /* If only horizontal allowed
        if (Math.abs(e1.getY() - e2.getY()) > SWIPE_MAX_OFF_PATH) {
            return false;
        }
        */
        // right to left swipe
        if(e1.getX() - e2.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) {
        startActivity(intent);
        Knowledge.this.overridePendingTransition(
        R.anim.slide_in_right,
        R.anim.slide_out_left
        ); 
        return false;// left to right swipe
        }  else if (e2.getX() - e1.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) {
        startActivity(intent);
        Knowledge.this.overridePendingTransition(
        R.anim.slide_in_left, 
        R.anim.slide_out_right
        );
        return false;// top to bottom swipe
        } else if(e1.getY() - e2.getY() > SWIPE_MIN_DISTANCE && Math.abs(velocityY) > SWIPE_THRESHOLD_VELOCITY) {
        startActivity(intent);
        Knowledge.this.overridePendingTransition(
        R.anim.slide_in_top,
        R.anim.slide_out_bottom
        ); 
        return false;// bottom to top swipe
        }  else if (e2.getY() - e1.getY() > SWIPE_MIN_DISTANCE && Math.abs(velocityY) > SWIPE_THRESHOLD_VELOCITY) {
        startActivity(intent);
        Knowledge.this.overridePendingTransition(
        R.anim.slide_in_bottom, 
        R.anim.slide_out_top
        );
        return false;
        }else
        return true;
    }

    // It is necessary to return true from onDown for the onFling event to register
    @Override
    public boolean onDown(MotionEvent event) {
            return true;
    }


}


}
4

1 に答える 1

0

試してみてください

button.setOnLongClickListener(new OnLongClickListener() {

    public boolean onLongClick(View arg0) {
        // TODO Auto-generated method stub
        return false;
    }
})

trueから戻るまで完全に機能しますonLongClicktureここから戻った場合はsetOnLongClickListener、呼び出されるだけです。に属するfalseすべての sを返すと、これが呼び出されます。あなたの場合、作成したかどうかに関係なく、両方の s が呼び出されます。ListenerbuttonListensersetOnLongClickListenersetOnTouchListener

これがお役に立てば幸いです。

于 2013-06-05T12:19:07.363 に答える