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;
}
});
La vue enfant dispose donc d'OnTouchListener et la vue parent a une implémentation personnalisée de onInterceptTouchEvent? –
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. –
J'ai fourni ma réponse. Vérifiez SVP. C'est assez simple, mais je pense que cela fonctionne –