달력

4

« 2024/4 »

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
질문자 : 와루모노(warumono5001)  링크 : http://cafe.naver.com/winmodev/1225
<질문내용>

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 는 무시한 상태로 이동하게 됩니다.

<답변내용>

안녕하세요 루나네스 입니다
정신줄 살짝 놓았다가 다시 잡고 덧글 달아주신 것 까지 보니
어떤 문제인지 알겠네요 ^^;;;

physicsEngine 에는 ItemSize를 설정해 줘야
physicsEngine이 동작하는 동안 움직이는 단위를 지정해 줄 수 있습니다
와루모노님께서 말씀하신 것처럼
화면을 3개로 나눠 사용하시려는 것 같은데요 (옴2 터치위즈 UI처럼요)

한 화면단위로 이동할 것 이기 때문에

physicsEngine1.ItemSize = new Size(this.Width, this.Height);
Load나 Resize에서 한번만 해주시면 됩니다

그럼 문제가 생기는 Scroll 부분은...

physicsEngine 이 재미 있는 것이 e.Velocity 값이
미리 지정된 ItemSize의 크기보다 크다면 ItemSIze를 무시하고 넘어가버리는 문제가 생깁니다

physicsEngine1.Velocity = e.Velocity;
을 삭제 하셨다 하셨는데

이때 움직임이 발생하는 것은 Pan 이벤트 때문에 움직이는 것이고, Scroll 이벤트에서
physicsEngine의 velocity값이 0이기 때문에 모션 효과는 없습니다 (움직이지 않지요)

그래서
왼쪽에서 오른쪽으로 터치 스크롤을 하면 왼쪽으로 화면이동이 정상적으로 됩니다.

하지만 오른쪽에서 왼쪽으로 터치 스크롤을 하면 에러가 발생하지는 않으나 현 화면으로 맞추려 자신의 화면으로 자동 이동되는 현상이 발생합니다.
라는 문제가 발생된 것 이구요

해결방법은 무엇이냐..

Scroll 이벤트의 Velocity값을 잘 적용해 줘야 하는데

physicsEngine1.Velocity = e.Velocity > this.Width ? this.Width : e.Velocity;
이렇게 넣어 줄 수 도 있겠네요

그런데 이렇게 넣어주면.. 대부분 최대값인 this.Width 값으로 적용되어서
느릿느릿 움직이는 것을 볼 수 있는데요 (손맛이 없어요)

저는 이렇게 해결했습니다
physicsEngine1.Velocity = e.Velocity / this.Width;

위의 두 라인을 넣어서 각각 움직임을 비교해보세요 ^^

 작성일 : 2010.02.09

보다 자세한 정보는 윈도우 폰/모바일 개발자 모임에서 만나보실 수 있습니다
:
Posted by Lunaness