2010-03-15 105 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; 
}