检测位图上的触摸

10

问候,

有人知道如何检测用户在画布内按下位图的操作吗?

谢谢。

3个回答

31

你应该按照以下方式进行操作:

public boolean onTouchEvent(MotionEvent event){
    int action = event.getAction();
    int x = event.getX()  // or getRawX();
    int y = event.getY();

    switch(action){
    case MotionEvent.ACTION_DOWN:
        if (x >= xOfYourBitmap && x < (xOfYourBitmap + yourBitmap.getWidth())
                && y >= yOfYourBitmap && y < (yOfYourBitmap + yourBitmap.getHeight())) {
            //tada, if this is true, you've started your click inside your bitmap
        }
        break;
    }
}

这是一个好的开始,但你需要处理MotionEvent.ACTION_MOVEMotionEvent.ACTION_UP以确保你正确地处理用户输入。每次用户按下手指、移动已经在屏幕上的手指或抬起手指时,都会调用onTouchEvent方法。每次事件都携带着手指所在的X和Y坐标。例如,如果你想检查某人是否在你的位图内点击了一下,你应该在ACTION_DOWN时设置一个布尔值来表示触摸始于位图内,并在ACTION_UP时检查是否仍在位图内。


我想使用你的代码,但是不确定如何获取位图的x和y。你能帮我吗? - Shreyash Mahajan
1
如果您正在将位图绘制到画布上,则必须已经知道其X和Y值,因为您必须将它们作为参数传递给canvas.drawBitmap方法。 - Steve Haley
如果我有多个位图,最好的方法是什么? - onexf

3

0

这将检测触摸并检查它是否不透明。如果您的位图不是矩形,则需要此功能。myBitmap只是我使用的一个简单容器类。

private boolean clickOnBitmap(MyBitmap myBitmap, MotionEvent event) {
    float xEnd = myBitmap.originX() + myBitmap.width();
    float yEnd = myBitmap.originY() + myBitmap.height();;


    if ((event.getX() >= myBitmap.originX() && event.getX() <= xEnd) 
    && (event.getY() >= myBitmap.originY() && event.getY() <= yEnd) ) {
        int pixX = (int) (event.getX() - myBitmap.originX());
        int pixY = (int) (event.getY() - myBitmap.originY());
        if (!(myBitmap.getBitmap().getPixel(pixX, pixY) == 0)) {
            return true;
        } else {
            return false;
        }
    }
    return false;
}

这是完整性的触摸代码

    @Override
public boolean onTouch(View v, MotionEvent event) {
    switch (event.getAction()) {
        case MotionEvent.ACTION_DOWN:
            if (clickOnBitmap(dog, event)) {
                Toast.makeText(getContext(), "dog", Toast.LENGTH_SHORT).show();
            } else if (clickOnBitmap(mouse,event)) {
                Toast.makeText(getContext(), "mouse", Toast.LENGTH_SHORT).show();
            }
        return true;
        case MotionEvent.ACTION_OUTSIDE:
        case MotionEvent.ACTION_UP:
        case MotionEvent.ACTION_CANCEL:
            return true;
    }
    return false;
}  

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接