C# Xamarin.form中的可缩放旋转视图

C# Xamarin.form中的可缩放旋转视图,c#,xamarin.forms,carousel,zooming,C#,Xamarin.forms,Carousel,Zooming,我使用旋转视图来显示许多图像,在滑动时可以更改。我遇到的问题是这些图像无法缩放。有没有办法在旋转木马视图中启用缩放?谢谢。好的,第一个旋转木马视图不是你想要缩放的gud(实际情况下) 客户需要银河系以外的东西,所以你可以用一些逻辑来解决问题 第一条路: 在共享的Xamarin.forms解决方案中创建类名ZoomImage,并在其中添加此代码 public class ZoomImage : Image { private const double MIN_SCALE = 1; priv

我使用旋转视图来显示许多图像,在滑动时可以更改。我遇到的问题是这些图像无法缩放。有没有办法在旋转木马视图中启用缩放?谢谢。

好的,第一个旋转木马视图不是你想要缩放的gud(实际情况下) 客户需要银河系以外的东西,所以你可以用一些逻辑来解决问题

第一条路:

在共享的Xamarin.forms解决方案中创建类名ZoomImage,并在其中添加此代码

public class ZoomImage : Image {
  private const double MIN_SCALE = 1;
  private const double MAX_SCALE = 4;
  private const double OVERSHOOT = 0.15;
  private double StartScale;
  private double LastX, LastY;

  public ZoomImage() {
    var pinch = new PinchGestureRecognizer();
    pinch.PinchUpdated += OnPinchUpdated;
    GestureRecognizers.Add(pinch);

    var pan = new PanGestureRecognizer();
    pan.PanUpdated += OnPanUpdated;
    GestureRecognizers.Add(pan);

    var tap = new TapGestureRecognizer { NumberOfTapsRequired = 2 };
    tap.Tapped += OnTapped;
    GestureRecognizers.Add(tap);

    Scale = MIN_SCALE;
    TranslationX = TranslationY = 0;
    AnchorX = AnchorY = 0;
  }

  protected override SizeRequest OnMeasure(double widthConstraint, double heightConstraint) {
    Scale = MIN_SCALE;
    TranslationX = TranslationY = 0;
    AnchorX = AnchorY = 0;
    return base.OnMeasure(widthConstraint, heightConstraint);
  }

  private void OnTapped(object sender, EventArgs e) {
    if (Scale > MIN_SCALE) {
      this.ScaleTo(MIN_SCALE, 250, Easing.CubicInOut);
      this.TranslateTo(0, 0, 250, Easing.CubicInOut);
    }
    else {
      AnchorX = AnchorY = 0.5; //TODO tapped position
      this.ScaleTo(MAX_SCALE, 250, Easing.CubicInOut);
    }
  }

  private void OnPanUpdated(object sender, PanUpdatedEventArgs e) {
    if (Scale > MIN_SCALE)
      switch (e.StatusType) {
        case GestureStatus.Started:
          LastX = TranslationX;
          LastY = TranslationY;
          break;
        case GestureStatus.Running:
          TranslationX = Clamp(LastX + e.TotalX * Scale, -Width / 2, Width / 2);
          TranslationY = Clamp(LastY + e.TotalY * Scale, -Height / 2, Height / 2);
          break;
      }
  }

  private void OnPinchUpdated(object sender, PinchGestureUpdatedEventArgs e) {
    switch (e.Status) {
      case GestureStatus.Started:
        StartScale = Scale;
        AnchorX = e.ScaleOrigin.X;
        AnchorY = e.ScaleOrigin.Y;
        break;
      case GestureStatus.Running:
        double current = Scale + (e.Scale - 1) * StartScale;
        Scale = Clamp(current, MIN_SCALE * (1 - OVERSHOOT), MAX_SCALE * (1 + OVERSHOOT));
        break;
      case GestureStatus.Completed:
        if (Scale > MAX_SCALE)
          this.ScaleTo(MAX_SCALE, 250, Easing.SpringOut);
        else if (Scale < MIN_SCALE)
          this.ScaleTo(MIN_SCALE, 250, Easing.SpringOut);
        break;
    }
  }

  private T Clamp<T>(T value, T minimum, T maximum) where T : IComparable {
    if (value.CompareTo(minimum) < 0)
      return minimum;
    else if (value.CompareTo(maximum) > 0)
      return maximum;
    else
      return value;
  }
}
这就是图像缩放的方式

或者第二种方法是

添加在旋转木马视图上点击的项目,并在命令参数中传递图片源,打开包含该图片的新页面,并在其中应用缩放

我用这种逻辑来解决我的问题


希望这有帮助:)

这可以通过使用

Alexanman/旋转木马视图,用于旋转木马视图。

并根据表单样本向carousal view中使用的图像添加Xamarin表单夹手势识别器


那么,到目前为止您做了什么?实现了旋转木马视图。这是预期的行为,在股票转盘视图中没有缩放。或者你实现了任何使用缩放的功能吗?@PaulKertscher我还没有实现任何用于缩放的功能。我想知道我的功能选项是什么?这里我有一个问题,我使用旋转视图来显示许多图像,当我在滑动另一个图像(背景图像显示)后缩放一个图像时,请给我解决此问题的解决方案。我想在旋转视图中位置更改时缩小。我正在创建一个类名ZoomImage。类似viewcell的内部示例。你知道吗?我仍然面临这个问题
<cv:CarouselView x:Name="itemPictureGallery"  Grid.Column="0" Grid.Row="0">
                    <cv:CarouselView.ItemTemplate>

                        <DataTemplate>
                          <local:image source="YOUR_PIC_SOURCE"  />
                         </DataTemplate>

                    </cv:CarouselView.ItemTemplate>
                </cv:CarouselView>
xmlns:local="clr-namespace:YOUR_APP_NAME"