2013-10-03 55 views
1

藉助以下鏈接,我已成功實現了自定義相對佈局中的縮放和平移/拖動功能。設置平移/拖動Zoomable自定義相對佈局的邊界限制

1)。一個很好的教程 - making-sense-of-multitouch

2)。 (SO鏈接)Extending RelativeLayout, and overriding dispatchDraw() to create a zoomable ViewGroup

3)。 (SO鏈接)Scroll/Panning or drag in custom layout

這是我的完整工作代碼。

https://gist.github.com/pandeyGitHub/6805840

和我layout.xml看起來像這樣: -

<com.myzoomproject.views.ZoomableRelativeLayout 
    android:id="@+id/root_pager" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" > 

    <com.myzoomproject.views.CustomViewPager 
     android:id="@+id/pager_test2" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" /> 

</com.myzoomproject.views.ZoomableRelativeLayout> 

我的自定義相對佈局包含viewpager和我viewpager每一單頁包含2-4 imageviews(一個全屏的ImageView &幾個可點擊更小的圖像瀏覽)。縮放&平移頁面工作得很好。

問題1: 但不知何故,我不能夠設置爲平移功能邊界限制。該頁面會在超滾屏幕上消除屏幕。

問題2: 此外,似乎圖像視圖平移/翻譯僅在圖紙而不是在現實中。因爲他們在屏幕上離開原始位置的那一刻不再可點擊,&可點擊座標僅限於其原始位置。

我在SO link 1,link 2,link 3上查找了幾個類似的問題,但它們都基於ImageView縮放而不是自定義佈局縮放。

因此,與他們不同,我沒有參考我的ZoomableRelativeLayout中的圖像瀏覽。參考Imageviews,閱讀顯示它們的位圖&由其他類(MyPagerActivity & MyPagerFragment類)負責。此外,上述鏈接中的解決方案依賴於矩陣轉換,我可能無法在我的情況下使用它。

期待任何幫助。

謝謝。

+0

你解決了這個問題嗎?不幸的是,我也一樣。 –

+0

是的。我已在下面發佈我的答案。這只是現在的解決方法。 – epiphany27

回答

0

你需要把在mPosX & mPosY位置最大/最小限制 - 這樣做將dx & dy後。

要計算適用的限制,可以使用getWidth()getHeight()以及當前比例因子來獲取子視圖的大小。

0

我以某種方式找到了一個解決方法,通過一些鉤子,這遠非一個完美的解決方案,因爲我不得不硬編碼一些值。我在現有的代碼中添加了以下代碼片段來設置邊界限制以進行平移。現在平移工作正常。

記錄mClipBound.top,bottom,left,right值我想出了以下硬編碼值,這些值可能只適用於720x1280 & 800x1280設備。

case MotionEvent.ACTION_MOVE: { 
    ... 
    ... 

    if (isPortraitMode) { 
     if (mClipBound.top < 104 && dy > 0) //104 is a hard-coded value here. 
      dy = 0; 

     if (mClipBound.bottom > (screenHeight - 77) && dy < 0) // 77 - hardcoded 
      dy = 0; 
    } else { 
     if (mClipBound.top < 0 && dy > 0) 
      dy = 0; 
     if (mClipBound.bottom > screenHeight && dy < 0) 
     dy = 0; 

    } 

    if (mClipBound.left < 30 && dx > 0) // 30 - hardcoded 
     dx = 0; 

    if (mClipBound.right > screenWidth && dx < 0) 
     dx = 0; 

    mPosX += dx; 
    mPosY += dy; 
     ... 
     ... 
     ... 
} 

... 
... 


@Override 
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 
    int widthSize = MeasureSpec.getSize(widthMeasureSpec); 
    int heightSize = MeasureSpec.getSize(heightMeasureSpec); 
    screenWidth = widthSize; 
    screenHeight = heightSize; 
    super.onMeasure(widthMeasureSpec, heightMeasureSpec); 
    setMeasuredDimension((int) (widthSize), (int) (heightSize)); 
} 

但我仍然沒有能夠解決問題2:在我上面的問題中提到。 onMeasure(..)&使用mScaleFactor的onLayout(..)方法中的一些適當調整可能會解決此問題。但我還沒有能夠使它工作。

0

對於問題2,您必須調整所有relativelayout的孩子的畫布矩形。您應該在scalegesturedetector的onScaleEnd方法中執行此操作。

public void resizeChildren() { 

    int childCount = this.getChildCount(); 

    for (int i = 0; i < childCount; i++) { 

     MyView child = (MyView)this.getChildAt(i); 
     child.setScaleFactor(mScaleFactor); 
     child.setCanvasRect(mRect); 


    } 

} 

setScaleFactor()和setCanvasRect()是MyView的是一個自定義視圖我用手指塗抹的方法。