我一直在使用扩展视图处理一个非常简单的小应用程序。 问题是我找不到我的onTouchEvent中的内容。 我已经明白我要将压力点(x和y)与元素进行比较,看看它可能是哪一个。
但是... 我用:
声明了一个矩形Paint color= new Paint();
color.setColor(Color.BLACK);
rectF = new RectF(0.0f, 0.0f, 1.0f, 0.5f) ;
canvas.drawRect(rectF, color);
到目前为止一切顺利,但在onTouchEvent函数中
public boolean onTouchEvent(MotionEvent event) {
int action = event.getAction() ;
float x = event.getX() ;
float y = event.getY() ;
switch(action) {
case MotionEvent.ACTION_DOWN:
if(rectF().contains(x, y)) {
// Something should happen
}
}
invalidate();
return true ;
}
我将rectF设置为0-1范围内的某种相对点,但是根据屏幕大小,X和Y从事件的范围是0到更高。
我可以轻松转换其中任何一个值吗?
修改
认为某人对最终解决方案感兴趣...
public boolean onTouchEvent(MotionEvent event) {
int action = event.getAction() ;
float x = event.getX() ;
float y = event.getY() ;
int width = this.getWidth() ;
int height = this.getHeight() ;
switch(action) {
case MotionEvent.ACTION_DOWN:
if(rectF().contains(x/width, y/height)) {
// Something should happen
}
}
return true ;
}
答案 0 :(得分:2)
触摸点和RectF的值必须在相同的参考标度上才能正确比较。这意味着如果您声明RectF
使用相对大小(0-1),您将需要:
1:按屏幕尺寸标准化MotionEvent
位置
OR 2:根据您的实际屏幕尺寸“{归一化”RectF
尺寸。
我认为1通常是首选,因为它允许您根据相对布局定义您的rects,与实际屏幕大小无关,并即时转换事件位置。
像这样:rectF.contains(x/screenWidth, y/screenHeight);
您可以在“活动”中调用“Display display = getWindowManager().getDefaultDisplay()
”,然后拨打display.getWidth()
或display.getHeight()