2012-12-13 7 views
10

Sto cercando di implementare una galleria di immagini utilizzando ViewPager. Inoltre, per implementare la funzione di zoom, sto usando TouchImageView da github. Ho anche provato a utilizzare ZoomableImageView.ViewPager e ImageView problema di zoom

Ma, il problema è, se ingrandire l'immagine & se ho scorrere l'immagine, allora invece di immagine, ViewPager sta ottenendo scorrere & prossima vista ViewPager viene sempre caricato.

Se ingrandire l'immagine poi se mi scorrere che, quindi l'immagine deve muoversi invece di ViewPager

prossimo punto di vista di ViewPager deve caricare solo se raggiungere la fine del l'immagine ingrandita. Come farlo?

Non riesco a trovarlo. Se tocco & trascina l'immagine in diagonale, solo allora l'immagine viene spostata. oppure viene richiamato il trascinamento di ViewPager.

ps: questo non è un duplicato. Lo zoom è finito. Ma il problema è dopo lo zoom dell'immagine.

risposta

21

Sì, anche io ho avuto lo stesso problema non con TouchImageView.

Anche il problema risolto è stato disattivato ViewPager quando la vista è stata messa a fuoco.

public class EnableDisableViewPager extends ViewPager { 

    private boolean enabled = true; 

    public EnableDisableViewPager(Context context, AttributeSet attrs) { 
     super(context, attrs); 
    } 

    @Override 
    public boolean onInterceptTouchEvent(MotionEvent arg0) { 
     if(enabled) 
      return super.onInterceptTouchEvent(arg0); 

     return false; 
    } 

    public boolean isEnabled() { 
     return enabled; 
    } 

    public void setEnabled(boolean enabled) { 
     this.enabled = enabled; 
    } 
} 

così in TouchImageView implementare l'ascoltatore per attivare un evento sia il suo zoom o trascinamento.

set listener per l'oggetto vista nell'attività. Quindi, quando si verificano questi eventi, basta disabilitare la vista Pager.

Nota: è necessario anche un evento mouse per abilitare il viewpager.

CURA

Questo funziona solo per Zoom, quindi per ViewPager a strisciare pagine si dovrebbe zoom indietro originale.

aggiungere questi codice al TouchImageView

public class TouchImageView extends ImageView { 

     ... 
    private TouchEventListener touchEventListener; 

     private void sharedConstructing(Context context) { 
      ... 

      setOnTouchListener(new OnTouchListener() { 

       @Override 
       public boolean onTouch(View v, MotionEvent event) { 
        ... 
         case MotionEvent.ACTION_UP: 
          ... 
          if(touchEventListener != null) 
          { 
           if(saveScale == 1.0) 
            touchEventListener.onZoomToOriginal(); 
           else 
            touchEventListener.onZoom(); 
          } 
          break; 

         ... 
        } 
        ... 
       } 

      }); 
     } 

     ... 

public TouchEventListener getTouchEventListener() { 
     return touchEventListener; 
    } 

    public void setTouchEventListener(TouchEventListener touchEventListener) { 
     this.touchEventListener = touchEventListener; 
    } 


     public interface TouchEventListener 
     { 
      void onZoom(); 
      void onZoomToOriginal(); 
     } 
    } 

soluzione migliore

Potremmo raggiungere questo obiettivo senza estendere ViewPager ad una nuova classe utilizzando il metodo indicato di seguito.

requestDisallowInterceptTouchEvent(true); 

E con questo abbiamo potuto scorrere senza zoomare alla posizione originale come vediamo in Galleria e molte altre app.

public class TouchImageView extends ImageView { 

     ... 
private void stopInterceptEvent() 
{ 
    getParent().requestDisallowInterceptTouchEvent(true); 
} 

private void startInterceptEvent() 
{ 
    getParent().requestDisallowInterceptTouchEvent(false); 
} 

private void sharedConstructing(Context context) { 
    super.setClickable(true); 
    this.context = context; 
    mScaleDetector = new ScaleGestureDetector(context, new ScaleListener()); 
    matrix.setTranslate(1f, 1f); 
    m = new float[9]; 
    setImageMatrix(matrix); 
    setScaleType(ScaleType.MATRIX); 

    setOnTouchListener(new OnTouchListener() { 

     @Override 
     public boolean onTouch(View v, MotionEvent event) { 
      mScaleDetector.onTouchEvent(event); 

      matrix.getValues(m); 
      float x = m[Matrix.MTRANS_X]; 
      float y = m[Matrix.MTRANS_Y]; 
      PointF curr = new PointF(event.getX(), event.getY()); 

      switch (event.getAction()) { 
       case MotionEvent.ACTION_DOWN: 
        last.set(event.getX(), event.getY()); 
        start.set(last); 
        mode = DRAG; 
        stopInterceptEvent(); 
        break; 
       case MotionEvent.ACTION_MOVE: 
        if (mode == DRAG) { 
         float deltaX = curr.x - last.x; 
         float deltaY = curr.y - last.y; 
         float scaleWidth = Math.round(origWidth * saveScale); 
         float scaleHeight = Math.round(origHeight * saveScale); 
         if (scaleWidth < width) { 
          deltaX = 0; 
          if (y + deltaY > 0) 
           deltaY = -y; 
          else if (y + deltaY < -bottom) 
           deltaY = -(y + bottom); 
         } else if (scaleHeight < height) { 
          deltaY = 0; 
          if (x + deltaX > 0) 
           deltaX = -x; 
          else if (x + deltaX < -right) 
           deltaX = -(x + right); 
         } else { 
          if (x + deltaX > 0) 
           deltaX = -x; 
          else if (x + deltaX < -right) 
           deltaX = -(x + right); 

          if (y + deltaY > 0) 
           deltaY = -y; 
          else if (y + deltaY < -bottom) 
           deltaY = -(y + bottom); 
         } 

         if(deltaX == 0) 
          startInterceptEvent(); 
         else 
          stopInterceptEvent(); 

         matrix.postTranslate(deltaX, deltaY); 
         last.set(curr.x, curr.y); 
        } 
        break; 

       case MotionEvent.ACTION_UP: 
        mode = NONE; 
        int xDiff = (int) Math.abs(curr.x - start.x); 
        int yDiff = (int) Math.abs(curr.y - start.y); 
        if (xDiff < CLICK && yDiff < CLICK) 
         performClick(); 
        startInterceptEvent(); 
        break; 

       case MotionEvent.ACTION_POINTER_UP: 
        mode = NONE; 
        break; 
      } 
      setImageMatrix(matrix); 
      invalidate(); 
      return true; // indicate event was handled 
     } 

    }); 
} 
} 
+0

Ya per favore rivedi il TouchImageView. Ci sto davvero lavorando molto. Non sono in grado di trovare una soluzione. Sarebbe davvero utile se puoi aiutarmi in questo !! Si prega di aggiornare la risposta con TouchImageView modificato. – Bharath

+0

Ho modificato la mia risposta con la soluzione. –

+0

Grazie @Vivek. Sta funzionando!! – Bharath

1

ho preso a lavorare con l'aggiunta di questo codice:

if(deltaX == 0 && saveScale == 1.0) 
    startInterceptEvent(); 
else 
    stopInterceptEvent(); 
+1

Dove dobbiamo aggiungere questo codice? –

0
if(deltaX == 0 || saveScale == 1.0) 
    startInterceptEvent(); 
else 
    stopInterceptEvent(); 
0

ho finalmente trovato la biblioteca Subsampling Scale Image View, che funziona anche con ViewPager serie da Android pacchetto di supporto senza alcuna personalizzazione.

0

Se qualcuno ha un viewpager orizzontale, è importante cambiamento @ codice Kirit-Vaghela:

if(deltaX == 0 || saveScale == 1.0) 
    startInterceptEvent(); 
else 
    stopInterceptEvent(); 

Per

if(saveScale == 1.0) 
    startInterceptEvent(); 
else 
    stopInterceptEvent(); 

Così andando dell'adattatore cambiare l'immagine solo quando è 1.0

Problemi correlati