如果触摸this isometric one这样的不规则形状,如何办理onTouchEvent
?
希望你能帮助我。
答案 0 :(得分:1)
检查来自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
}
答案 1 :(得分:1)
检查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解释了多边形点击测试的算法。
我们的想法是将一条线(称为Ray)从MotionEvent
点投射到多边形,并计算该线与该多边形中线段之间的交点数。如果计数是偶数,则该点在形状之外。如果它是奇数,则该点在形状内。
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;
}
答案 2 :(得分:0)
由您自己编写一些代码来检测给定点(x,y)是否处于不规则形状。
public boolean isInIrregularShape(int x, int y);
您必须以某种方式定义形状。您可能希望在Google上搜索一些库,这些库允许您定义形状并检查给定点是否在形状内。您的x和y点将为event.getX()
和event.getY()
。
答案 3 :(得分:0)
如果您在SurfaceView上将形状绘制为位图,则可以测试所触摸像素的透明度。 Bitmap的像素,即不是SurfaceView的。
例如,使用100,150绘制的位图(左/上的surfaceview坐标):
float x = getX() - 100;
float y = getY() - 150;
int alpha = Color.alpha(myBitmap.getPixel(x, y));
if(alpha == 0)
// not hit!
else
// hit!
注意:这不会使缩放生效,因此您必须知道比例因子,并相应地相乘,如果您正在缩放它们。