【问题标题】:Multiple listeners in AndroidAndroid 中的多个监听器
【发布时间】:2013-06-05 12:14:10
【问题描述】:

如何设置按钮以侦听长按事件,其中按钮位于已使用手势检测器侦听 onFling 事件的视图上?

我已添加代码以供参考。请解释我如何在一个活动中实现多个侦听器。另外,可以为单个视图实现多个侦听器吗?其中一个是长按监听器,另一个是浮动监听器

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


}


}

【问题讨论】:

  • 按钮应该仍然可以正常工作..告诉我们你尝试了什么..和你的结果..
  • 我尝试使用 2 个不同的侦听器。主视图的手势检测器和按钮的 onlogclicklistener。然而,这并没有成功。
  • 在设计 xml 时。使用框架布局并将按钮放在单独的视图中

标签: java android eclipse event-listener


【解决方案1】:

试试吧

button.setOnLongClickListener(new OnLongClickListener() {

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

在您从 onLongClick 返回 true 之前,它将完美运行。如果你从这里返回ture,那么setOnLongClickListener 只会被调用。如果你返回false,所有属于这个Listenerbutton都会被调用。在您的情况下,Listensers 都将被调用,无论您创建的是 setOnLongClickListener 还是 setOnTouchListener

希望对你有所帮助。

【讨论】:

  • return true 和 return false 语句究竟是做什么的?如果事件已被当前侦听器消费,是否返回 false?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-27
  • 2011-10-07
  • 2016-05-29
  • 2011-03-31
  • 2015-10-30
相关资源
最近更新 更多