CODEKILLER

반응형

▶ 터치를 계속 하고 있다는 (=HOLD) 것을 체크하기 위한 Behavior 내의 함수들입니다.

 

타이머와 Position의 이동으로 유무를 이용하여 HOLD가 발생한지 체크할 수 있습니다.

public class TouchHoldBehavior : Behavior<FrameworkElement>
{
        private List<Point> pointList;
        private bool btouchdown = false;
        private static readonly int tabcount = 1;
        
        ...
        ...
        
        // Touch Down 시에 타이머를 구동시키는 코드입니다.
        private void AssociatedObject_TouchDown(object sender, TouchEventArgs e)
        {
            // Touch Hold를 위해서 Timer 완료시, 저장포인트의 범위로 FireHold를 할지말지 결정.
            if (_HoldTimer == null)
            {
                _HoldTimer = new DispatcherTimer();
                _HoldTimer.Interval = TimeSpan.FromSeconds(DefaultInterval);
                _HoldTimer.Tick += new EventHandler(TimerCallback);
                _HoldTimer.Start();
            }

            Point pt = e.GetTouchPoint(AssociatedObject).Position;
            pointList = new List<Point>();
            pointList.Add(pt);
            btouchdown = true;
        }
        
        // Touch Move 시에 터치포인트의 위치를 저장하는 코드입니다.
        private void AssociatedObject_TouchMove(object sender, TouchEventArgs e)
        {
            if (btouchdown == true)
            {
                Point pt = e.GetTouchPoint(AssociatedObject).Position;
                if (pointList != null)
                    pointList.Add(pt);
            }
        }
        
        // TouchUp시에 타이머를 종료하고, 저장한 포인트리스트를 Clear합니다.
        private void AssociatedObject_TouchUp(object sender, TouchEventArgs e)
        {
            if (btouchdown == true)
            {
                btouchdown = false;
                if (_HoldTimer != null)
                {
                    _HoldTimer.Stop();
                    _HoldTimer = null;
                }
                pointList.Clear();
                pointList = null;
            }
        }    
        
        // 타이머 구동 콜백함수
        private void TimerCallback(object sender, EventArgs e)
        {
            Rect bd;

            // Timer를 종료합니다. 
            _HoldTimer.Tick -= new EventHandler(TimerCallback);
            _HoldTimer.Stop();
            _HoldTimer = null;

            // 저장한 Point List를 이용하여 범위처리.
            foreach (Point p in pointList)
            {
                StylusPoint sp = new StylusPoint(p.X, p.Y);
                stpoint.Add(sp);
                Stroke sd = new Stroke(stpoint);
                Strokes.Add(sd);
            }

			// 특정범위 밖으로 벗어나지 않고 있다면 TOUCH HOLD 되고 있는 것으로 간주함
            bd = Strokes.GetBounds();
            if ((bd.Height < limitbound) 
            	&& (bd.Width < limitbound) 
                && pointList.Count != tabcount)
            {
                // HOLD Delegate 이벤트발생시켜 주도록 한다.
                TouchHoldDelegateMethod(args);
            }
            else
            {
                // 이쪽으로 들어오는 것은 Drag 입니다.
            }
            Strokes.Clear();
            pointList.Clear();
        }   
        
        ...
        ...
}

 

 

반응형

공유하기

facebook twitter kakaoTalk kakaostory naver band