2016-05-18 11 views
0

私はIOSとWindowsではうまく動作しますが、アンドロイドでは動作しないZoomableScrollviewを書いたために、ピンチが必要な記事のような大きなテキストのラベルが必要です。以下のコードをご覧ください。 PCLでxamarinはスクロールビューでラベルをつまんでズームします。

コード

public class ZoomableScrollView:ScrollView 
{ 
    public static readonly BindableProperty MinimumZoomScaleProperty = BindableProperty.Create("MinimumZoomScale", typeof(float), typeof(ZoomableScrollView), default(float)); 

    public float MinimumZoomScale 
    { 
     get { return (float)GetValue(MinimumZoomScaleProperty); } 
     set { SetValue(MinimumZoomScaleProperty, value); } 
    } 
    public static readonly BindableProperty MaximumZoomScaleProperty = BindableProperty.Create("MaximumZoomScale", typeof(float), typeof(ZoomableScrollView), default(float)); 

    public float MaximumZoomScale 
    { 
     get { return (float)GetValue(MaximumZoomScaleProperty); } 
     set { SetValue(MaximumZoomScaleProperty, value); } 
    } 
} 

IOSレンダラ

public class ZoomableScrollViewRenderer : ScrollViewRenderer 
{ 
    protected override void OnElementChanged(VisualElementChangedEventArgs e) 
    { 
     base.OnElementChanged(e); 
     if (e.NewElement == null) 
      return; 

     if (e.OldElement == null) 
     { 
      ZoomableScrollView zsv = Element as ZoomableScrollView; 
      this.MinimumZoomScale = zsv.MinimumZoomScale; 
      this.MaximumZoomScale = zsv.MaximumZoomScale; 
      this.ViewForZoomingInScrollView += (UIScrollView sv) => { return this.Subviews[0]; }; 
     } 
    } 
} 

Windowsのレンダラ

public class ZoomableScrollViewRenderer:ScrollViewRenderer 
{ 
    protected override void OnElementChanged(ElementChangedEventArgs<ScrollView> e) 
    { 
     base.OnElementChanged(e); 
     if (e.NewElement == null) 
      return; 

     if (e.OldElement == null) 
     { 
      ZoomableScrollView zsv = Element as ZoomableScrollView; 
      this.Control.ZoomMode = Windows.UI.Xaml.Controls.ZoomMode.Enabled; 
      this.Control.MinZoomFactor = zsv.MinimumZoomScale; 
      this.Control.MaxZoomFactor = zsv.MaximumZoomScale; 
     } 
    } 
} 

アンドロイドレンダラ

public class ZoomableScrollViewRenderer:ScrollViewRenderer 
{ 
    float originalDistanceX, currentdistanceX, originalDistanceY, currentdistanceY; 
    bool IsPinching = false; 
    double currentScale; 
    TeluguLabel lbl; 
    ScrollView svMain, svSub; 

    protected override void OnElementChanged(VisualElementChangedEventArgs e) 
    { 
     base.OnElementChanged(e); 
     svMain = ((ScrollView)e.NewElement); 
     lbl = svMain.Content as TeluguLabel; 
     svSub = new ScrollView(); 
     svSub.Orientation = ScrollOrientation.Horizontal; 
     svSub.Content = lbl; 
     svMain.Content = svSub; 
     lbl.AnchorX = 0; 
     lbl.AnchorY = 0; 

    } 
    public override bool OnTouchEvent(MotionEvent e) 
    { 
     if (e.PointerCount > 1) 
     { 
      IsPinching = true; 
      currentScale = lbl.Scale; 
      originalDistanceX = Math.Abs(e.GetX(0) - e.GetX(1)); 
      originalDistanceY = Math.Abs(e.GetY(0) - e.GetY(1)); 
     } 
     else 
     { 
      IsPinching = false; 
     } 
     return base.OnTouchEvent(e); 
    } 
    public override bool DispatchTouchEvent(Android.Views.MotionEvent e) 
    { 
     switch (e.Action) 
     { 
      case MotionEventActions.Down: 
       this.Parent.RequestDisallowInterceptTouchEvent(true); 
       break; 
      case MotionEventActions.Move: 
       if(IsPinching && e.PointerCount > 1) 
       { 
        currentdistanceX = Math.Abs(e.GetX(0) - e.GetX(1)); 
        currentdistanceY = Math.Abs(e.GetY(0) - e.GetY(1)); 
        if (originalDistanceX < currentdistanceX || originalDistanceY < currentdistanceY) 
         lbl.Scale = currentScale + 0.01; 
        else if (originalDistanceX > currentdistanceX || originalDistanceY > currentdistanceY) 
         lbl.Scale = currentScale - 0.01; 
       } 
       break; 
      case MotionEventActions.Up: 
       this.Parent.RequestDisallowInterceptTouchEvent(false); 
       break; 
     } 
     return base.DispatchTouchEvent(e); 
    } 


} 

android私はある程度のズームを実現できましたがスクロールはスムーズではありませんでしたが、私はそれを妥協しました。今問題は、テキストがラベル内に取り除かれていることです。誰かが私のアプリ自体が彼は基本的な機能は動作していない読書のためのものです助けてください。 ありがとうございます

答えて

0

私はそれを手に入れました。基本的にはアンドロイドのラベルには行数の制限が100ありません。レンダラーでオーバーライドする必要があります

label.SetMaxLines(4000); 
関連する問題