2013-06-05 2 views
0

Как настроить кнопку для прослушивания длинного события, когда кнопка находится в режиме просмотра, который уже использует детектор жестов для прослушивания события onFling?Несколько прослушивателей в Android

Я добавил код для справки. Пожалуйста, объясните, как я могу реализовать несколько слушателей в действии. Кроме того, можно использовать несколько прослушивателей для одного представления? Одним из которых является длительным нажатием слушателем, а другой является 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; 
    } 


} 


} 
+0

кнопка должна работать отлично .. Расскажите, что вы пробовали .. и ваш результат .. – amalBit

+0

Я пробовал использовать 2 разных слушателя. Детектор жестов для основного вида и кнопка onlogclicklistener для кнопки. Однако это не сработало. –

+0

Пока вы разрабатываете xml. Используйте макет рамки и поместите кнопку в отдельном виде. – amalBit

ответ

0

Просто попробуйте

button.setOnLongClickListener(new OnLongClickListener() { 

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

Он будет работать отлично до тех пор пока вы вернетесь true из onLongClick. Если вы вернетесь ture отсюда, то setOnLongClickListener только вызывается. Если вы вернетесь false, все Listener s относятся к этому button. В вашем случае вы получите Listenser s, независимо от того, сделали ли вы setOnLongClickListener или setOnTouchListener.

Надеюсь, это поможет вам.

+0

Что именно возвращает true и возвращает ложные утверждения? Вы возвращаете false, если событие было потреблено текущим слушателем? –

+0

@ user2450275 Проверьте обновленный ответ. – Gunaseelan

+0

Спасибо. Это помогло. –

Смежные вопросы