缩放图片怎么限定一个最小与最大尺寸? 还有怎样防止不飞出边界?

sosoben 2017-04-21 04:33:49

我有一个WPF image控件,已经实现了双指缩放选择,单指移动等功能了。

但想问问缩放图片怎么限定一个最小与最大尺寸? 还有怎样防止不飞出边界?


private void img_ManipulationDelta(object sender, ManipulationDeltaEventArgs e)
{
FrameworkElement element = (FrameworkElement)e.Source;
element.Opacity = 0.5;

//Matrix matrix = ((MatrixTransform)element.RenderTransform).Matrix;
Matrix matrix = ((MatrixTransform)Matrix1 ).Matrix;
var deltaManipulation = e.DeltaManipulation;

Point center = new Point(element.ActualWidth / 2, element.ActualHeight / 2);


center = matrix.Transform(center);

matrix.ScaleAt(deltaManipulation.Scale.X, deltaManipulation.Scale.Y, center.X, center.Y);

matrix.RotateAt(e.DeltaManipulation.Rotation, center.X, center.Y);

matrix.Translate(e.DeltaManipulation.Translation.X, e.DeltaManipulation.Translation.Y);

//以下为飞出边界则停止惯性,但实际测试不太生效,还是会飞出窗口,不见了
Rect containingRect = new Rect(((FrameworkElement)e.ManipulationContainer).RenderSize);
Rect shapeBounds = element.RenderTransform.TransformBounds(new Rect(element.RenderSize));



if (e.IsInertial && !containingRect.Contains(shapeBounds))
{

e.ReportBoundaryFeedback(e.DeltaManipulation);

e.Complete();

}



((MatrixTransform)Matrix1).Matrix = matrix;
}
...全文
2807 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
weixin_34267702 2018-06-26
  • 打赏
  • 举报
回复
引用 8 楼 sosoben 的回复:
[quote=引用 7 楼 weixin_34267702 的回复:]
为什么要停止惯性,这个其实就是边界max的问题 最值设置之后就不会飞出去了


有具体代码吗?上面几个答主的有些不生效,所以我才怀疑是惯性问题。[/quote]

哥们我才看到这问题。。。 尴尬中。。。 具体的代码我还真没有 这个其实就是最大值的问题,要给定最值它才不会出去
sosoben 2017-07-03
  • 打赏
  • 举报
回复
引用 7 楼 weixin_34267702 的回复:
为什么要停止惯性,这个其实就是边界max的问题 最值设置之后就不会飞出去了
有具体代码吗?上面几个答主的有些不生效,所以我才怀疑是惯性问题。
weixin_34267702 2017-05-17
  • 打赏
  • 举报
回复
为什么要停止惯性,这个其实就是边界max的问题 最值设置之后就不会飞出去了
sosoben 2017-04-21
  • 打赏
  • 举报
回复
引用 5 楼 duanzi_peng 的回复:
[quote=引用 3 楼 sosoben 的回复:] [quote=引用 1 楼 duanzi_peng 的回复:] 将图片的maxWidth与maxHeight 设置为父容器的ActualWidth,ActualHeight,类似:

  <Border x:Name="border" Width="350" Height="350" BorderBrush="Red" BorderThickness="1">
        <Image x:Name="img" Source="xxx.png" MaxWidth="{Binding ActualWidth,ElementName=border}">
               <Image.LayoutTransform>
                   <ScaleTransform ScaleX="{Binding xx}"  ScaleY="{Binding xx}"></ScaleTransform>
                </Image.LayoutTransform>
         </Image>
         </Border>
这个可以运算的吗? 例如 ActualWidth * 2 之类的[/quote] 可以,写个WPF Converter转换类;[/quote] 不行啊,MinWidth="400" 我设成常数都试过了,还是可以缩得很小很小。
exception92 2017-04-21
  • 打赏
  • 举报
回复
引用 3 楼 sosoben 的回复:
[quote=引用 1 楼 duanzi_peng 的回复:] 将图片的maxWidth与maxHeight 设置为父容器的ActualWidth,ActualHeight,类似:

  <Border x:Name="border" Width="350" Height="350" BorderBrush="Red" BorderThickness="1">
        <Image x:Name="img" Source="xxx.png" MaxWidth="{Binding ActualWidth,ElementName=border}">
               <Image.LayoutTransform>
                   <ScaleTransform ScaleX="{Binding xx}"  ScaleY="{Binding xx}"></ScaleTransform>
                </Image.LayoutTransform>
         </Image>
         </Border>
这个可以运算的吗? 例如 ActualWidth * 2 之类的[/quote] 可以,写个WPF Converter转换类;
sosoben 2017-04-21
  • 打赏
  • 举报
回复
引用 2 楼 Libby1984 的回复:
给你一个简单思路: 在对matrix进行放大或者缩小之前,先计算出放大后需要的宽度和高度,如果宽度或者高度大于最大的值,则按照最大高度和宽度重新计算放大系数,将新算的结果作为matrix放大的倍数。最小的同样。 防止出边界:在Translate之前,计算移动后的坐标(x,y),如果x或者y小于零不允许移动,设置偏移的水平或者垂直量为0,这样就不会抛出上边界和左边界。如果x+宽度>右边界,则不允许移动;如果y+高度>下边界,则不允许移动。
而事实上,我是不会单独获取放大后或移动后的值,自己用矩阵乘法算吗??还是有更好的办法?
sosoben 2017-04-21
  • 打赏
  • 举报
回复
引用 1 楼 duanzi_peng 的回复:
将图片的maxWidth与maxHeight 设置为父容器的ActualWidth,ActualHeight,类似:

  <Border x:Name="border" Width="350" Height="350" BorderBrush="Red" BorderThickness="1">
        <Image x:Name="img" Source="xxx.png" MaxWidth="{Binding ActualWidth,ElementName=border}">
               <Image.LayoutTransform>
                   <ScaleTransform ScaleX="{Binding xx}"  ScaleY="{Binding xx}"></ScaleTransform>
                </Image.LayoutTransform>
         </Image>
         </Border>
这个可以运算的吗? 例如 ActualWidth * 2 之类的
  • 打赏
  • 举报
回复
给你一个简单思路: 在对matrix进行放大或者缩小之前,先计算出放大后需要的宽度和高度,如果宽度或者高度大于最大的值,则按照最大高度和宽度重新计算放大系数,将新算的结果作为matrix放大的倍数。最小的同样。 防止出边界:在Translate之前,计算移动后的坐标(x,y),如果x或者y小于零不允许移动,设置偏移的水平或者垂直量为0,这样就不会抛出上边界和左边界。如果x+宽度>右边界,则不允许移动;如果y+高度>下边界,则不允许移动。
exception92 2017-04-21
  • 打赏
  • 举报
回复
将图片的maxWidth与maxHeight 设置为父容器的ActualWidth,ActualHeight,类似:

  <Border x:Name="border" Width="350" Height="350" BorderBrush="Red" BorderThickness="1">
        <Image x:Name="img" Source="xxx.png" MaxWidth="{Binding ActualWidth,ElementName=border}">
               <Image.LayoutTransform>
                   <ScaleTransform ScaleX="{Binding xx}"  ScaleY="{Binding xx}"></ScaleTransform>
                </Image.LayoutTransform>
         </Image>
         </Border>

7,655

社区成员

发帖
与我相关
我的任务
社区描述
Windows Phone是微软发布的一款手机操作系统,它将微软旗下的Xbox LIVE游戏、Zune音乐与独特的视频体验整合至手机中。
社区管理员
  • Windows客户端开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧