2012-01-13 2 views
0

Я хочу реализовать глобальный виджет NavigationBar в android, расширяет FrameLayout, чтобы он мог просто объявить в макете xml, а не включать в каждое действие.Невозможно обнаружить жест в FrameLayout в Android

Панели навигации состоит из трех компонентов: логотип, название, кнопка Когда прикосновение или броситься вниз на NavgationBar (не включая кнопки), я покажу something.But теперь мой onFling жест неможет быть обнаружен (OnFling в SwipeGestureListener было испытал), любой может мне помочь.

Класс Панель навигации:

public class NavigationBarWidget extends FrameLayout implements View.OnClickListener 

private SwipeGestureListener mSwipeListener = new SwipeGestureListener(); 
private GestureDetector mGestureDetector; 

NavigationBarWidget():

mGestureDetector = new GestureDetector(mSwipeListener); 
this.setOnTouchListener(new View.OnTouchListener() { 

     @Override 
     public boolean onTouch(View v, MotionEvent event) { 
      Log.v("Nav", "onTouch"); 

      return mGestureDetector.onTouchEvent(event); 
     } 
    }); 

OnClick():

@Override 
public void onClick(View paramView) 
{ 
    if(paramView.getId()== mShareIcon.getId()){ 
     AlertDialog.Builder builder = new AlertDialog.Builder(this.getContext()); 
     builder.setMessage("Are you sure you want to exit?") 
     .setCancelable(false) 
     .setPositiveButton("Yes", new DialogInterface.OnClickListener() { 
      @Override 
      public void onClick(DialogInterface dialog, int id) { 
      } 
     }) 
     .setNegativeButton("No", new DialogInterface.OnClickListener() { 
      @Override 
      public void onClick(DialogInterface dialog, int id) { 
       dialog.cancel(); 
      } 
     }); 
     AlertDialog alert = builder.create(); 
     alert.show(); 
    }else{ 
     Log.v("Nav", "onClick"); 
    } 

} 

onFling() в SwipeGestureListener:

@Override 
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { 
    Log.v("Nav", "onFling"); 
    try { 
     if (Math.abs(e1.getX() - e2.getX()) > SWIPE_MAX_OFF_PATH) 
     { 
      return false; 
     } 
     else 
     { 
      if ((e2.getY() - e1.getY() > SWIPE_MIN_DISTANCE) && (Math.abs(velocityY) > SWIPE_THRESHOLD_VELOCITY)) { 
       this.mCallbackListener.onFlingDown(); 
       return true; 
      } 
     } 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
    return false; 
} 

Logcat: при касании или перемещении навигационной панели выводится «onTouch», но жест onFling не обнаружен.

ответ

0

Я решил это сам, прочитав сообщение в блоге разработчика для Android: Making Sense of Multitouch.

Решение Выпущено GestureDetector обрабатывать этот жест, вы можете справиться с сенсорным событие, то, как это:

mGestureDetector = new GestureDetector(mSwipeListener); 

    this.setOnTouchListener(new View.OnTouchListener() { 
     @Override 
     public boolean onTouch(View v, MotionEvent event) { 
      Log.v("Nav", "onTouch"); 

      mGestureDetector.onTouchEvent(event); 
      final int action = event.getAction(); 

      switch (action) { 
       case MotionEvent.ACTION_DOWN:{ 
        Log.v("Nav", "onDown"); 
        break; 
       } 
       case MotionEvent.ACTION_UP:{ 
        Log.v("Nav", "onUp"); 
        break; 
       } 
      } 

      return true; 
     } 
    }); 

Когда я Fling вниз по NavigationBarWidget бревно будет: onTouch-> onDown-> onTouch (сколько onTouch до того, как долго вы продолжаете нажимать на экран) -> onFlingDown-> onUp