Java 查找运动事件结束的视图(按钮)
问题 我希望创建这样一种效果:第一次按下一个按钮,将其他三个按钮的可见性从“消失”设置为“可见”。在向一个新出现的按钮滑动并结束后,我想开始一个不同的活动 我的问题是,无论我使用何种方法获取视图的位置(使用Rect对象,findNearestTouchable)和位置触摸事件(使用onTouch/手势和动作),它们似乎永远不会匹配,我也永远无法返回我想要的视图 所需功能 一种运动事件,从按下一个按钮开始,到另一个按钮结束,返回它结束的按钮的id/view对象 我的主菜单.xmlJava 查找运动事件结束的视图(按钮),java,android,android-menu,Java,Android,Android Menu,问题 我希望创建这样一种效果:第一次按下一个按钮,将其他三个按钮的可见性从“消失”设置为“可见”。在向一个新出现的按钮滑动并结束后,我想开始一个不同的活动 我的问题是,无论我使用何种方法获取视图的位置(使用Rect对象,findNearestTouchable)和位置触摸事件(使用onTouch/手势和动作),它们似乎永远不会匹配,我也永远无法返回我想要的视图 所需功能 一种运动事件,从按下一个按钮开始,到另一个按钮结束,返回它结束的按钮的id/view对象 我的主菜单.xml 有人有什么见
有人有什么见解吗
编辑:
测试以下各项:
产生以下LogCat输出:
07-06 01:12:58.245:TOUCH X是(20965):394.0
07-06 01:12:58.245:TOUCH Y是(20965):297.0
7-06 01:12:58.245:4中心X是(20965):392.0
07-06 01:12:58.245:4中心Y是(20965):219.0
2007-06 01:12:58.245:2中心X为(20965):240.0
07-06 01:12:58.250:2中心Y为(20965):219.0
07-06 01:12:58.250:3中心X为(20965):95.0
07-06 01:12:58.250:3中心Y为(20965):219.0
2007-06 01:12:58.250:1中心X为(20965):240.0
07-06 01:12:58.250:1中心Y为(20965):345.0
在手势侦听器中,检查MotionEvent何时为MotionEvent.ACTION\u,并使用coords event.getX()和event.getY(),然后确定这些坐标处的视图
public boolean onTouch(View view, MotionEvent event) {
if (event == MotionEvent.ACTION_UP) {
int x = event.getX();
int y = event.getY();
//find what view is at x, y
}
}
当按下第一个按钮时(使用onClick或当运动事件为ACTION\u DOWN时),您会触发一些标志。当他们举起手指时,上面的人就会被解雇
编辑:确保使用event.getY()而不是event.getRawY()。计算是不同的,并且按钮的边界的计算方式与getY()获取子视图的方式相同,前提是可以通过下面的方法在线性布局或网格布局内进行 |*|我已经向您展示了如果视图垂直放置在LinearLayout中,如何获取子视图
NamVyuVar.setOnTouchListener(new View.OnTouchListener()
{
@Override
public boolean onTouch(View view, MotionEvent MsnEvtPsgVar)
{
switch (MsnEvtPsgVar.getActionMasked())
{
case MotionEvent.ACTION_DOWN:
Log.d("TAG", "onTouch: ACTION_DOWN");
break;
case MotionEvent.ACTION_MOVE:
LinearLayout NamLloVav = (LinearLayout)view;
float SubVyuHytVal = NamLloVav.getChildAt(0).getHeight();
float TchPntYcoVal = MsnEvtPsgVar.getY();
int NamIdxVal = (int) (TchPntYcoVal / SubVyuHytVal);
View NamIdxVyuVav = NamLloVav.getChildAt(NamIdxVal)
// CodTodo With the Indexed View NamIdxVyuVav :
break;
case MotionEvent.ACTION_UP:
Log.d("TAG", "onTouch: ACTION_UP");
break;
}
return true;
}
});
|*|类似地,如果视图水平放置在直线内,则要获取子视图,请在3线以下更改布局
float SubVyuWdtVal = NamLloVav.getChildAt(0).getWidth();
float TchPntXcoVal = MsnEvtPsgVar.getX();
int NamIdxVal = (int) (TchPntXcoVal / SubVyuWdtVal);
|*|同样的技术也可以应用于网格布局。我已经尝试过了,不幸的是,它也有同样的问题;事件的x和y似乎与视图的co-ords不匹配,即使ACTION_UP正好在它们上面触发。您是否有一个示例,说明为触摸发送了哪些值,以及当时视图的实际边界是什么?我看到的问题是,手势检测器没有连接到任何东西。您从未将gestureDetector附加到视图。经过一些测试,发现问题出在event.getRawY()的使用上。尝试使用event.getRawY()和event.getY()。它们返回不同的值。event.getY()实际上返回了正确的值,该值在矩形的边界内。我看到了getY和getRawY之间的区别,在我看来,前者相对于开始触摸,后者相对于整个屏幕。在动作上测试了getY之后,我仍然没有得到与动作上的getY或getRawY的正确匹配。getY返回一个负数;getRawY返回的值与原始帖子中的值相同,但不正确。谢谢你的帮助,虽然我搞不懂这一点让人沮丧,谢谢你回答了一个非常古老的问题,我已经很久没有做过任何android开发了,但这让我知道这是否可行。
public boolean onTouch(View view, MotionEvent event) {
if (event == MotionEvent.ACTION_UP) {
int x = event.getX();
int y = event.getY();
//find what view is at x, y
}
}
NamVyuVar.setOnTouchListener(new View.OnTouchListener()
{
@Override
public boolean onTouch(View view, MotionEvent MsnEvtPsgVar)
{
switch (MsnEvtPsgVar.getActionMasked())
{
case MotionEvent.ACTION_DOWN:
Log.d("TAG", "onTouch: ACTION_DOWN");
break;
case MotionEvent.ACTION_MOVE:
LinearLayout NamLloVav = (LinearLayout)view;
float SubVyuHytVal = NamLloVav.getChildAt(0).getHeight();
float TchPntYcoVal = MsnEvtPsgVar.getY();
int NamIdxVal = (int) (TchPntYcoVal / SubVyuHytVal);
View NamIdxVyuVav = NamLloVav.getChildAt(NamIdxVal)
// CodTodo With the Indexed View NamIdxVyuVav :
break;
case MotionEvent.ACTION_UP:
Log.d("TAG", "onTouch: ACTION_UP");
break;
}
return true;
}
});
float SubVyuWdtVal = NamLloVav.getChildAt(0).getWidth();
float TchPntXcoVal = MsnEvtPsgVar.getX();
int NamIdxVal = (int) (TchPntXcoVal / SubVyuWdtVal);