2016-02-29 2 views
2

J'ai une vue parent qui devrait suivre finger on touch et une vue enfant à l'intérieur qui est cliquable. J'ai donc utilisé onInterceptTouchEvent pour décider si je dois consommer l'événement tactile sur le parent ou l'enfant en comparant la distance tactile avant ACTION_UP.Perte de paramètres ACTION_DOWN lorsque InterceptTouchEvent

évidemment j'ai utilisé "retrun false" sur ACTION_DOWN dans onInterceptTouchEvent (parce qu'il est trop tôt pour propager l'événement avant les calculs) Donc, malheureusement, l'onTouch perd ACTION_DOWN.

La question est de savoir comment puis-je initialiser les paramètres (ainsi que la position initiale de la vue parent) de onTouch (pas de onInterceptTouchEvent)? Note: Pour une raison je dois écrire onTouch en ligne avec d'autres codes où j'ai implémenté onInterceptTouchEvent dans la définition de l'objet.

une partie de la définition de l'objet:

boolean mmIsBeingDragged; 
float mLastX; 
float mStartX; 
int mTouchSlop=ViewConfiguration.get(getContext()).getScaledTouchSlop(); 

@Override 
public boolean onInterceptTouchEvent(MotionEvent event) { 

    switch (event.getAction()) { 
     case MotionEvent.ACTION_DOWN: 
      mLastX = event.getX(); 
      mStartX = mLastX; 
      break; 

     case MotionEvent.ACTION_MOVE: 
      float x = event.getX(); 
      float y = event.getY(); 
      float xDelta = Math.abs(x - mLastX); 

      float xDeltaTotal = x - mStartX; 
      if (Math.abs(xDeltaTotal) > mTouchSlop) { 
       mmIsBeingDragged = true; 
       mStartX = x; 
       return true; 
      } 
      break; 

     case MotionEvent.ACTION_CANCEL: 

     case MotionEvent.ACTION_UP: 
      mmIsBeingDragged = false; 
      break; 
    } 
    return false; 
} 

et c'est OnTouch qui est définie en dehors de l'objet (en ligne avec le programme)

myview.setOnTouchListener(new OnTouchListener() 
    { 
     float curX=0; 
     float oldX; 
     float startX; 
     float delta=0; 
     float togo; 
     boolean mIsBeingDragged=false; 
     int mTouchSlop=ViewConfiguration.get(getActivity()).getScaledTouchSlop(); 

     @Override 
     public boolean onTouch(final View v, MotionEvent event) 
     { 
      switch (event.getAction()) { 
      case MotionEvent.ACTION_DOWN: 
      //Here is the prblem! How to initialize startX? 

      case MotionEvent.ACTION_MOVE: 

       curX = event.getRawX(); 
       delta=curX-startX; 
       togo=oldX+delta; 

       if (Math.abs(delta) > mTouchSlop) { 
        mIsBeingDragged=true; 
        followfingerFunction(v,togo) 
        return true; 
       } 
       break; 

       case MotionEvent.ACTION_UP: 
        if (!mIsBeingDragged){v.performClick();} 
       break; 
     } 
      return true; 
    } 
    }); 
+0

La vue enfant dispose donc d'OnTouchListener et la vue parent a une implémentation personnalisée de onInterceptTouchEvent? –

+0

Non. Les deux définitions se trouvent sur l'objet parent. OnInterceptTouchEvent est défini dans la définition de l'objet parent et OnTouchListener est ajouté à l'objet parent en ligne avec d'autres codes après le gonflage. –

+0

J'ai fourni ma réponse. Vérifiez SVP. C'est assez simple, mais je pense que cela fonctionne –

Répondre

0

Juste exposer votre mStartX à votre activité. (Je sais que ce n'est pas parfait mais ça a l'air OK).

class ParentView extends ViewGroup (or some other viewGroup) { 
    int startX; 
    public int getStartX(){ 
     return startX; 
    } 
} 

// Après cela, appelez getStartX() depuis votre activité.

+0

Vraiment simple et c'est parfait! Merci –