Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/http/4.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
Android onTouch总是显示对第二个事件的反应_Android_Android Custom View_Touch Event_Ontouchlistener - Fatal编程技术网

Android onTouch总是显示对第二个事件的反应

Android onTouch总是显示对第二个事件的反应,android,android-custom-view,touch-event,ontouchlistener,Android,Android Custom View,Touch Event,Ontouchlistener,在我的应用程序中,我在活动中有一个自定义视图。 为了检测触摸事件,我在这两个事件中都使用了onTouchEvent方法 自定义视图:onTouchEvent方法基本上只是标记被触摸的对象 @Override public boolean onTouchEvent(MotionEvent event) { int maskedAction = event.getActionMasked(); switch (maskedAction) {

在我的应用程序中,我在活动中有一个自定义视图。 为了检测触摸事件,我在这两个事件中都使用了onTouchEvent方法

自定义视图:onTouchEvent方法基本上只是标记被触摸的对象

@Override
    public boolean onTouchEvent(MotionEvent event) {
        int maskedAction = event.getActionMasked();

        switch (maskedAction) {
        case MotionEvent.ACTION_DOWN:
            touchedXY[0] = event.getX();
            touchedXY[1] = event.getY();
            mMatrix.mapPoints(touchedXY);                  // this is just for
            event.setLocation(touchedXY[0], touchedXY[1]); // rotation purposes
            for(int i = 0; i < mPoints[i]; i++){
                    mPoints[i].isSelected(setIsSelected(touchedXY)); //using method to
                                                                     //check if point
                                                                     //is selected          
            }
            break;
        default:
            return false;
        }
        invalidate();
        return true;
    }
活动:如果触摸到对象,则活动底部应显示一个线性布局,并显示触摸点的数量

int key = 0;

@Override
    public boolean onTouch(View v, MotionEvent event) {
        // get masked (not specific to a pointer) action
        int maskedAction = event.getActionMasked();

        switch (maskedAction) {
        case MotionEvent.ACTION_DOWN:
            List<AddressPoint> selectedPoints = Arrays.asList(mPoints);

            if (key == 0) {
                if (selectedPoints.size() > 0) {
                    key = 1;
                    test.setText(String.valueOf(selectedPoints.size()));
                    popup.setVisibility(View.VISIBLE);

                } else {
                    test.setText(String.valueOf(selectedPoints.size()));
                }
            } else {
                if (selectedPoints.size() > 0) {
                    test.setText(String.valueOf(selectedPoints.size()));
                } else {
                    key = 0;
                    popup.setVisibility(View.GONE);

                }
            }
            break;
        default:
            return false;
        }
        return false;
    }
因此,它工作正常,但行为不符合要求。该活动似乎仅对第二个touchevent作出反应,并每秒钟刷新一次touchevent。 例如:

TouchEvent=4点->活动不显示弹出窗口。 TouchEvent=3点->活动显示带有数字4的弹出窗口 TouchEvent=1点->活动显示带有数字3的弹出窗口 . . 等等 .
我希望你能帮助我,我感谢你的帮助

问题似乎很严重,因为在保存点之前,您的视图已重新绘制


因此,最好在onTouch onTouchEvent中保存点数,然后调用另一个函数来相应地设置文本。

为什么要覆盖Activity.onTouchEvent?在我的CustomView中,我需要标记一些被触摸的点,在我的Activity中,我希望在触摸点时对布局做出反应。所以我必须重写它,因为它不会侦听更改。使用自定义侦听器接口,我不知道你的意思。我得到了正确的数据。我的应用程序正确地计算了点击点,只有LinearLayout以奇怪的顺序显示信息。当您在自定义视图中检测到任何触摸事件时,只需调用一些侦听器,就像按钮调用OnClickListener一样。onClick methodpopup就是自定义LinearLayout。我不能在我的弹出对象上使用此方法。请查看更改后的答案,希望对您有所帮助,我仍然不明白。我的意思是,LinearLayout弹出窗口会显示信息,但它的顺序很奇怪。我甚至没有画线性布局。我认为问题在于,在显示点后,您更改了数据,因此显示的顺序总是落后一步。什么是MPoint以及如何设置它们?最好只使用onTouchEvent函数保存点,然后调用另一个相应设置文本的函数。