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;

然后你需要有你的六边形或节点的矩形,你可以向下/向上迭代以查看用户是否正在触摸它。

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 回答