Update()が鍵です!
まずはUpdate()メソッドです。
// 更新 public void Update() { // 全オブジェクトを更新 for( int objIndex = 0; objIndex < m_ObjVec.size(); ++objIndex ) { m_ObjVec.get( objIndex ).Update(); } final int actionNum = m_Watcher.GetActionNum(); for( int index = 0; index < actionNum; ++index ) { final PointF pos = m_Watcher.GetPosition( index ); TouchEventObject actionObj = _GetActionObject( pos ); if(( m_LastActionObj != null ) && ( m_LastActionObj != actionObj )) { // オブジェクトが変わっていたら出て行った通知を送る final Rect objRect = m_LastActionObj.GetRect(); final PointF localPos = new PointF( pos.x - objRect.left, pos.y - objRect.top ); m_LastActionObj.OnTouchOut( localPos ); m_LastActionObj = actionObj; } if( actionObj == null ) continue; // オブジェクトにイベント送信 { // ローカル位置取得 final Rect objRect = actionObj.GetRect(); final PointF localPos = new PointF( pos.x - objRect.left, pos.y - objRect.top ); switch( m_Watcher.GetAction( index )) { case ACTION_DOWN: actionObj.OnTouchDown( localPos ); m_LastActionObj = actionObj; break; case ACTION_UP: actionObj.OnTouchUp( localPos ); m_LastActionObj = null; break; case ACTION_MOVE: actionObj.OnTouchMove( localPos ); m_LastActionObj = actionObj; break; } } } m_Watcher.DeleteAction( actionNum ); }
まず最初に全TouchEventObjectを更新します。
この時に入力情報のクリアなどを行います。
が、Managerではそこは気にしなくていいです。
次にTouchWatcherからタッチ情報をもらいます。
_GetActionObject()は位置からタッチされたTouchEventObjectを取得するメソッドです。
次はタッチ対象のTouchEventObjectが変わっていた時の処理です。
これがないとずっと押されているとTouchEventObjectが勘違いしていしまいます。
最後にTouchEventObjectにイベントを送信します。
アクションの種類に応じて呼び出すメソッドを変えます。
では、さらっと出てきた_GetActionObject()メソッドを見てみましょう。
// アクションを起こしたオブジェクト取得 private TouchEventObject _GetActionObject( final PointF pos ) { for( int objIndex = m_ObjVec.size() - 1; objIndex >= 0; --objIndex ) { TouchEventObject obj = m_ObjVec.get( objIndex ); if( !obj.IsEnable()) continue; final Rect objRect = obj.GetRect(); if(( objRect.left <= pos.x ) && ( objRect.top <= pos.y ) && ( objRect.right >= pos.x ) && ( objRect.bottom >= pos.y )) { return obj; } } return null; }
位置情報がTouchEventObjectに入っているかどうかで通知を送るべきオブジェクトを探しています。
特に難しいことはないですね。。。
では、残りのメソッドを実装してみましょう。
// オブジェクト追加 public void AddObject( TouchEventObject obj ) { m_ObjVec.add( obj ); } // 削除 public void Delete() { m_ObjVec.clear(); }
TouchEventObjectの追加と削除です。
特に問題無いですね。