2016-06-22 2 views
1

挨拶1とすべて、ストアMotionEvent値

MotionEventACTION_MOVEの中で私はX & Yを私のCustomViewに渡し、座標/形状のそれぞれに対して固有のID値を返すメソッドを呼び出します。

指をあるシェイプから別のシェイプにドラッグすると、期待通りに複数の値がコンソールに返され、これらの値を後で使用するためにArrayに保存します。

6月22日7時28分:私が午前問題は、コンソールが4

コンソール出力がどのように見える示した場合に、それが唯一の店舗一つの値、私は値を格納しようとするということです:56.173 zar.myapp I /のSystem.out:値:354

6月22日07:28:56.193 zar.myapp I /のSystem.out:値:858

6月22日07:28:56.213 zar.myapp I/System.out:値:989

06-22 07:28:56.213 z ar.myapp I /のSystem.out:値:789

コード:

ArrayList XYcoords = new ArrayList(); 

switch (event.getAction()) { 
case MotionEvent.ACTION_DOWN: 

return true; 
case MotionEvent.ACTION_MOVE: 

    ///Single value for each finger movement. 
    DotView endView = getChildForTouch((TableLayout) v, x, y); 

    XYcoords.add(endView.getId()); 

break; 

case MotionEvent.ACTION_UP: 
    ///I tried adding them from here as well. 

///When I check the size of `XYcoords` it allways return 1 
System.out.println("Array Size: " + XYcoords.size()); 

break; 

DotViewクラス:ユニークなIDを割り当てることがDotview.setId(i);:私は私が呼ぶ私のテーブルグリッドを構築し、私のMainActivity各セル(検証済み)に送信する。 (私は、関連するコードを共有):

private static class DotView extends View { 

     private static final int DEFAULT_SIZE = 100; 
     private Paint mPaint = new Paint(); 
     private Rect mBorderRect = new Rect(); 
     private Paint mCirclePaint = new Paint(); 
     private int mRadius = DEFAULT_SIZE/4; 
     int id; 

     public DotView(Context context) { 
      super(context); 
      mPaint.setStrokeWidth(2.0f); 
      mPaint.setStyle(Style.STROKE); 
      mPaint.setColor(Color.RED); 
      mCirclePaint.setColor(Color.CYAN); 
     } 

     @Override 
     protected void onDraw(Canvas canvas) { 
      canvas.drawColor(Color.parseColor("#0099cc")); 
      mBorderRect.left = 0; 
      mBorderRect.top = 0; 
      mBorderRect.right = getMeasuredWidth(); 
      mBorderRect.bottom = getMeasuredHeight(); 
      canvas.drawRect(mBorderRect, mPaint); 
      canvas.drawCircle(getMeasuredWidth()/2, getMeasuredHeight()/2, 
        mRadius, mCirclePaint); 
     } 


     public void setId(Int id){ 
      this.id = id; 
     } 
     public int getId() 
     { 
      return this.id; 
     } 

    } 

getChildForTouch

private DotView getChildForTouch(TableLayout table, float x, float y) { 
        final int childWidth = ((TableRow) table.getChildAt(0)) 
          .getChildAt(0).getWidth(); 
        final int childHeight = ((TableRow) table.getChildAt(0)) 
          .getChildAt(0).getHeight(); 


        // find out the row of the child 
        int row = 0; 
        do { 
         if (y > childHeight) { 
          row++; 
          y -= childHeight; 
         } else { 
          break; 
         } 
        } while (y > childHeight); 
        int column = 0; 
        do { 
         if (x > childWidth) { 
          column++; 
          x -= childWidth; 
         } else { 
          break; 
         } 
        } while (x > childWidth); 
        return (DotView) ((TableRow) table.getChildAt(row)) 
          .getChildAt(column); 
       } 

詳細コードは、要求に応じて供給することができます。事前に

おかげ

+0

'' 'endView.getId()' ''はビューIDを返すか、その値を生成するメソッドですか?その単一の値を計算する方法であれば、異なる値を返すようにしてください。 – danypata

+0

カスタムメソッド 'endView.getId()'はXとYを使って、キャンバスに描画された各図形に割り当てられた一意のIDを取得します。そして、はい、それは異なる値を返します。上記の出力を参照してください。 – andre3wap

+0

配列に含まれる1つの値は、生成した値ですか(コンソールに表示されますか?)。 – danypata

答えて

0

私が午前問題は、コンソールが4

私は」を示している場合、私は値を格納しようとすると、それだけ 店舗一つの値ということですonTouch()コールバック内にXYcoordsリストを作成していると仮定すると、現在のタッチイベントに対応するサイズが1になります。ユーザーが指を動かすと、on touch()は別のタッチイベントで再び呼び出されます。この時点で XYcoordsリストが1つのエントリなどで作成されます。

これを解決するには、 XYcoordsは、onTouch()コールバックのの外側にあるの初期化リストをクラス内のフィールドのようにリストします。この方法では、タッチイベントが発生するたびに再作成しません。

補足として、現在のコードでは、ユーザーが指を動かしたときにユーザーがタッチしたDotViewsをリストに格納しようとしています。この場合、MotionEvent.ACTION_MOVEのXYcoords.add(endView.getId())を何度もやりたいとは思わないでしょう。何百もの重複したエントリがあることになります。単一のDotView内でトリガーされる)。代わりに、重複を許可しない:あなたは(XYcoordsで情報をどこか他の保存)を使用する必要がありMotionEvent.ACTION_UPための場合

if (XYcoords.size() != 0) { 
    // check to see if we aren't trying to add the same DotView reference 
    // (meaning we are still inside the same DotView) 
    int lastId = XYcoords.get(XYcoords.size() - 1); 
    if (lastId != endView.getId()) { 
     // not the same DotView so add it 
     XYcoords.add(endView.getId()); 
    } 
} else { 
    XYcoords.add(endView.getId()); // first event, must add it 
} 

XYcoords内のデータと明確それので、次回ユーザーが開始DotViewsに触れると、新しい履歴があります(XYcoordsの項目はありません)。

+1

もう一度保存されました、ありがとうございました。 – andre3wap