<질문내용>
WM6.5 에서 Gestures 기능을 사용하여 화면을 구성하고자 하는데,
가로 터치 스크롤링을 하는데 있어서 어려운 점이 있어 질문합니다.
아래 관련소스/참고자료 는 기존의 샘플코드에서 아주약간의 코드 추가를 한 자료입니다.
화면구성은 다음과 같습니다.
========================================================================================================
gestureRecognizer1.TagetControl = panel1
physicsEngine1.ExtentControl = panel1
physicsEngine1.ViewportControl = Form1
* panel1을 바탕으로 panel2(왼쪽화면), panel3(가운데화면), panel4(오른쪽화면) 를 Add 하여 3개의 화면으로 구성
========================================================================================================
중요한 부분은 관련소스에서 파란색으로 표현한 부분입니다.
각 세줄의 코드를 1, 2, 3 으로 지칭하겠습니다.
========================================================================================================
1 : physicsEngine1.Velocity = e.Velocity;
2 : physicsEngine1.ItemSize = new Size(this.Width, this.Height);
3 : physicsEngine1.ItemSize = new Size(this.Width, this.Height);
========================================================================================================
2만을 삭제하고 디버깅을 하면 panel2, panel3, panel4 화면이 좌우 터치 스크롤 속도에 따라 자유이동합니다.
그리고, 3에 의해서 터치 스크롤 속도(e.Velocity) 가 강하지 않으면 각 panel의 크기에 맞추어 지도록 되어있습니다.
문제는 여기서 입니다.
1번을 삭제하고, 2번과 3번만을 추가한 코드에서 왼쪽에서 오른쪽으로 터치 스크롤을 하면 왼쪽으로 화면이동이 정상적으로 됩니다.
하지만 오른쪽에서 왼쪽으로 터치 스크롤을 하면 에러가 발생하지는 않으나 현 화면으로 맞추려 자신의 화면으로 자동 이동되는 현상이 발생합니다.
즉, 현재 화면이 panel3(가운데화면) 인 상태에서 panel4(오른쪽화면)으로 이동은 정상적으로 이루어지나,
panel3(가운데화면) 인 상태에서 panel2(왼쪽화면)으로 이동하고자 하면 터치 스크롤하여 Pan 한 상태가 이동되다가 다시 panel3(가운데화면)으로 자동으로 돌아오는 현상이 발생합니다.
글로서 설명을 하자니 이해가 가지 않을 것이라 생각합니다.
혹시, WM6.5 Gestures 를 사용하시는 개발자 분들께 아래 코드를 참고하여 질문의 요지를 파악해주시면 고맙겠습니다.
관련소스/참고자료
using System;
using System.Linq;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using Microsoft.WindowsMobile.Gestures;
namespace TouchScrollingTest003
{
public partial class Form1 : Form
{
private Point last;
private Point offset;
private Point delta;
public Form1()
{
InitializeComponent();
}
private void gestureRecognizer1_Pan(object sender, Microsoft.WindowsMobile.Gestures.GestureEventArgs e)
{
if ((e.State & GestureState.Begin) == GestureState.Begin)
{
physicsEngine1.Stop();
last = e.Location;
offset = panel1.Location.Negate();
return;
}
delta = e.Location.Subtract(last);
delta.Y = 0;
offset = offset.Subtract(delta);
offset.X = offset.X < 0 ? 0 : offset.X;
offset.X = (offset.X > panel1.Width - this.Width) ? panel1.Width - this.Width : offset.X;
panel1.Location = offset.Negate();
last = e.Location;
}
private void gestureRecognizer1_Scroll(object sender, GestureScrollEventArgs e)
{
physicsEngine1.Stop();
physicsEngine1.Angle = e.Angle;
physicsEngine1.Velocity = e.Velocity;
physicsEngine1.ItemSize = new Size(this.Width, this.Height);
physicsEngine1.Start();
}
private void Form1_Resize(object sender, EventArgs e)
{
if (!physicsEngine1.IsAnimating)
{
physicsEngine1.ItemSize = new Size(this.Width, this.Height);
}
}
}
}
<추가질문>
physicsEngine 이 ItemSize 에 맞추어 Velocity 와 관계없이 이동합니다.
만약 private void gestureRecognizer1_Scroll(object sender, GestureScrollEventArgs e)
함수에 e.Velocity 값을 할당하게 되면 ItemSize 는 무시한 상태로 이동하게 됩니다.
|