2013-09-16 52 views
3

我已經使用ViewPager進行圖像滑動,我需要使用縮放選項查看圖像,圖像被放大,但分頁中斷時放大圖像。已嘗試onTouchEvent()OnInterceptTouchEvent()。並啓用ViewPager導致Force關閉。當ImageView被放大時,在ViewPager中禁用分頁

+0

要禁用滾動,你必須使用定製ViewPager類。 –

回答

1

子類ViewPager和覆蓋canScroll()。您將經過檢測到有觸摸事件的小部件,你可以返回true如果你想滾動事件傳遞給小部件或false如果你想ViewPager使用該滾動量。在你的情況下,當你縮放時,你會使用自己的自定義邏輯,當你沒有縮放時,只需鏈接到超類。

+0

由於我看到很多問題都出現在重新編寫這個ViewPager-zoom組合中,我很驚訝沒有一個可以處理它的實體庫,或者是在那裏? 我看到這個帖子: https://groups.google.com/forum/#!topic/android-developers/mygxOpYwcKo 但是,只有底部的兩個項目都使用Viewpager並且都在這裏或穩定性問題描述的任何問題。 無論如何,你是Mark還是你們中的任何一個人知道將ViewPager和縮放成功結合起來的實現?謝謝 – Rob

+0

@Rob:考慮到'ViewPager'子類是十幾行代碼,一個庫看起來會過度。更糟的是,圖書館不會先知道需要放大的東西,所以我甚至不知道如何實現這樣一個圖書館。 – CommonsWare

1

我也面臨同樣的問題一次,我做了以下解決this.I使用自定義ViewPager類。

CustomViewPager的.java

public class CustomViewPager extends ViewPager { 

    private boolean isPagingEnabled; 

    public CustomViewPager(Context context, AttributeSet attrs) { 
     super(context, attrs); 
     this.isPagingEnabled = true; 
    } 

    @Override 
    public boolean onTouchEvent(MotionEvent event) { 
     if (this.isPagingEnabled) { 
      return super.onTouchEvent(event); 
     } 

     return false; 
    } 

    @Override 
    public boolean onInterceptTouchEvent(MotionEvent event) { 
     if (this.isPagingEnabled) { 
      return super.onInterceptTouchEvent(event); 
     } 

     return false; 
    } 

    public void setPagingEnabled(boolean b) { 
     this.isPagingEnabled = b; 
    } 
} 

和禁用滾動使用下面的代碼片段,

CustomViewPager pager = (CustomViewPager) findViewById(R.id.pager); 
pager.setPagingEnabled(false); 

如果您需要更多的信息,那麼你可以問。希望能幫助到你。

+0

該代碼有效,但是當我使用該代碼時,我在wiewpager中失去了滑動。謝謝! – benoffi7

+0

@ benoffi7:這段代碼是禁用和啓用paging.You可以通過設置它'pager.setPagingEnabled(布爾);' –

+0

謝謝!但是當我激活滑動和取消激活縮放? – benoffi7

0

我這樣做有以下方式,它會在用戶縮放禁用分頁,但是當他打縮放的ImageView的邊緣它將正常頁面到下一個/上一個影像。

@Override 
     public boolean onTouchEvent(MotionEvent ev) { 
      if(handleTouch(ev)) { 
       return super.onTouchEvent(ev); 
      } 
      else { 
       return false; 
      } 

     } 

     @Override 
     public boolean onInterceptTouchEvent(MotionEvent ev) { 
      if(handleTouch(ev) && !areCommentsOpen()) { 
       return super.onInterceptTouchEvent(ev); 
      } 
      else { 
       return false; 
      } 
     } 

     private boolean handleTouch(MotionEvent ev) { 
      if (prevX != -666 && ev.getAction() == MotionEvent.ACTION_MOVE) { 
       if(ev.getX() <= prevX) { 
        isGoingLeft=false; 
       } 
       else { 
        isGoingLeft=true; 
       } 
      } 
      else if (ev.getAction() == MotionEvent.ACTION_UP || ev.getAction() == MotionEvent.ACTION_CANCEL) { 
       return true; 
      } 

      ZoomableImageView imageView = getImageView(); 
      if(imageView == null) { 
       return true; 
      } 
      prevX=ev.getX(); 
      if(imageView.getZoomLevel() <= 1f) { 
       return true; 
      } 

      else if(imageView.isBoundedLeft()) { 
       if(isTransitioning) { 
        return true; 
       } 
       else if (isGoingLeft) { 
        isTransitioning = true; 
        return true; 
       } 
       else { 
        return false; 
       } 
      } 

      else if (imageView.isBoundedRight()) { 
       if(isTransitioning) { 
        return true; 
       } 
       else if (!isGoingLeft) { 
        isTransitioning = true; 
        return true; 
       } 
       else { 
        return false; 
       } 
      } 

      else { 
       isTransitioning = false; 
       return false; 
      } 
     } 

private ZoomableImageView getImageView() { 
     for (int i = 0; i < getChildCount(); i++) { 
      ZoomableImageView imageView = (ZoomableImageView) (getChildAt(i).findViewById(R.id.single_image_view)); 
      if(imageView.getPosition() == getCurrentItem()) { 
       return imageView; 
      } 
     } 
     return null; 
    } 

    public void setTransitioning(boolean trans) { 
     this.isTransitioning = trans; 
    } 

    public void setGoingLeft(boolean left) { 
     this.isGoingLeft = left; 
    } 
+0

謝謝!!!在哪裏使用此handleTouch()以及在哪裏調用此方法 – Pavithra

+0

這是自定義viewpager類中的代碼。所以你必須 類MyPager擴展ViewPager {// 以上代碼 } 並在XML你必須

1

我知道這個問題是舊的,但爲別人尋找一個答案Mike Ortiz TouchImageView開箱的,(你可能需要切換到Dev分支)