2010-03-15 77 views

回答

28

对我来说是伟大的你应该工作的东西,像这样:

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; 
    } 
} 

这是一个开始,但你需要处理case MotionEvent.ACTION_MOVEcase MotionEvent.ACTION_UP,以确保您妥善处理用户输入。每次用户都会调用onTouchEvent方法:放下手指,移动屏幕上的手指或抬起手指。每次事件携带手指所在的X和Y坐标。例如,如果您想检查是否有人在您的位图内部点击,您应该执行一些操作,例如设置一个布尔值,使触摸在ACTION_DOWN位图内开始,然后检查ACTION_UP是否仍位于位图内部。

+0

我想用你的代码,但不知道如何得到位图的X和Y触摸代码。你能帮我吗? – 2012-09-06 12:57:01

+0

如果您要将位图绘制到画布上,则必须已知其X和Y值,因为必须将这些值作为参数传递给'canvas.drawBitmap'方法。 – 2012-09-12 17:01:32

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; 
}