[深入浅出WP8.1(Runtime)]应用实例——移动截图
10.2应用实例——移动截图
移动截图例子是实现一个把一张图片的某个部分截取出来的功能,并且用户可以选定截取的图片区间。那个该例子会使用ManipulationDelta事件来实现对截取区间的选择。然后使用UIElement元素的Clip属性对图片进行局部截取。
下面给出移动截图的示例:该示例主要有3个主要的逻辑分别是截图区域的选择、图片的局部截取和截图的展示。
代码清单10-3:移动截图(源代码:第10章\Examples_10_3)
MainPage.xaml文件主要代码:在UI上image1是图片的展示,image2是显示截取之后的图片,命名为LayoutRoot的Grid控件则是图片和截图区域的容器。
------------------------------------------------------------------------------------------------------------------
<ScrollViewer>
<StackPanel>
<Grid x:Name="LayoutRoot">
<Image Source="/test.jpg" Height="460" Width="300" Name="image1"/>
</Grid>
<Button Content="剪切" x:Name="button"></Button>
<Image Name="image2" />
</StackPanel>
</ScrollViewer>
10.2.1 截图区域的选择
截图区域的选择是指要动画手指滑动的方式来控制截图的位置和大小,那么在该例子里面实现的逻辑是以照片的中心为截图区域的中心,然后用户可以通过滑动来改变这个截图矩形的宽度和高度。那么我们实现的思路是,先要在图片上面添加一个矩形控件Rectangle,然后给这个Rectangle控件添加上ManipulationDelta事件,监控用户在截图矩形上面的滑动情况,在ManipulationDelta事件的处理程序上调整Rectangle控件的大小。代码如下所示:
MainPage.xaml.cs文件部分代码:截图区域的选择。
------------------------------------------------------------------------------------------------------------------
public MainPage()
{
this.InitializeComponent();
button.Click += button_Click;
// 设置图片上方的截图区域
SetPicture();
}
// 添加图片的截图区域
void SetPicture()
{
// 创建一个Rectangle控件
Rectangle rect = new Rectangle();
rect.Opacity = 0.5;
rect.Fill = new SolidColorBrush(Colors.White);
rect.Height = image1.Height;
rect.Width = image1.Width;
rect.Stroke = new SolidColorBrush(Colors.Red);
rect.StrokeThickness = ;
rect.Margin = image1.Margin;
// 添加触摸滑动过程的事件监控
rect.ManipulationMode = ManipulationModes.All;
rect.ManipulationDelta += rect_ManipulationDelta;
// 把Rectangle控件添加到LayoutRoot上,这时候该控件会出现在图片的上方
LayoutRoot.Children.Add(rect);
LayoutRoot.Height = image1.Height;
LayoutRoot.Width = image1.Width;
}
// 利用手指滑动来改变截图框的位置和大小
void rect_ManipulationDelta(object sender, ManipulationDeltaRoutedEventArgs e)
{
// 获取事件的发送方,也就是截图区域Rectangle控件
Rectangle croppingRectangle = (Rectangle)sender;
// 通过手指的位移来更改Rectangle控件的宽度和高度
// 往右滑动宽度减少(X为正),往左滑动宽度增加(X为负)
if (croppingRectangle.Width >= (int)e.Delta.Translation.X)
croppingRectangle.Width -= (int)e.Delta.Translation.X;
// 往下滑动高度减少(X为正),往上滑动高度增加(X为负)
if (croppingRectangle.Height >= (int)e.Delta.Translation.Y)
croppingRectangle.Height -= (int)e.Delta.Translation.Y;
}
10.2.2 图片的局部截取
在截图区域已经定位好之后,接下来的这一步就是需要根据截图区域的位置来把图片截取出来,那么在这一步里面最主要的逻辑是把Rectangle控件的位置大小信息转化为image1图片里面的相对位置的区域信息,然后再通过Clip属性来进行截取。代码如下所示:
MainPage.xaml.cs文件部分代码:图片的局部截取。
------------------------------------------------------------------------------------------------------------------
// 截取图片的区域
void ClipImage()
{
// 创建一个矩形的几何图形,用于赋值给Clip属性,注意:做为属性使用的几何图形必须是*Geometry类型的图形
RectangleGeometry geo = new RectangleGeometry();
// 获取截图的矩形控件,通过Grid容器向下查找
Rectangle r = (Rectangle)(from c in LayoutRoot.Children where c.Opacity == 0.5 select c).First();
// 把截图的矩形控件的位置信息转换成为相对于Grid容器的位置信息
GeneralTransform gt = r.TransformToVisual(LayoutRoot);
// 获取截图区域左上角的坐标,意思是原来r的左上角坐标(0, 0)在LayoutRoot上的坐标的转换
Point p = gt.TransformPoint(new Point(, ));
// 创建相对于LayoutRoot上的截图区域
geo.Rect = new Rect(p.X, p.Y, r.Width, r.Height);
image1.Clip = geo;
// 把截图控件隐藏起来
r.Visibility = Windows.UI.Xaml.Visibility.Collapsed;
}
10.2.3 截图的展示
截图展示是指把最终截取的图片展示出来,通过Clip属性把图片截取出来之后,实际上并不是把图片给剪切了,它仅仅只是把其他区域的部分给挡住了而已,那么要把真是的截图区域获取出来,可以使用RenderTargetBitmap类来实现。RenderTargetBitmap类可以把将 UI元素对象转换为位图。代码如下所示:
MainPage.xaml.cs文件部分代码:截图的展示。
------------------------------------------------------------------------------------------------------------------
//剪切按钮事件
async void button_Click(object sender, RoutedEventArgs e)
{
// 调用ClipImage方法,实现图片的局部截取
ClipImage();
// 创建一个RenderTargetBitmap对象,并调用RenderAsync方法把UI元素LayoutRoot转化成为RenderTargetBitmap对象
var bitmap = new RenderTargetBitmap();
await bitmap.RenderAsync(LayoutRoot);
// 由于RenderTargetBitmap类本来就是从ImageSource类派生的,所以可以直接复制给图片控件进行显示
image2.Source = bitmap;
}

本文来源于《深入浅出Windows Phone 8.1 应用开发》
WP8.1 Runtime文章列表:http://www.cnblogs.com/linzheng/p/3998037.html
源代码下载:http://vdisk.weibo.com/s/zt_pyrfNHb99O
欢迎关注我的微博@WP林政 微信公众号:wp开发(号:wpkaifa)
WP8.1技术交流群:372552293
[深入浅出WP8.1(Runtime)]应用实例——移动截图的更多相关文章
- [深入浅出WP8.1(Runtime)]生成图片和存储生成的图片文件
7.2.3 使用RenderTargetBitmap类生成图片 RenderTargetBitmap类可以将可视化对象转换为位图,也就是说它可以将任意的UIElement以位图的形式呈现.那么我们在实 ...
- [深入浅出WP8.1(Runtime)]数据绑定的基础
11.1 数据绑定的基础 数据绑定是一种XAML界面和后台数据通信的方式,因为界面和后台数据的通信的场景有多种,并且数据于数据之间也存在着不一样的关联关系,所以数据绑定的实现技巧和方式也是多种多样的. ...
- [深入浅出WP8.1(Runtime)]Toast通知
9.1 Toast通知 Toast通知是在屏幕最顶上弹出来的临时通知,是Windows Phone通用的弹出式短暂的通知,默认的系统消息都是采用Toast通知的形式,比如当你手机收到短信的时候,在手机 ...
- [深入浅出WP8.1(Runtime)]Windows Phone 8.1和Silverlight 8.1的区别
1.2.2 Windows Phone 8.1应用程序模型 Windows Phone 8.1支持多种开发语言来开发应用程序,包括C#.VB.JavaScript和C++,那么本书的代码主要是采用C# ...
- [深入浅出WP8.1(Runtime)]Socket编程之UDP协议
13.3 Socket编程之UDP协议 UDP协议和TCP协议都是Socket编程的协议,但是与TCP协议不同,UDP协议并不提供超时重传,出错重传等功能,也就是说其是不可靠的协议.UDP适用于一次只 ...
- [深入浅出WP8.1(Runtime)]网络编程之HttpClient类
12.2 网络编程之HttpClient类 除了可以使用HttpWebRequest类来实现HTTP网络请求之外,我们还可以使用HttpClient类来实现.对于基本的请求操作,HttpClient类 ...
- [深入浅出WP8.1(Runtime)]应用文件的URI方案
6.2.4 应用文件的URI方案 在上文我们获取文件的方式都是通过应用程序的三个跟目录的文件夹对象来获取文件夹对象和文件对象,那么我们这一小节来讲解一种新的获取文件对象的方式,这种方式就是通过Uri地 ...
- [深入浅出WP8.1(Runtime)]浮出控件(Flyout)
4.15 浮出控件(Flyout) 浮出控件(Flyout)是一个轻型的辅助型的弹出控件,通常会作为提示或者要求用户进行相关的交互来使用.Flyout控件与Windows Phone里面的弹出框Mes ...
- [深入浅出WP8.1(Runtime)]文本框(TextBox)
4.4 文本框(TextBox) 文本框(TextBox)控件是表示一个可用于显示和编辑单格式.多行文本的控件.TextBox控件常用于在表单中编辑非格式化文本,例如,如果一个表单要求输入用户姓名.电 ...
随机推荐
- 【译】DotNet 5.4或者说 .NET平台标准
原文:DotNet 5.4 or .NET Platform Standards 是的,你看到的确实是"DotNet 5.4".使用Visual Studio 2015 RC1 u ...
- [LeetCode] Implement strStr()
Implement strStr(). Returns a pointer to the first occurrence of needle in haystack, or null if need ...
- 在WPF中使用CefSharp嵌入浏览器
日常开发中,我们需要将一些Web页面嵌入到桌面客户端软件中.下面我们使用CefSharp嵌入浏览器来实现. 首先先介绍一下CefSharp嵌入式浏览器,它是基于Google浏览器的一个组件,我们可以在 ...
- ASP.NET 5中的ASP.NET Bundles跑到哪里去了?
(此文章同时发表在本人微信公众号"dotNET每日精华文章",欢迎右边二维码来关注.) 众所周知,在ASP.NET MVC中很早就存在一个所谓的"bundling and ...
- 第二十四篇:导出SOUI对象到LUA脚本
LUA是一种体积小,速度快的脚本语言.脚本语言虽然性能上和C++这样的Naitive语言相比差一点,但是开发速度快,可以方便的更新代码等,近年来受到了越来越多开发者的重视. 在SOUI框架中,我把脚本 ...
- 【java基础】面向过程~面向对象
相信大家都知道这两个东西,可是大家是如何知道的呢?我们又该如何区分这个东西到底是面向过程还是面向对象的呢? 那,我们首先就要知道什么是面向过程,什么是面向对象: 面向过程"(Procedur ...
- jQuery事件和JavaScript事件
1.JavaScript事件: 属性 当以下情况发生时,出现此事件 FF N IE onabort 图像加载被中断 1 3 4 onblur 元素失去焦点 1 2 3 onchange 用户改变域的内 ...
- poj3186 Treats for the Cows(区间)
题目链接:http://poj.org/problem?id=3186 题意:第一个数是N,接下来N个数,每次只能从队列的首或者尾取出元素. ans=每次取出的值*出列的序号.求ans的最大值. 样例 ...
- 移动网页 -- CSS布局
1.多栏结构 column-count column-width column:120px 3: column-gap:2em: column-rule:2px dotted gray: 跨越以及打断 ...
- 静态函数(面向过程的static关键字)
在函数的返回类型前加上static关键字,函数即被定义为静态函数.静态函数与普通函数不同,它只能在声明它的文件中可见,不能被其他文件使用. 静态函数的例子: #include <iostream ...