2012-12-13 10 views
10

ViewPagerを使用して画像のギャラリーを実装しようとしています。また、ズーム機能を実装するには、githubのTouchImageViewを使用しています。私もZoomableImageViewを使ってみました。ViewPagerとImageViewズームの問題

しかし、問題は、私は、画像&をズームインするとき、私は画像をスクロールする場合のイメージの代わり、その後、ViewPagerViewPagerの&次のビューがロードされつつあるスクロールなっている、です。

私は、その後、画像がViewPager

ViewPagerの次のビューの代わりに移動しなければならないズーム画像の終わりに達した場合にのみロードするために持っていることをスクロールする場合、私は、画像をズームした場合。どうやってするか?

私はそれを見つけることができません。&をドラッグすると、画像が斜めにドラッグされます。その後、画像が移動します。 ViewPagerのドラッグが呼び出されています。

ps:これは重複していません。ズームが行われます。しかし、問題は画像の拡大後です。

答えて

21

はい私もTouchImageViewではなく、同じ問題がありました。

問題が解決しすぎて、ビューにフォーカスが当てられているときにViewPagerが無効になります。

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; 
    } 
} 

TouchImageViewでは、リスナーを実装して、ズームやドラッグのいずれかのイベントをトリガーします。

あなたのアクティビティのビューオブジェクトにリスナーを設定します。したがって、これらのイベントが発生したときは、ビューページャを無効にしてください。

:ビューポートを有効にするにはマウスアップイベントも必要です。

EDITED

ViewPagerはあなたが元に戻ってズームすべきページをスワイプするためので、これは、ズームのためにのみ動作します。

はあなた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(); 
     } 
    } 

私たちは、下記の方法を使用して、新しいクラスにViewPagerを延長せずにこれを達成でき

よりよい解決策にこれらのコードを追加します。

requestDisallowInterceptTouchEvent(true); 

これでギャラリーや他の多くのアプリに見られるように、ズームアウトせずにスワイプすることができます。

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がある場合にのみので、アダプタのつもりが、画像を変更TouchImageViewを改訂してください。私は本当にそれを非常に懸命に働いています。私は解決策を見つけることができません。あなたが私を助けることができれば本当に役に立ちます!!修正されたTouchImageViewであなたの答えを更新してください。 – Bharath

+0

解答で私の解答を編集しました。 –

+0

ありがとうございます@ Vivek。その作業! – Bharath

1

私はそれがこのコードを追加することで動作するようになった:

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

どこにこのコードを追加しなければなりませんか? –

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

私はどんななカスタマイズがなくてもAndroidのサポートパッケージの標準ViewPagerで動作Subsampling Scale Image Viewライブラリを、ついに発見しました。

0

誰かが横viewpagerを持っている場合は、kirit-vaghelaコード@重要な変更である:

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

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

1.0