2012-12-13 45 views
10

Tôi đang cố gắng triển khai Thư viện hình ảnh bằng cách sử dụng ViewPager. Ngoài ra, để triển khai tính năng thu phóng trong đó, tôi đang sử dụng TouchImageView từ github. Tôi cũng đã thử sử dụng ZoomableImageView.Sự cố phóng to ViewPager & ImageView

Nhưng, vấn đề là, nếu tôi phóng to hình ảnh & nếu tôi di chuyển hình ảnh, sau đó thay vì hình ảnh, ViewPager là nhận được cuộn & xem tiếp theo của ViewPager đang nhận được nạp.

Nếu tôi phóng to hình ảnh sau đó nếu tôi di chuyển, sau đó hình ảnh có để di chuyển thay vì ViewPager

xem tiếp theo ViewPager của có để tải chỉ khi đến cuối của hình ảnh thu nhỏ. Làm thế nào để làm điều đó?

Tôi không thể tìm thấy điều đó.Nếu tôi chạm vào & hãy kéo hình ảnh theo đường chéo, chỉ khi đó hình ảnh đang được di chuyển. nếu không thì kéo ViewPager đang được gọi.

ps: đây không phải là trùng lặp. Quá trình thu phóng được thực hiện. Nhưng vấn đề là sau khi phóng to hình ảnh.

Trả lời

21

Có, tôi cũng có cùng một sự cố không phải với TouchImageView.

Giải quyết được vấn đề những gì tôi đã làm đã tắt ViewPager khi chế độ xem của tôi đang lấy nét.

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

như vậy trong TouchImageView thi nghe của bạn để kích hoạt một sự kiện dù phóng to hoặc kéo.

đặt trình nghe cho đối tượng chế độ xem của bạn trong Hoạt động của bạn. Vì vậy, khi những sự kiện xảy ra chỉ cần vô hiệu hóa xem Pager.

Lưu ý: bạn cũng sẽ cần sự kiện di chuột để bật chế độ xem.

EDITED

này sẽ làm việc chỉ dành cho Phóng to, vì vậy cho ViewPager swipe trang bạn nên phóng to trở lại ban đầu.

Thêm các mã để TouchImageView bạn

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

giải pháp tốt hơn

Chúng ta có thể đạt được điều này mà không cần mở rộng ViewPager đến một lớp mới bằng cách sử dụng phương pháp đưa ra dưới đây.

requestDisallowInterceptTouchEvent(true); 

Và với điều này chúng tôi có thể vuốt mà không cần phóng to vị trí ban đầu như chúng ta thấy trong Thư viện và nhiều ứng dụng khác.

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 hãy sửa lại TouchImageView. Tôi thực sự làm việc rất chăm chỉ. Tôi không thể tìm ra giải pháp. Nó sẽ thực sự hữu ích nếu bạn có thể giúp tôi trong đó !! Vui lòng cập nhật câu trả lời của bạn với TouchImageView đã sửa đổi. – Bharath

+0

Tôi đã chỉnh sửa câu trả lời của mình bằng giải pháp. –

+0

Cảm ơn bạn @Vivek. Làm việc của nó !! – Bharath

1

tôi đã nhận nó để làm việc bằng cách thêm mã này:

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

Mã này chúng tôi phải thêm vào đâu? –

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

tôi cuối cùng đã tìm thấy Subsampling Scale Image View thư viện, hoạt động ngay cả với ViewPager tiêu chuẩn từ Android Gói hỗ trợ mà không cần bất kỳ các tùy biến.

0

Nếu ai đó có một ViewPager ngang, là sự thay đổi quan trọng @ kirit-vaghela mã:

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

Để

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

Vì vậy, sẽ của bộ chuyển đổi thay đổi hình ảnh chỉ khi là 1,0

Các vấn đề liên quan