ontouchevent - How to make double tap and panning work at same time, in Android? -


so i'm trying view working many different ways, there should be:

  • multitouch zooming
  • touchlistener panning
  • doubleclick restoring zoom
  • or if it's restored zoom place double click was.

at moment, else working when doubleclick , keep second click down , continue moving code working way first restores/zooms , panning starts.

so because of zoomscale, first change size of canvas , start panning. should enable panning after double click noticed? or check if double click's last click keeps moving , skip zoom/restore thing? code looks atm. , trying return false after doubleclick doesnt effect... there setting ignoremultitouch true, on double click or panning?

@override public boolean ontouchevent(motionevent ev) {     if(mgesturedetector.ontouchevent(ev)){         montoucheventworkingarray[0] = ev.getx();         montoucheventworkingarray[1] = ev.gety();          montoucheventworkingarray = scaledpointstoscreenpoints(montoucheventworkingarray);          ev.setlocation(montoucheventworkingarray[0], montoucheventworkingarray[1]);         mscaledetector.ontouchevent(ev);          final int action = ev.getaction();         switch (action & motionevent.action_mask) {             case motionevent.action_down: {                 final float x = ev.getx();                 final float y = ev.gety();                  mlasttouchx = x;                 mlasttouchy = y;                  // save id of pointer                 mactivepointerid = ev.getpointerid(0);                 break;             }              case motionevent.action_move: {                 // find index of active pointer , fetch position                 final int pointerindex = ev.findpointerindex(mactivepointerid);                 final float x = ev.getx(pointerindex);                 final float y = ev.gety(pointerindex);                  final float dx = x - mlasttouchx;                 final float dy = y - mlasttouchy;                   mposx += dx;                 mposy += dy;                 mtranslatematrix.pretranslate(dx, dy);                 mtranslatematrix.invert(mtranslatematrixinverse);                  mlasttouchx = x;                 mlasttouchy = y;                 normal = false;                  invalidate();                 break;             }              case motionevent.action_up: {                 mactivepointerid = invalid_pointer_id;                 break;             }              case motionevent.action_cancel: {                 mactivepointerid = invalid_pointer_id;                 break;             }              case motionevent.action_pointer_up: {                 // extract index of pointer left touch sensor                 final int pointerindex = (action & motionevent.action_pointer_index_mask) >> motionevent.action_pointer_index_shift;                 final int pointerid = ev.getpointerid(pointerindex);                 if (pointerid == mactivepointerid) {                     // our active pointer going up. choose new                     // active pointer , adjust accordingly.                     final int newpointerindex = pointerindex == 0 ? 1 : 0;                     mlasttouchx = ev.getx(newpointerindex);                     mlasttouchy = ev.gety(newpointerindex);                     mactivepointerid = ev.getpointerid(newpointerindex);                 }                 break;              }         }     }     return true;  }  private class scalelistener extends scalegesturedetector.simpleonscalegesturelistener {      @override     public boolean onscale(scalegesturedetector detector) {         mscalefactor *= detector.getscalefactor();         if (detector.isinprogress()) {             mfocusx = detector.getfocusx();             mfocusy = detector.getfocusy();         }         mscalefactor = math.max(0.75f, math.min(mscalefactor, 3.0f));         mscalematrix.setscale(mscalefactor, mscalefactor,                 mfocusx, mfocusy);         mscalematrix.invert(mscalematrixinverse);         invalidate();         requestlayout();          return true;     } }  private class gesturelistener extends gesturedetector.simpleongesturelistener {      @override     public boolean ondown(motionevent e) {         return true;     }      // event when double tap occurs     @override     public boolean ondoubletap(motionevent e) {         if (!normal) {             restore();         } else {             zoomtospot(e);         }         return false;     }       @override     public boolean ondoubletapevent(motionevent e) {         return true;     } } 

so made code working these little things, first added doubleclicked boolean

public boolean ondoubletap(motionevent e) {         if (!normal) {             restore();         } else {             zoomtospot(e);         }         doubleclicked = true;         return true;     } 

then made 2 different ontouchevents , set first working if doubleclicked false. second 1 set doubleclicked false when there no fingers left on screen.

public boolean ontouchevent(motionevent ev) {      final int action = ev.getaction();      if (!doubleclicked) {         switch (action & motionevent.action_mask) {             case motionevent.action_down: {                 //something...         }     } else {         switch (action & motionevent.action_mask) {             case motionevent.action_up: {                 doubleclicked = false;                 break;             }          }      } 

Comments