回答
檢查是否從MotionEvent
座標是你的外形內:
@Override
public boolean onTouchEvent(MotionEvent event)
{
final float x = event.getX();
final float y = event.getY();
if (isInside(x, y))
{
// do something
}
return true;
}
boolean isInside(float x, float y)
{
// TODO: return true, if (x,y) is inside your shape, otherwise return false
}
檢查是否MotionEvent
座標是你的外形內,然後做一個點在多邊形擊中測試。
如果您的等角形狀是具有相同長度的段,並具有所有90度的角度(在評論Geobits作爲校正)菱形,快速測試可以使用Manhatten Distance完成。看看鏈接,圖片更清楚爲什麼這個工程。
int rectSize = 10;
Rectangle diamondBoundingRect = new Rectangle(0,0,rectSize,rectSize);
Point point = new Point(9,9);
int dx = Math.abs(point.x - diamondBoundingRect.center.x);
int dy = Math.abs(point.y - diamondBoundingRect.center.y);
if(dx+dy < rectSize){
//point is inside diamond
}else{
//point is not inside diamond
}
這個測試是不靈活的,但它可能是所有你需要的。
如果你需要更好的東西,this blog post解釋了點在多邊形命中測試的算法。
這個想法是從你的MotionEvent
點將一條線(稱爲Ray)投射到你的多邊形,並計算該線與該多邊形中的線段之間的交點數。如果計數是偶數,則該點在形狀之外。如果它是奇數的話,那麼這個點就在這個形狀中。
Wikipedia has a nice picture和更多的細節,以幫助您瞭解這種做法的邏輯。在獲得該
精礦這個下一部分前工作,因爲它可以根據您的需求證明是不必要的。
在onTouchEvent
發送給您的點進行採樣。該設備只是以某個預定的速率給你點數和方向。用戶移動手指的速度越快,採樣率無法跟上的細節越少。
所以,如果你想了解更多的細節,你就必須interpolate。這是一種先進的方式,你需要猜測用戶在哪裏用一些花式的數學方法來刷他的手指。在過去,餘弦插值對我來說效果很好,因爲它在速度和結果之間取得了很好的平衡。
編輯:
下面是一些代碼,我用親手爲點在多邊形命中測試。
public boolean isPointInsidePolygon(double x, double y){
//pointAry holds the polygon's vertices.
int polySides = this.pointAry.Length;
//need at lest 3 vertices to create a polygon.
if (polySides < 3)
{
return false;
}
int j = polySides - 1;
boolean oddNodes = false;
for (int i = 0; i < polySides; i++)
{
Point pi = this.pointAry[i];
Point pj = this.pointAry[j];
if (pi.y < y && pj.y >= y || pj.y < y && pi.y >= y)
{
if (pi.x + (y - pi.y)/(pj.y - pi.y) * (pj.x - pi.x) < x)
{
oddNodes = !oddNodes;
}
}
j = i;
}
return oddNodes;
}
這是由你來編寫一些代碼,檢測給定點(x,y)是否在你的不規則形狀。
public boolean isInIrregularShape(int x, int y);
您必須以某種方式定義形狀。您可能希望在Google上搜索某些庫,以便定義一個形狀並檢查給定點是否位於該形狀內。您的x和y點將是event.getX()
和event.getY()
。
如果您將圖形繪製爲SurfaceView上的位圖,則只需測試所觸及的像素的透明度即可。位圖的像素,即不是SurfaceView的。
例如,在100,150(surfaceview COORDS左/頂)繪製的位圖:
float x = getX() - 100;
float y = getY() - 150;
int alpha = Color.alpha(myBitmap.getPixel(x, y));
if(alpha == 0)
// not hit!
else
// hit!
注:這並不需要縮放生效,所以你必須要知道的比例因子並且如果你正在繪製它們,則相應地進行相乘。
- 1. 不規則形狀
- 2. Android佈局中的不規則形狀
- 3. 不規則的矩形形狀
- 4. 當新形狀在加工時形成不規則形狀
- 5. Cocos2d不規則形狀精靈
- 6. 不規則形狀碰撞檢測
- 7. 以不規則形狀裁剪圖像
- 8. PDF中的不規則形狀區域
- 9. 造型不規則形狀的按鈕
- 10. 不規則形狀內的點
- 11. Opengl不規則形狀顏色填充
- 12. 創建傾斜/不規則形狀div
- 13. 不規則形狀的DOM元素
- 14. OpenCV不規則形狀質心
- 15. 不規則的形狀識別opencv
- 16. CSS中的不規則形狀
- 17. 形狀不規則的UIBezierPath填充
- 18. 與圖像碰撞(不規則形狀)
- 19. 如何在Android佈局中佈局不規則形狀
- 20. 可以處理Android上不規則形狀的事件嗎?
- 21. Android應用程序界面上的不規則形狀按鈕
- 22. Android中不規則形狀按鈕佈局的任何示例?
- 23. 地圖上的規則形狀多邊形Android地圖單擊
- 24. 將矩形圖像變形爲不規則形狀
- 25. ontouch在android繪製矩形
- 26. 使用不規則形狀的CSS圓形菜單
- 27. 將不規則形狀擬合成圓形
- 28. 將不規則形狀裁剪成矩形
- 29. iOS石英2D圖形填充不規則形狀模糊
- 30. 帶有圖形不規則形狀的網格
您是否已將自己的形狀繪製到屏幕上?如果是的話你是怎麼做到的? – FoamyGuy
作爲surfaceView上的位圖。 – Stupe
@FoamyGuy繪製一個形狀並對它進行命中測試是兩件非常不同的事情。 –