2

現在、ノードとして六角形を含むマップを描画しています。NodeViewクラスを作成して、呼び出されたときにCanvasに画像を描画しました。(この画像を見ると六角形のレイアウトが表示されます)すべてのノードには独自のNodeViewがあります(それぞれに他のプロパティがあるため)

私がやりたいのは、六角形が(ActionUpで)タッチされると、その画像を別の六角形の画像に再描画することです

これまでのところ、これは私が持っているものです

public boolean onTouchEvent(MotionEvent event) {
    int eventaction = event.getAction();

    switch (eventaction) {
        case MotionEvent.ACTION_DOWN: 
            // finger touches the screen
            break;

        case MotionEvent.ACTION_MOVE:
            // finger moves on the screen
            break;

        case MotionEvent.ACTION_UP:   
            // finger leaves the screen
            Toast toast = Toast.makeText(getContext(), "Button is pressed", 1);
            toast.show();
            //should change the image drawn on this view ONLY
            break;                


    }
    return true;
}

ACTION_UPでタッチした六角形を作成して、画像のみを変更するにはどうすればよいですか?

現在、NodeViewが使用されている場合、onDraw()メソッドを使用して、描画されるはずの六角形に応じて六角形を描画します(さまざまな地形にいくつかあります)。

4

1 に答える 1

0

DOWN イベントでユーザーの指の位置を計算する必要があります。

case MotionEvent.ACTION_DOWN:
  mInitialPosY = event.getX();
  mInitialPosY = event.getY();
  break;

次に、ユーザーが触れているかどうかを確認するために上下に反復できる六角形またはノードの Rects が必要です。

private final int isUserTouchingNode(int x, int y)
{
    //Loop through rects of nodes
    int nodeBeingTouched;
    Rect node; //Rect of you node
    for (int i = 0; i < nodes.length; i++)
    {
        node = nodes[i];
        if (node.contains(x, y))
        {
            return i;
        }
    }
}

次に、on draw メソッドで、どれがタッチされているかを確認し、別の方法で描画できます。ユーザーが画面を押すと、ユーザーが現在タッチしているビューは自動的に無効になります。

MOVE と UP を使用して行うこともできるため、ユーザーがビューを開始/移動したかどうかを確認します。

例は次のようなものです:

@Override
public boolean onTouchEvent(final MotionEvent event)
{
    final int action = event.getAction();
    mCurrentPosX = event.getX();
    mCurrentPosY = event.getY();
    switch (action)
    {
        case MotionEvent.ACTION_DOWN:
            mInitialPosY = event.getX();
            mInitialPosY = event.getY();
            mStartingNode = isUserTouchingNode(mInitialPosX, mInitialPosY);
            break;
        case MotionEvent.ACTION_MOVE:

            break;
        case MotionEvent.ACTION_UP:
            mEndingNode = isUserTouchingNode(mCurrentPosX, mCurrentPosY);
            if(mStartingNode == mEndingNode){
                doNodePressed(mEndingNode);//etc...
            }
            break;

    }
    return super.onTouchEvent(event);
}

これは決して完全な作業サンプルではなく、開始するための単なるアイデアです。

于 2013-02-05T10:32:57.750 に答える