fix(ImagePreviewer): 修复连续旋转时角度倒转与来回摆动

This commit is contained in:
chinboy
2026-10-21 17:56:06 +08:00
parent bd7e05c73c
commit 4232ce579e
2 changed files with 15 additions and 2 deletions
@@ -2,6 +2,10 @@
本文档记录 ImagePreviewer 控件级设计、API、主题契约、Token 和实现结构的变化。它不替代仓库根目录 `CHANGELOG.md`,也不作为正式版本发布说明。
## 2026-10-21
- 修复快速连续点击旋转时图片角度倒转、来回摆动的问题:`Scale=1` 时不再向 `RenderTransform` 写入无意义的 Scale 操作,避免 Avalonia 的 TransformOperations 插值在动画重定向后退化为矩阵分解并归一化旋转角。
## 2026-10-17
- 新增 `IsWheelZoomEnabled=true`,只控制滚轮;统一滚轮刻度、指针锚点、拖拽平移、双击与捏合缩放,运行时缩放范围变化立即钳制比例和刷新按钮。
@@ -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();
}