4

J'ai imageView. Im en utilisant pan, pincer pour imageView. Parfois j'ai besoin de supprimer imageView. Donc, j'ai utilisé OnLongClickListener pour supprimer l'image. Quand j'utilise long clic sur ma suppression d'imageView. Mais quand j'utilise OnTouchListener pour pan, pince pour imageView OnLongPress activé et mon imageView retiré de la vue. Comment résoudre ceci?OnLongPress augmenter le temps

code:

imageView.setOnLongClickListener(new OnLongClickListener(){ 

    @Override 
    public boolean onLongClick(View v) { 
     // TODO Auto-generated method stub 
            imageView.setVisibility(View.GONE); 

     return true; 
     } 

    }); 



    imageView.setOnTouchListener(new View.OnTouchListener() { 
     final Handler handler = new Handler(); 
    Runnable mLongPressed = new Runnable() { 
     public void run() { 
      Log.i("", "Long press!"); 
     } 
    }; 



    @Override 
     public boolean onTouch(View v,MotionEvent event) { 
     // TODO Auto-generated method stub 

    if(event.getAction() == MotionEvent.ACTION_DOWN) 
     handler.postDelayed(mLongPressed, 1000); 
    if((event.getAction() == MotionEvent.ACTION_MOVE)||(event.getAction() ==  MotionEvent.ACTION_UP)) 
     handler.removeCallbacks(mLongPressed); 



    layoutParams = (RelativeLayout.LayoutParams) imageView.getLayoutParams(); 

     switch(event.getAction()) 
     { 
    case MotionEvent.ACTION_DOWN : 
     { 
      parms = (RelativeLayout.LayoutParams) imageView.getLayoutParams(); 


     dx = event.getRawX() - parms.leftMargin; 
     dy = event.getRawY() - parms.topMargin; 


     } 
    break; 
     case MotionEvent.ACTION_MOVE : 
     { 
     x = event.getRawX(); 
     y = event.getRawY(); 
     parms.leftMargin = (int) (x-dx); 
     parms.topMargin = (int) (y - dy); 
              imageView.setLayoutParams(parms); 

    } 
    break; 
    case MotionEvent.ACTION_UP : 
    { 

     } 
     break; 
    } 
    return false; 
     } 
     }); 

     } 

    }); 
+0

Vous pouvez ajouter un temporisateur lorsque vous cliquez sur Activer le temporisateur et que vous effectuez l'opération comme bon vous semble –

+0

Comment? Pouvez-vous donner du code? – user2474320

Répondre

9

Vous pouvez utiliser un gestionnaire pour ce faire, mais vous devez vous rappeler d'annuler le gestionnaire si l'utilisateur retire son doigt de l'écran. Yogesh n'est pas complètement faux, mais l'approche ci-dessus ajoute simplement un délai de 1000 ms entre onClick et quand le runnable est exécuté. Cela signifie que si l'utilisateur lève le doigt, le runnable fonctionnera toujours. Ce n'est pas un vrai longpress. Ci-dessous vous pouvez voir que j'utilise toujours un gestionnaire avec un délai de 1000 ms (vous pouvez le définir comme vous voulez) mais supprimer le rappel si l'utilisateur lève le doigt ou se déplace. Si vous voulez vous débarrasser du déclencheur, supprimez simplement cette partie de l'appel. Mais pour affecter une pression longue, vous devez tenir compte de l'ascenseur pour vous assurer que l'utilisateur tient son doigt tout le temps.

final Handler handler = new Handler(); 
Runnable mLongPressed = new Runnable() { 
    public void run() { 
     Log.i("", "Long press!"); 
    } 
}; 

@Override 
public boolean onTouchEvent(MotionEvent event, View v){ 
    if(event.getAction() == MotionEvent.ACTION_DOWN) 
     handler.postDelayed(mLongPressed, 1000); 
    if((event.getAction() == MotionEvent.ACTION_MOVE)||(event.getAction() ==  MotionEvent.ACTION_UP)) 
     handler.removeCallbacks(mLongPressed); 
     return false;  
} 
+0

où placer ce code? – user2474320

+0

Vous pouvez l'utiliser dans votre programme d'écoute onTouch. N'utilisez pas l'écouteur standard longpress comme si vous étiez en haut. Vous obtenez déjà motionevent et affichez juste la réponse en conséquence – Rarw

+0

CAn vous vérifiez ma question d'édition? Est-ce correct d'ajouter? – user2474320

4

essayez le code ci-dessous: -

imageView.setOnClickListener(new View.OnClickListener() 
    Handler handle = new Handler(); 
      handle.postDelayed(new Runnable() { 

       @Override 
       public void run() { 
    imageView.setVisibility(View.GONE); 

},1000); 
} 

1000 est le temps que vous pouvez augmenter que vous voulez ..

+0

ok. Je vais essayer .. – user2474320

+0

si vous avez une solution que s'il vous plaît up-voter et accepter comme une solution. –

+0

Mon problème avec cette approche est qu'elle ne prolonge pas vraiment le seuil du longpress mais définit simplement un délai entre le moment où le clic se produit et le moment où le runnable est lancé. Il ajoute juste un délai d'une seconde entre le clic et la course. – Rarw

0

onTouch est toujours appelé à vue depuis cette est l'état initial d'envoi des événements à la vue. Lorsque vous long press votre vue appelle encore onTouchfirst et puisque vous return true en onTouch (ce qui signifie que vous avez consommé cet événement et il ne devrait pas être expédiés plus loin) vous ne serez pas appelé onLongPress. Ce qui fera l'affaire est returning false dans onTouch

0

Je sais une réponse a été choisi il y a un moment, mais pour tous ceux qui cherche une solution pour étendre effectivement la longue période de presse, la solution est d'utiliser une valeur booléenne dans onKeyUp() pour éviter que votre code dans votre runnable de l'exécution. De cette façon, un seul événement KeyUp ne provoquera pas de réinitialisation et ne retardera pas seulement le runnable. J'ai utilisé des keyevents mais cette solution devrait également fonctionner pour les événements tactiles.

private static final int longPressMilli = 3000; 
    boolean allowReset = true; 

Runnable mLongPressed = new Runnable() { 
     @Override 
     public void run() { 
      if(allowReset) { 
       sendResetIntent(); 
       Log.d(TAG, "Trip Reset!"); 
       allowReset = false; 
      } 
     } 

    }; 


@Override 
    public boolean onKeyDown(int keyCode, KeyEvent event) { 
     // TODO Auto-generated method stub 
     //System.out.println("" + keyCode); 
     if(GlobalBooleans.getReverseCamera()) return true; 

      switch (keyCode) { 

       case KeyEvent.KEYCODE_F6: 
        allowReset = true; //reset to true if u need to able to reset multiple times without navigating away from the page 
        pressHandler.postDelayed(mLongPressed, longPressMilli); 

        break; 
       default: 
        break; 
      } 
     // } 
     return true; 
    } 

@Override 
    public boolean onKeyUp(int keyCode, KeyEvent event) { 

     switch (keyCode) { 
      case KeyEvent.KEYCODE_F6: 
       allowReset = false; 
       break; 
     } 


     return super.onKeyUp(keyCode, event); 
    } 
Questions connexes