【问题标题】:Zoom-able CarouselView in Xamarin.formXamarin.form 中的可缩放 CarouselView
【发布时间】:2018-04-23 05:17:53
【问题描述】:

我正在使用轮播视图来显示许多图像,这些图像在滑动时会发生变化。我遇到的问题是这些图像不能缩放。有没有办法在轮播视图中启用缩放?谢谢。

【问题讨论】:

  • 那么,到目前为止你做了什么?
  • 实现了轮播视图。一切正常,预计没有缩放。
  • @Ahsanzz1这是预期的行为,没有放大股票 CarouselView。或者您是否实施了任何使用缩放的方法?
  • @PaulKertscher 我还没有实现任何缩放。我想知道我对此类功能有哪些选择?

标签: c# xamarin.forms carousel zooming


【解决方案1】:

好的,所以 First Thing first Carousel View 不是你想要缩放的东西(对于实际案例) 并且根据客户对 Galaxy 事物的要求,您可以通过一些逻辑来解决问题

第一种方式:

在您的共享 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;
  }
}

现在在轮播视图中的 Xaml 中使用这样的图像

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

别忘了在 Xamal 中添加命名空间

xmlns:local="clr-namespace:YOUR_APP_NAME"

这就是图像可以缩放的方式

或者第二种方式是

在轮播视图上添加一个点击的项目并在命令参数中传递图片源并打开一个包含该图片的新页面并在其中应用缩放

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

希望这会有所帮助:)

【讨论】:

  • 这里我有一个问题,我正在使用轮播视图来显示许多图像,当我放大一个图像之后刷另一个图像(背景图像显示),请给我解决这个问题的解决方案问题
  • 我想在轮播视图中位置变化时缩小。我正在创建一个类名 ZoomImage。像 这样的视图单元内的示例。你有什么想法吗?我仍然面临问题
【解决方案2】:

这可以通过使用来实现

alexrainman/CarouselView 用于轮播视图。 https://github.com/alexrainman/CarouselView

并根据表单示例将 Xamarin 表单捏合手势识别器添加到轮播视图中使用的图像中

https://docs.microsoft.com/en-us/xamarin/xamarin-forms/app-fundamentals/gestures/pinch

【讨论】:

    猜你喜欢
    • 2022-01-08
    • 1970-01-01
    • 1970-01-01
    • 2016-07-14
    • 1970-01-01
    • 2018-08-31
    • 2015-10-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多