Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 查找运动事件结束的视图(按钮)_Java_Android_Android Menu - Fatal编程技术网

Java 查找运动事件结束的视图(按钮)

Java 查找运动事件结束的视图(按钮),java,android,android-menu,Java,Android,Android Menu,问题 我希望创建这样一种效果:第一次按下一个按钮,将其他三个按钮的可见性从“消失”设置为“可见”。在向一个新出现的按钮滑动并结束后,我想开始一个不同的活动 我的问题是,无论我使用何种方法获取视图的位置(使用Rect对象,findNearestTouchable)和位置触摸事件(使用onTouch/手势和动作),它们似乎永远不会匹配,我也永远无法返回我想要的视图 所需功能 一种运动事件,从按下一个按钮开始,到另一个按钮结束,返回它结束的按钮的id/view对象 我的主菜单.xml 有人有什么见

问题

我希望创建这样一种效果:第一次按下一个按钮,将其他三个按钮的可见性从“消失”设置为“可见”。在向一个新出现的按钮滑动并结束后,我想开始一个不同的活动

我的问题是,无论我使用何种方法获取视图的位置(使用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);