2017-08-25 11 views
-1

ImageViewを垂直方向に使用して画像を追加しているズームインのカスタム線形描画を作成しました。画像間をスクロールするにはScrollViewとHorizo​​ntalScrollViewを使用しました。私の問題は、私がカスタム線形レイアウトをスケーリングしたときです。スクロールビューのサイズは調整されず、カスタム線形レイアウトの上端と下端がクリップされます。私の論理がどこに間違っているのか分かりません。 Googleを使って解決策を見つけることができませんでした。下記のリンクから私のアプリを見つけて、これを解決するための提案をお知らせください。 SampleApplinearlayout内の子ビューを拡大縮小してスクロール可能にする方法はありますか?

+0

私の解決策を試しましたか?すべてのアップデート? –

+0

こんにちは@ GraceFeng-MSFT、 私は今日あなたを確認し、更新します。 – SATHISH

答えて

0

あなたはScrollViewでそれを行うと、あなたのレイアウトに敷設された画像を縦にしたい場合は、各ImageViewためLinearLayout内部HorizontalScrollViewScrollViewを作成する必要があります。

縮尺がLinearLayoutに設定されている場合、1つの画像が縮尺されると、他のすべての画像は同時に縮尺されます。私はあなたがする必要があると思うのは、それぞれの画像を拡大することです。次に、それぞれImageViewに実装することができます。たとえば、 ScaleImageViewを作成します。

そして、あなたはLinearLayoutImageViewのリストを表示するために、あなたは次のように例をコードしてもよい:ScrollViewZoom間の競合を避けるため

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

:背後

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

コードのScaleImageViewを次のように変更します。

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、oh ...私は誤解しました。あなたのコードをテストしたところ、最初は 'ImageView'の' imgView.SetAdjustViewBounds(true); '問題だと思ったので、' ImageView'のサイズはスケーリング時に変更されません。しかし、私はそれを真に設定した後、私はまだ同じ問題を抱えています。これで今作業して...私はそれを考え出したときに私の答えを更新します。 –

+0

更新ありがとう – SATHISH

関連する問題