点击视图应该在它的画布上重绘

时间:2012-03-11 23:02:32

标签: android android-canvas ontouchevent android-custom-view viewgroup

我正在绘制一个包含六边形的地图,因为它的节点我创建了一个NodeView类,以便在调用时在Canvas上绘制图像。 (你可以看到this image看六边形布局) 每个节点都有自己的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()方法绘制六边形,具体取决于应该绘制的六边形(我有几个用于不同的地形)。

1 个答案:

答案 0 :(得分: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;
        }
    }
}

然后在您的绘图方法中,您可以看到正在触摸哪一个并以不同方式绘制它,当用户按下屏幕时,用户当前正在触摸的视图会自动失效。

您也可以使用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);
}

这绝不是一个完整的工作样本,只是一个让你入门的想法。