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)]应用实例——移动截图的更多相关文章

  1. [深入浅出WP8.1(Runtime)]生成图片和存储生成的图片文件

    7.2.3 使用RenderTargetBitmap类生成图片 RenderTargetBitmap类可以将可视化对象转换为位图,也就是说它可以将任意的UIElement以位图的形式呈现.那么我们在实 ...

  2. [深入浅出WP8.1(Runtime)]数据绑定的基础

    11.1 数据绑定的基础 数据绑定是一种XAML界面和后台数据通信的方式,因为界面和后台数据的通信的场景有多种,并且数据于数据之间也存在着不一样的关联关系,所以数据绑定的实现技巧和方式也是多种多样的. ...

  3. [深入浅出WP8.1(Runtime)]Toast通知

    9.1 Toast通知 Toast通知是在屏幕最顶上弹出来的临时通知,是Windows Phone通用的弹出式短暂的通知,默认的系统消息都是采用Toast通知的形式,比如当你手机收到短信的时候,在手机 ...

  4. [深入浅出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# ...

  5. [深入浅出WP8.1(Runtime)]Socket编程之UDP协议

    13.3 Socket编程之UDP协议 UDP协议和TCP协议都是Socket编程的协议,但是与TCP协议不同,UDP协议并不提供超时重传,出错重传等功能,也就是说其是不可靠的协议.UDP适用于一次只 ...

  6. [深入浅出WP8.1(Runtime)]网络编程之HttpClient类

    12.2 网络编程之HttpClient类 除了可以使用HttpWebRequest类来实现HTTP网络请求之外,我们还可以使用HttpClient类来实现.对于基本的请求操作,HttpClient类 ...

  7. [深入浅出WP8.1(Runtime)]应用文件的URI方案

    6.2.4 应用文件的URI方案 在上文我们获取文件的方式都是通过应用程序的三个跟目录的文件夹对象来获取文件夹对象和文件对象,那么我们这一小节来讲解一种新的获取文件对象的方式,这种方式就是通过Uri地 ...

  8. [深入浅出WP8.1(Runtime)]浮出控件(Flyout)

    4.15 浮出控件(Flyout) 浮出控件(Flyout)是一个轻型的辅助型的弹出控件,通常会作为提示或者要求用户进行相关的交互来使用.Flyout控件与Windows Phone里面的弹出框Mes ...

  9. [深入浅出WP8.1(Runtime)]文本框(TextBox)

    4.4 文本框(TextBox) 文本框(TextBox)控件是表示一个可用于显示和编辑单格式.多行文本的控件.TextBox控件常用于在表单中编辑非格式化文本,例如,如果一个表单要求输入用户姓名.电 ...

随机推荐

  1. 蛋疼的Fedora17

    在公司给同事要安装ASM oracle 11g,说要在forder17上安装,于是乎我先在自己的虚拟机上安装了一个forder17,遇到了几个很蛋疼的问题:      1. 安装的时候没有创建普通用户 ...

  2. Oracle 创建/删除 表空间、用户、授权

    首先以DBA连接到数据库:sqlplus / as sysdba; --创建表空间 create tablespace test_tablespace datafile 'D:\developer\o ...

  3. ASSM 的三级位图结构

    自动段空间管理(ASSM),它首次出现在Oracle920里(在920以前,段空间的管理方式叫做MSSM,它是由连接列表freelist来完成的,因为freelist存在串行的问题,因此容易引起段头的 ...

  4. BZOJ 1588: [HNOI2002]营业额统计 双向链表 / splay / treap

    1588: [HNOI2002]营业额统计 Description 营业额统计 Tiger最近被公司升任为营业部经理,他上任后接受公司交给的第一项任务便是统计并分析公司成立以来的营业情况. Tiger ...

  5. Codeforces Round #174 (Div. 1) B. Cow Program(dp + 记忆化)

    题目链接:http://codeforces.com/contest/283/problem/B 思路: dp[now][flag]表示现在在位置now,flag表示是接下来要做的步骤,然后根据题意记 ...

  6. CE搜索内存数据的原理

      最近发现有朋友在玩游戏时, 使用一款工具来修改游戏的部分数据,作弊的效果, 也就是CE(Cheat Engine),这款工具是 delphi 编写的, 于是好奇, 然后瞬间想到API OpenPr ...

  7. JQuery经典小例子——可编辑的表格

    可编辑的表格: 屏幕剪辑的捕获时间: 2015/8/14 9:16 HTML代码为: <!DOCTYPE html> <htmlxmlns="http://www.w3.o ...

  8. vs2015 MFC工程添加消息响应函数

    真不知道这PPT怎么描述的..最后窝找到了解决方法如上图.. 下次找MSDN解决问题好了..而且我们并不知道他所说的这个IDE到底是哪个厂商哪个版本的IDE这就很困惑 不过呢..它主要是让我们添加消息 ...

  9. Spark Streaming容错的改进和零数据丢失

    本文来自Spark Streaming项目带头人 Tathagata Das的博客文章,他现在就职于Databricks公司.过去曾在UC Berkeley的AMPLab实验室进行大数据和Spark  ...

  10. Android 蹲坑的疑难杂症集锦一

    各位看官老爷子你们好,我就是那个挖坑不埋,还喜欢开新矿的小喵同志. 问大家一个问题,在Github上找项目的时候,看到中文简介说明你们是不是觉得这个项目很low不屑一顾? 最近朋友无意中说,在Gith ...