Multi-Touch 多点触屏 时,如何滑动图片显示下一张图片
我想在触摸屏上, 实现类似手机上的图片浏览。使用了,Multi-Touch的 ManipulationStarting、ManipulationDelta、ManipulationInertiaStarting 事件
想要做到,控制缩放比例,最小1,最大2,当缩放到最小1时,滑动图片显示下一张图片。
我使用了这样来控制缩放比例,不知道对不对?
if ((matrixTmp.M11 < 2) && (matrixTmp.M11 > 1))
{
matrix.ScaleAt(deltaManipulation.Scale.X, deltaManipulation.Scale.Y, center.X, center.Y);
}
滑动图片显示下一张图片,该如何实现?
在滑动时,会多次触发ManipulationDelta事件,在什么时机显示下一张图片呢??
代码
xaml------------------------------------
<Page x:Class="Images.Page2"
xmlns="“
xmlns:x=""
xmlns:mc=""
xmlns:d=""
mc:Ignorable="d"
d:DesignHeight="300" d:DesignWidth="300" Loaded="Page_Loaded_1"
Title="Page2">
cs: -------------------------------------------------------------
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.IO;
using System.Collections;
using System.Windows.Media.Effects;
namespace Images
{
/// <summary>
/// Page2.xaml 的交互逻辑
/// </summary>
public partial class Page2 : Page
{
public int i = 0;
public string str = "";
bool state = false;
public Point currentPosition;
public int ncanvasImageW = 1000;
public int nCurrID = 0;
ArrayList newArrayList = new ArrayList();
Image canvasImage = new Image();
string gPath = "D:\\我的图片";
public Page2()
{
InitializeComponent();
}
private void Page_Loaded_1(object sender, RoutedEventArgs e)
{
DirectoryInfo Dir = new DirectoryInfo(gPath);
foreach (FileInfo file in Dir.GetFiles("*.jpg").OrderBy(f => f.Name))
{
str = file.ToString();
newArrayList.Add(str);
}
nCurrID = 0;
lstSel();
}
private void canvas_ManipulationDelta(object sender, ManipulationDeltaEventArgs e)
{
FrameworkElement element = (FrameworkElement)e.Source;
Matrix matrix = ((MatrixTransform)element.RenderTransform).Matrix;
//临时检测放大比例
Matrix matrixTmp = ((MatrixTransform)element.RenderTransform).Matrix;
ManipulationDelta deltaManipulation = e.DeltaManipulation;
Point center = new Point(element.ActualWidth / 2, element.ActualHeight / 2);
center = matrix.Transform(center);
matrixTmp.ScaleAt(deltaManipulation.Scale.X, deltaManipulation.Scale.Y, center.X, center.Y);
//控制缩放比例在 1~ 2 之间
Console.WriteLine("matrixTmp.M11 " + matrixTmp.M11);
if ((matrixTmp.M11 < 2) && (matrixTmp.M11 > 1))
{
matrix.ScaleAt(deltaManipulation.Scale.X, deltaManipulation.Scale.Y, center.X, center.Y);
}
matrix.Translate(e.DeltaManipulation.Translation.X, e.DeltaManipulation.Translation.Y);
//matrix.RotateAt(e.DeltaManipulation.Rotation, center.X, center.Y); 不旋转
((MatrixTransform)element.RenderTransform).Matrix = matrix;
}
private void canvas_ManipulationStarting(object sender, ManipulationStartingEventArgs e)
{
e.ManipulationContainer = canvas;
e.Mode = ManipulationModes.All;
}
private void canvas_ManipulationInertiaStarting_1(object sender, ManipulationInertiaStartingEventArgs e)
{
e.TranslationBehavior.DesiredDeceleration = 0.0005;
}
private void lstSel()
{
if (nCurrID >= 0)
{
BitmapImage bitmapImage = new BitmapImage();
bitmapImage.BeginInit();
bitmapImage.UriSource = new Uri(gPath + "\\" + newArrayList[nCurrID].ToString());
bitmapImage.EndInit();
canvasImage.Source = bitmapImage;
canvasImage.Width = ncanvasImageW;
canvasImage.Height = ncanvasImageW;
canvasImage.IsManipulationEnabled = true;
canvasImage.RenderTransform = new MatrixTransform();
Canvas.SetTop(canvasImage, (this.ActualHeight - ncanvasImageW) / 2 - 50);
Canvas.SetLeft(canvasImage, (this.ActualWidth - ncanvasImageW) / 2);
if (!state)
{
canvas.Children.Add(canvasImage);
state = true;
}
}
}
}
}
WPF 多点触屏 --------------------编程问答-------------------- 触摸移动时,记录触摸起点与止点的,并移动长度确定是上移还是下移。
参考
private void gridMain_TouchDown(object sender, TouchEventArgs e)
{
FrameworkElement el = sender as FrameworkElement;
el.CaptureTouch(e.TouchDevice);
TouchPositionDown = e.GetTouchPoint(gridMain);
}
private void gridMain_TouchUp(object sender, TouchEventArgs e)
{
FrameworkElement el = sender as FrameworkElement;
el.CaptureTouch(e.TouchDevice);
TouchPositionUp = e.GetTouchPoint(gridMain);
double nMoveX = Math.Abs(TouchPositionUp.Position.X - TouchPositionDown.Position.X);
double nMoveY = Math.Abs(TouchPositionUp.Position.Y - TouchPositionDown.Position.Y);
if ((nMoveX > 50) && (TouchPositionUp.Position.X < TouchPositionDown.Position.X) && (this.gridNext.IsVisible))
{
nPage = nPage + 1;
load();
}
if ((nMoveX > 50) && (TouchPositionUp.Position.X > TouchPositionDown.Position.X) && (this.gridBefor.IsVisible))
{
nPage = nPage - 1;
load();
}
} --------------------编程问答-------------------- TouchPoint TouchPositionUp, TouchPositionDown;
补充:.NET技术 , .NET技术前瞻