From 4232ce579ed8589c2a34d09c72df1fab30f9a4fb Mon Sep 17 00:00:00 2001 From: chinboy Date: Wed, 21 Oct 2026 17:56:06 +0800 Subject: [PATCH] =?UTF-8?q?fix(ImagePreviewer):=20=E4=BF=AE=E5=A4=8D?= =?UTF-8?q?=E8=BF=9E=E7=BB=AD=E6=97=8B=E8=BD=AC=E6=97=B6=E8=A7=92=E5=BA=A6?= =?UTF-8?q?=E5=80=92=E8=BD=AC=E4=B8=8E=E6=9D=A5=E5=9B=9E=E6=91=86=E5=8A=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../data-display/image-previewer/changelog.md | 4 ++++ .../ImagePreviewer/ImageViewer.cs | 13 +++++++++++-- 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/docs/controls/desktop/data-display/image-previewer/changelog.md b/docs/controls/desktop/data-display/image-previewer/changelog.md index 5d9443c05..86b2d701e 100644 --- a/docs/controls/desktop/data-display/image-previewer/changelog.md +++ b/docs/controls/desktop/data-display/image-previewer/changelog.md @@ -2,6 +2,10 @@ 本文档记录 ImagePreviewer 控件级设计、API、主题契约、Token 和实现结构的变化。它不替代仓库根目录 `CHANGELOG.md`,也不作为正式版本发布说明。 +## 2026-10-21 + +- 修复快速连续点击旋转时图片角度倒转、来回摆动的问题:`Scale=1` 时不再向 `RenderTransform` 写入无意义的 Scale 操作,避免 Avalonia 的 TransformOperations 插值在动画重定向后退化为矩阵分解并归一化旋转角。 + ## 2026-10-17 - 新增 `IsWheelZoomEnabled=true`,只控制滚轮;统一滚轮刻度、指针锚点、拖拽平移、双击与捏合缩放,运行时缩放范围变化立即钳制比例和刷新按钮。 diff --git a/src/AtomUI.Desktop.Controls/ImagePreviewer/ImageViewer.cs b/src/AtomUI.Desktop.Controls/ImagePreviewer/ImageViewer.cs index 9a309724e..9e840c459 100644 --- a/src/AtomUI.Desktop.Controls/ImagePreviewer/ImageViewer.cs +++ b/src/AtomUI.Desktop.Controls/ImagePreviewer/ImageViewer.cs @@ -882,8 +882,17 @@ internal class ImageViewer : TemplatedControl, IMotionAwareControl private void GenerateImageRenderTransform() { - var builder = TransformOperations.CreateBuilder(2); - builder.AppendScale(ImageScaleX, ImageScaleY); + // Avalonia's TransformOperations interpolator rewrites a no-op scale operation + // to Identity during the animation. A retargeted transition then sees mismatched + // operation types, falls back to matrix decomposition and normalizes the + // rotation angle, which makes repeated rotate clicks spin backwards. + var hasScale = !MathUtils.AreClose(ImageScaleX, 1.0) || + !MathUtils.AreClose(ImageScaleY, 1.0); + var builder = TransformOperations.CreateBuilder(hasScale ? 2 : 1); + if (hasScale) + { + builder.AppendScale(ImageScaleX, ImageScaleY); + } builder.AppendRotate(ImageRotate); ImageRenderTransform = builder.Build(); }