2017-08-25 102 views
-1

我已經創建了自定義的線性佈局,放大了我在垂直方向上使用ImageView添加圖像。在我使用ScrollView和Horizo​​ntalScrollView的圖像之間滾動。我的問題是,當我縮放自定義線性佈局scrollview大小未調整和自定義linearlayout的頂部和底部被剪切。我不知道我的邏輯出錯了。我沒有找到使用谷歌解決方案。請在下面的鏈接中找到我的應用程序,並讓我知道你的建議來解決這個問題。 SampleApp如何在linearlayout中縮放子視圖並使其可滾動?

+0

您是否嘗試過我的解決方案?任何更新? –

+0

Hi @ GraceFeng-MSFT, 今天我會檢查並更新你。 – SATHISH

回答

0

如果你想與ScrollView做到這一點,使圖像垂直放在你的佈局,您需要創建HorizontalScrollViewScrollViewLinearLayout每個ImageView

而且您的比例設置爲LinearLayout,當縮放一個圖像時,所有其他圖像將在同一時間縮放。我認爲你需要做的是縮放每個圖像。然後您可以實現每個ImageView,例如創建一個 ScaleImageView

而且因爲你要顯示的ImageViewLinearLayout列表,你可以例如這樣的代碼:

<ScrollView xmlns:android="http://schemas.android.com/apk/res/android" 
      android:layout_height="match_parent" 
      android:layout_width="match_parent" 
      android:fillViewport="true" 
      android:id="@+id/sv"> 
    <HorizontalScrollView android:layout_height="match_parent" 
          android:layout_width="match_parent" 
          android:fillViewport="true" 
         android:id="@+id/hsv"> 
    <LinearLayout 
    android:orientation="vertical" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:id="@+id/root" /> 
    </HorizontalScrollView> 
</ScrollView> 

後面的代碼:

private List<int> imageList = new List<int> { Resource.Drawable.image1, Resource.Drawable.image2, Resource.Drawable.image3, Resource.Drawable.image4 }; 
private LinearLayout root; 

protected override void OnCreate(Bundle bundle) 
{ 
    base.OnCreate(bundle); 

    // Set our view from the "main" layout resource 
    SetContentView(Resource.Layout.Main); 

    root = FindViewById<LinearLayout>(Resource.Id.root); 
    root.SetClipChildren(false); 
    for (int i = 0; i < imageList.Count; i++) 
    { 
     Bitmap bitmap = BitmapFactory.DecodeResource(this.Resources, imageList[i]); 
     var lp = new LinearLayout.LayoutParams(bitmap.Width, bitmap.Height); 
     lp.SetMargins(0, 2, 0, 2); 
     lp.Gravity = Android.Views.GravityFlags.Center; 
     ScaleImageView img = new ScaleImageView(this, null); 
     img.SetImageBitmap(bitmap); 
     img.SetScaleType(ScaleType.Matrix); 
     root.AddView(img, i); 
    } 
} 

爲了避免ScrollViewZoom之間的矛盾,像這樣修改OnTouchEventScaleImageView

public override bool OnTouchEvent(MotionEvent e) 
{ 
    if (m_GestureDetector.OnTouchEvent(e)) 
    { 
     m_PreviousMoveX = (int)e.GetX(); 
     m_PreviousMoveY = (int)e.GetY(); 
     return true; 
    } 

    var touchCount = e.PointerCount; 
    switch (e.Action) 
    { 
     case MotionEventActions.Down: 
     case MotionEventActions.Pointer1Down: 
     case MotionEventActions.Pointer2Down: 
      { 
       if (touchCount >= 2) 
       { 
        var distance = this.Distance(e.GetX(0), e.GetX(1), e.GetY(0), e.GetY(1)); 
        m_PreviousDistance = distance; 
        m_IsScaling = true; 
        var parent = this.Parent; 
        var scrollview = parent.Parent; 
        scrollview.RequestDisallowInterceptTouchEvent(true); 
        scrollview.Parent.RequestDisallowInterceptTouchEvent(true); 
       } 
      } 
      break; 

     case MotionEventActions.Move: 
      { 
       if (touchCount >= 2 && m_IsScaling) 
       { 
        var distance = this.Distance(e.GetX(0), e.GetX(1), e.GetY(0), e.GetY(1)); 
        var scale = (distance - m_PreviousDistance)/this.DispDistance(); 
        m_PreviousDistance = distance; 
        scale += 1; 
        scale = scale * scale; 
        this.ZoomTo(scale, m_Width/2, m_Height/2); 
        this.Cutting(); 
       } 
       else if (!m_IsScaling) 
       { 
        var distanceX = m_PreviousMoveX - (int)e.GetX(); 
        var distanceY = m_PreviousMoveY - (int)e.GetY(); 
        m_PreviousMoveX = (int)e.GetX(); 
        m_PreviousMoveY = (int)e.GetY(); 

        m_Matrix.PostTranslate(-distanceX, -distanceY); 
        this.Cutting(); 
       } 
      } 
      break; 

     case MotionEventActions.Up: 
     case MotionEventActions.Pointer1Up: 
     case MotionEventActions.Pointer2Up: 
      { 
       if (touchCount <= 1) 
       { 
        m_IsScaling = false; 
        var parent = this.Parent; 
        var scrollview = parent.Parent; 
        scrollview.RequestDisallowInterceptTouchEvent(false); 
        scrollview.Parent.RequestDisallowInterceptTouchEvent(false); 
       } 
      } 
      break; 
    } 
    return true; 
} 
+0

此解決方案不適合我的要求。我想縮放整個線性佈局,並在水平和垂直方向滾動而不會丟失頂部和底部的圖像。你能幫我解決這個問題嗎? 簡單的例子:我想顯示我的圖像像Adobe Reader中顯示的PDF頁面一樣,需要以線性佈局執行縮放整個兒童 – SATHISH

+0

@SATHISH,哦......我誤解了。我測試了你的代碼,起初我認爲它是'ImageView'的imgView.SetAdjustViewBounds(true);問題,導致ImageView的大小在縮放時不會改變。但是在我將它設置爲true後,我仍然遇到同樣的問題。現在繼續工作...當我想出來的時候,我會更新我的答案。 –

+0

感謝您的更新 – SATHISH

相關問題