0

我正在使用Mike Ortiz的TouchImageViewAndroid,canScrollVertically從未要求ImageView

在IT,canScrollHorizontally被覆蓋:

@Override 
public boolean canScrollHorizontally(int direction) { 
    matrix.getValues(m); 
    float x = m[Matrix.MTRANS_X]; 
    float y = m[Matrix.MTRANS_Y]; 

    if (getImageWidth() < viewWidth) { 
     return false; 

    } else if (x >= -1 && direction < 0) { 
     return false; 

    } else if (Math.abs(x) + viewWidth + 1 >= getImageWidth() && direction > 0) { 
     return false; 
    } 

    return true; 
} 

可正常工作。我可以將TouchImageView放在ViewPager中,並滾動放大的圖像,但是當我到達圖像的邊緣時,也可以通過ViewPager左右滑動。

但我打算有一個垂直的ViewPager嵌套在常規的ViewPager中。垂直ViewPager之後this SO後建模:

public class VerticalViewPager extends ViewPager { 

    public VerticalViewPager(Context context) { 
     super(context); 
     init(); 
    } 

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

    private void init() { 
     // The majority of the magic happens here 
     setPageTransformer(true, new VerticalPageTransformer()); 
     // The easiest way to get rid of the overscroll drawing that happens on the left and right 
     setOverScrollMode(OVER_SCROLL_NEVER); 
    } 

    private class VerticalPageTransformer implements ViewPager.PageTransformer { 

     @Override 
     public void transformPage(View view, float position) { 

      if (position < -1) { // [-Infinity,-1) 
       // This page is way off-screen to the left. 
       view.setAlpha(0); 

      } else if (position <= 1) { // [-1,1] 
       view.setAlpha(1); 

       // Counteract the default slide transition 
       view.setTranslationX(view.getWidth() * -position); 

       //set Y position to swipe in from top 
       float yPosition = position * view.getHeight(); 
       view.setTranslationY(yPosition); 

      } else { // (1,+Infinity] 
       // This page is way off-screen to the right. 
       view.setAlpha(0); 
      } 
     } 
    } 

    /** 
    * Swaps the X and Y coordinates of your touch event. 
    */ 
    private MotionEvent swapXY(MotionEvent ev) { 
     float width = getWidth(); 
     float height = getHeight(); 

     float newX = (ev.getY()/height) * width; 
     float newY = (ev.getX()/width) * height; 

     ev.setLocation(newX, newY); 

     return ev; 
    } 

    @Override 
    public boolean onInterceptTouchEvent(MotionEvent ev){ 
     boolean intercepted = super.onInterceptTouchEvent(swapXY(ev)); 
     swapXY(ev); // return touch coordinates to original reference frame for any child views 
     return intercepted; 
    } 

    @Override 
    public boolean onTouchEvent(MotionEvent ev) { 
     return super.onTouchEvent(swapXY(ev)); 
    } 

} 

通過定期ImageViews,它的偉大工程。我可以通過水平ViewPager左/右滑動,同時也可以根據需要垂直滾動瀏覽嵌套的ViewPager。一個修改垂直ViewPager(允許從垂直ViewPager內的任何橫向滾動)是:

@Override 
public boolean canScrollHorizontally(int direction) { 
    return false; 
} 

小的變化,工程巨大。

垂直ViewPager的內容是自定義的TouchImageViews的麻煩來了。左右滑動仍然很好,但垂直滑動僅在圖像右邊緣與設備屏幕右側對齊時才起作用。這是由於TouchImageView類中的canScrollHorizontally重寫造成的。

int direction參數不考慮x或y。正y滑動與正x滑動不可區分。

我想要做的是覆蓋canScrollVertically方法,以檢測垂直刷卡何時發生,但方法永遠不會被調用。即使只是一個快速測試,如:

@Override 
public boolean canScrollVertically(int direction) { 
    matrix.getValues(m); 

    Toast.makeText(context, "vertical", Toast.LENGTH_SHORT).show(); 


    return true; 
} 

永遠不會被調用。在canScrollHorizontally方法中放置相同的Toast消息會在每次滑動(水平或垂直)上顯示消息。

爲什麼canScrollVertically從不叫?

我想要檢測圖像在視圖中底部出現時以及用戶向上滑動時的情況。當滿足這兩個條件時,我可以從canScrollHorizontally返回false,並允許垂直ViewPager正確滾動。

在此先感謝您的幫助。任何人都知道Mike Ortiz!?

回答

0

所以我提出的解決方案如下。

TouchImageView,邁克有一個自定義類

private class PrivateOnTouchListener implements OnTouchListener 

它具有以下塊:

case MotionEvent.ACTION_MOVE: 
     if (state == State.DRAG) { 
      float deltaX = curr.x - last.x; 
      float deltaY = curr.y - last.y; 

      ... etc ... 
     } 
     break; 

我所做的就是設置一個全局boolean verticalDrag;。使用上面的塊,我檢查,以確保所述DELTAY大於DELTAX足夠大(即,垂直拖/刷卡)

if(Math.abs(deltaY) > (Math.abs(deltaX) * sensitivity)){ 
    verticalDrag = true; 
}else{ 
    verticalDrag = false; 
} 

哪裏靈敏度可達到編碼器的判斷來分配。真正的垂直滑動通常會有幾個像素左/右偏差 - 難以單獨向一個方向或另一個方向滑動。因此,靈敏度可能相當高(即5到10或更高,具體取決於測試),並且它仍會激發。

回到canScrollHorizontally方法中,我只需要添加:

float y = m[Matrix.MTRANS_Y]; 

else if(Math.abs(y) + viewHeight + 1 >= getImageHeight() && verticalDrag){ 
    return false; 
} 

,其允許垂直ViewPager刷卡,如需要的話。