简体   繁体   English

Android中的多个侦听器

[英]Multiple listeners in Android

How do I set a button to listen for a long press event, where the button is on a view which is already using gesture detector to listen to onFling event? 如何将按钮设置为侦听长按事件,而该按钮位于已使用手势检测器侦听onFling事件的视图上?

I have added the code for reference. 我添加了代码以供参考。 Please explain how I can implement multiple listeners in an activity. 请说明如何在一个活动中实现多个侦听器。 Also, can multiple listeners be implemented for a single view? 另外,可以为单个视图实现多个侦听器吗? One of which is a long press listener while the other is a onfling listener 其中一个是长按监听器,而另一个是启动监听器

@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;
    }


}


}

Simply try 只需尝试

button.setOnLongClickListener(new OnLongClickListener() {

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

It will work perfectly untill you return true from onLongClick . 直到您从onLongClick返回true ,它才能正常工作。 If you return ture from here then setOnLongClickListener only get invoked. 如果从此处返回ture ,则只会调用setOnLongClickListener If you return false all Listener s belong to this button will get invoked. 如果返回false则将调用此button所属的所有Listener In your case both Listenser s will get invoked whether you made setOnLongClickListener or setOnTouchListener . 在你的情况下,两个Listenser旨意被调用您是否进行setOnLongClickListenersetOnTouchListener

I hope this will help you. 我希望这能帮到您。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM